javax.websocket istemcisi basit bir örnek


104

Birisi bana websocket istemcisinin kullanımıyla ilgili çok basit bir örnek verebilir javax.websocketmi?

Websocket'e bağlanmak (ws: //socket.example.com: 1234), mesaj göndermek (kanal eklemek) ve mesajları dinlemek istiyorum. Tüm mesajlar (gönderilen ve dinlenen) JSON formatındadır.

Ve btw bu kitaplık basit websocket iletişimi için en iyisi mi?

Yanıtlar:


122

javax.websocketBurada kullanarak harika bir örnek buldum :

http://www.programmingforliving.com/2013/08/jsr-356-java-api-for-websocket-client-api.html

Burada, yukarıda bağlantısı verilen örneğe dayalı kod:

TestApp.java:

package testapp;

import java.net.URI;
import java.net.URISyntaxException;

public class TestApp {

    public static void main(String[] args) {
        try {
            // open websocket
            final WebsocketClientEndpoint clientEndPoint = new WebsocketClientEndpoint(new URI("wss://real.okcoin.cn:10440/websocket/okcoinapi"));

            // add listener
            clientEndPoint.addMessageHandler(new WebsocketClientEndpoint.MessageHandler() {
                public void handleMessage(String message) {
                    System.out.println(message);
                }
            });

            // send message to websocket
            clientEndPoint.sendMessage("{'event':'addChannel','channel':'ok_btccny_ticker'}");

            // wait 5 seconds for messages from websocket
            Thread.sleep(5000);

        } catch (InterruptedException ex) {
            System.err.println("InterruptedException exception: " + ex.getMessage());
        } catch (URISyntaxException ex) {
            System.err.println("URISyntaxException exception: " + ex.getMessage());
        }
    }
}

WebsocketClientEndpoint.java:

package testapp;

import java.net.URI;
import javax.websocket.ClientEndpoint;
import javax.websocket.CloseReason;
import javax.websocket.ContainerProvider;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.WebSocketContainer;

/**
 * ChatServer Client
 *
 * @author Jiji_Sasidharan
 */
@ClientEndpoint
public class WebsocketClientEndpoint {

    Session userSession = null;
    private MessageHandler messageHandler;

