Contoh sederhana klien javax.websocket

104

Bisakah seseorang memberi saya contoh yang sangat sederhana dari klien websocket yang digunakan javax.websocket?

Saya ingin terhubung ke websocket (ws: //socket.example.com: 1234), mengirim pesan (menambahkan saluran) dan mendengarkan pesan. Semua pesan (dikirim & didengarkan) dalam format JSON.

Dan btw apakah library ini yang terbaik untuk komunikasi websocket sederhana?

Martin
sumber

Jawaban:

120

Saya telah menemukan contoh yang bagus menggunakan di javax.websocketsini:

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

Berikut kode berdasarkan contoh yang ditautkan di atas:

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);
    }
}
Martin
sumber
1
Hai, bagaimana cara membuat kode ini berfungsi jika websocketServer mengirimkan aliran pesan yang berkelanjutan dan websocketClient perlu menggunakan pesan satu per satu? Saya mendapatkan kesalahan "Pesan teks yang didekodekan terlalu besar untuk buffer keluaran dan titik akhir tidak mendukung sebagian pesan" setelah menjalankan kode selama sekitar satu menit
firstpostcommenter
Pastikan untuk maven-import org.java-websocket.
Albert Hendriks
9
Kode ini gagal dengan kesalahan: Tidak dapat menemukan kelas implementasi.
Kirk Sefchik
2
@deathgaze javax.websocket api hanya spesifikasinya tidak memiliki implementasi penuh Anda mungkin perlu mengambil file jar tyrus-standalone-client-1.9.jar dan coba contoh yang sama yang seharusnya menyelesaikan masalah Anda. saya menguji dengan contoh saya dan berfungsi dengan baik. berharap ini akan membantu Anda.
SRK
@Martin Bagaimana saya bisa mengirim pesan di Open. Contoh: Saya perlu mengirim '{"type": "subscribe", "symbol": "AAPL"}' saat membuka websocket untuk berlangganan.
Buddhika
40

TooTallNate memiliki sisi klien sederhana https://github.com/TooTallNate/Java-WebSocket

Cukup tambahkan java_websocket.jar di folder dist ke dalam proyek Anda.

 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);

// dan untuk menutup websocket

 mWs.close();
TCassells
sumber
4
Bekerja di Windows 7, windows 8 dan OS X mountain lion menggunakan eclipse, servernya adalah Ubuntu.
TCassells
1
mengapa Anda memilih perpustakaan ini daripada yang javax?
BvuRVKyUVlViVIc7
2
karena itu jelas lebih sederhana
Kyle Luke
4
perubahan apa yang diperlukan untuk mendukung protokol wss (secure ws)?
Mihailo Stupar
2
Perpustakaan yang bagus, tetapi memiliki masalah dengan wss. Proyek ini memiliki beberapa masalah terbuka, dan pengembang berkomentar bahwa dia tidak punya waktu lagi.
SiKing
18

Lihat contoh Java EE 7 dari Arun Gupta ini.

Saya mem- forknya di github .

Utama

/**
 * @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();
    }
}
Koekiebox
sumber
Anda harus menyebutkan bahwa itu membutuhkan ketergantungan websocket yang dikirim secara terpisah
Java Main
1

Gunakan pustaka ini org.java_websocket

Hal pertama yang harus Anda impor pustaka itu dalam build.gradle

repositories {
 mavenCentral()
 }

lalu tambahkan implementasi dalam dependensi {}

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

Kemudian Anda dapat menggunakan kode ini

Dalam aktivitas Anda, deklarasikan objek untuk Websocketclient seperti

private WebSocketClient mWebSocketClient;

lalu tambahkan metode ini untuk callback

 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();

}

Muhammed Fasil
sumber
-2

Saya memiliki Spring 4.2 dalam proyek saya dan banyak implementasi SockJS Stomp biasanya bekerja dengan baik dengan implementasi Spring Boot. Implementasi dari Baeldung ini berhasil (bagi saya tanpa mengubah dari Spring 4.2 ke 5). Setelah Menggunakan dependensi yang disebutkan di blognya, saya masih diberi ClassNotFoundError. Saya menambahkan ketergantungan di bawah ini untuk memperbaikinya.

<dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.2.3.RELEASE</version>
    </dependency>
veritas
sumber