    public WebsocketClientEndpoint(URI endpointURI) {
        try {
            WebSocketContainer container = ContainerProvider.getWebSocketContainer();
            container.connectToServer(this, endpointURI);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * Callback hook for Connection open events.
     *
     * @param userSession the userSession which is opened.
     */
    @OnOpen
    public void onOpen(Session userSession) {
        System.out.println("opening websocket");
        this.userSession = userSession;
    }

    /**
     * Callback hook for Connection close events.
     *
     * @param userSession the userSession which is getting closed.
     * @param reason the reason for connection close
     */
    @OnClose
    public void onClose(Session userSession, CloseReason reason) {
        System.out.println("closing websocket");
        this.userSession = null;
    }

    /**
     * Callback hook for Message Events. This method will be invoked when a client send a message.
     *
     * @param message The text message
     */
    @OnMessage
    public void onMessage(String message) {
        if (this.messageHandler != null) {
            this.messageHandler.handleMessage(message);
        }
    }

    /**
     * register message handler
     *
     * @param msgHandler
     */
    public void addMessageHandler(MessageHandler msgHandler) {
        this.messageHandler = msgHandler;
    }

    /**
     * Send a message.
     *
     * @param message
     */
    public void sendMessage(String message) {
        this.userSession.getAsyncRemote().sendText(message);
    }

    /**
     * Message handler.
     *
     * @author Jiji_Sasidharan
     */
    public static interface MessageHandler {

        public void handleMessage(String message);
    }
}

1
Merhaba, websocketServer sürekli bir mesaj akışı gönderiyorsa ve websocketClient'ın mesajları tek tek tüketmesi gerekiyorsa bu kod nasıl çalıştırılır? Kodu yaklaşık bir dakika çalıştırdıktan sonra "Kodu çözülen kısa mesaj çıktı arabelleği için çok büyüktü ve uç nokta kısmi mesajları desteklemiyor"
hatasını alıyorum

Org.java-websocket'i maven-import etmeyi unutmayın.
Albert Hendriks

9
Bu kod şu hatayla başarısız oluyor: Bir uygulama sınıfı bulunamadı.
Kirk Şefchik

2
@deathgaze javax.websocket api sadece spesifikasyonun tam uygulanmasına sahip olmamasıdır, tyrus-standalone-client-1.9.jar jar dosyasını almanız ve probleminizi çözmesi gereken aynı örneği denemeniz gerekebilir. Örneğimle test ettim ve iyi çalışıyor. Umarım bu sana yardımcı olur.
SRK

@Martin Aç'ta nasıl mesaj gönderebilirim. Örnek: Abone olmak için web soketini açarak '{"type": "abone", "symbol": "AAPL"}' göndermem gerekiyor.
Buddhika

40

TooTallNate'in basit bir istemci tarafı vardır https://github.com/TooTallNate/Java-WebSocket

Sadece java_websocket.jar dosyasını dist klasörüne projenize ekleyin.

 import org.java_websocket.client.WebSocketClient;
 import org.java_websocket.drafts.Draft_10;
 import org.java_websocket.handshake.ServerHandshake;
 import org.json.JSONException;
 import org.json.JSONObject;

  WebSocketClient mWs = new WebSocketClient( new URI( "ws://socket.example.com:1234" ), new Draft_10() )
{
                    @Override
                    public void onMessage( String message ) {
                     JSONObject obj = new JSONObject(message);
                     String channel = obj.getString("channel");
                    }

                    @Override
                    public void onOpen( ServerHandshake handshake ) {
                        System.out.println( "opened connection" );
                    }

                    @Override
                    public void onClose( int code, String reason, boolean remote ) {
                        System.out.println( "closed connection" );
                    }

                    @Override
                    public void onError( Exception ex ) {
                        ex.printStackTrace();
                    }

                };
 //open websocket
 mWs.connect();
 JSONObject obj = new JSONObject();
 obj.put("event", "addChannel");
 obj.put("channel", "ok_btccny_ticker");
 String message = obj.toString();
 //send message
 mWs.send(message);

// ve websocket'i kapatmak için

 mWs.close();

4
Eclipse kullanarak Windows 7, Windows 8 ve OS X dağ aslanında çalıştı, sunucu Ubuntu idi.
TCassells

1
javax kütüphaneleri yerine neden bu kütüphaneyi seçersiniz?
BvuRVKyUVlViVIc7

2
çünkü açıkça daha basit
Kyle Luke

4
wss protokolünü (güvenli ws) desteklemek için hangi değişikliklere ihtiyaç vardır?
Mihailo Stupar

2
Harika bir kütüphane, ancak wss ile sorunları var. Projenin birkaç açık sorunu var ve geliştirici artık zamanı olmadığını söylüyor.
SiKing

18

Arun Gupta'dan bu Java EE 7 örneklerine bir göz atın.

Bunu çatallı github .

Ana

/**
 * @author Arun Gupta
 */
public class Client {

    final static CountDownLatch messageLatch = new CountDownLatch(1);

    public static void main(String[] args) {
        try {
            WebSocketContainer container = ContainerProvider.getWebSocketContainer();
            String uri = "ws://echo.websocket.org:80/";
            System.out.println("Connecting to " + uri);
            container.connectToServer(MyClientEndpoint.class, URI.create(uri));
            messageLatch.await(100, TimeUnit.SECONDS);
        } catch (DeploymentException | InterruptedException | IOException ex) {
            Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

ClientEndpoint

/**
 * @author Arun Gupta
 */
@ClientEndpoint
public class MyClientEndpoint {
    @OnOpen
    public void onOpen(Session session) {
        System.out.println("Connected to endpoint: " + session.getBasicRemote());
        try {
            String name = "Duke";
            System.out.println("Sending message to endpoint: " + name);
            session.getBasicRemote().sendText(name);
        } catch (IOException ex) {
            Logger.getLogger(MyClientEndpoint.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @OnMessage
    public void processMessage(String message) {
        System.out.println("Received message in client: " + message);
        Client.messageLatch.countDown();
    }

    @OnError
    public void processError(Throwable t) {
        t.printStackTrace();
    }
}

Ayrı olarak gönderilen websocket bağımlılığını gerektirdiğini belirtmelisiniz
Java Ana Sayfa


1

Bu kitaplığı kullanın org.java_websocket

Bu kitaplığı build.gradle içinde içe aktarmanız gereken ilk şey

repositories {
 mavenCentral()
 }

ardından uygulamayı bağımlılığa ekleyin {}

implementation "org.java-websocket:Java-WebSocket:1.3.0"

O zaman bu kodu kullanabilirsiniz

Etkinliğinizde Websocketclient için nesne bildirin

private WebSocketClient mWebSocketClient;

daha sonra geri arama için bu yöntemi ekleyin

 private void ConnectToWebSocket() {
URI uri;
try {
    uri = new URI("ws://your web socket url");
} catch (URISyntaxException e) {
    e.printStackTrace();
    return;
}

mWebSocketClient = new WebSocketClient(uri) {
    @Override
    public void onOpen(ServerHandshake serverHandshake) {
        Log.i("Websocket", "Opened");
        mWebSocketClient.send("Hello from " + Build.MANUFACTURER + " " + Build.MODEL);
    }

    @Override
    public void onMessage(String s) {
        final String message = s;
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                TextView textView = (TextView)findViewById(R.id.edittext_chatbox);
                textView.setText(textView.getText() + "\n" + message);
            }
        });
    }

    @Override
    public void onClose(int i, String s, boolean b) {
        Log.i("Websocket", "Closed " + s);
    }

    @Override
    public void onError(Exception e) {
        Log.i("Websocket", "Error " + e.getMessage());
    }
};
mWebSocketClient.connect();

}


-2

Projemde Spring 4.2 var ve birçok SockJS Stomp uygulaması genellikle Spring Boot uygulamalarıyla iyi çalışıyor. Baeldung'un bu uygulaması işe yaradı (benim için Bahar 4.2'den 5'e değişmeden). Blogunda bahsedilen bağımlılıkları kullandıktan sonra, bana hala ClassNotFoundError verdi. Düzeltmek için aşağıdaki bağımlılığı ekledim.

<dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.2.3.RELEASE</version>
    </dependency>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.