websockets org ejemplo cliente java websocket

org - Ejemplo simple del cliente javax.websocket



websocket javascript (6)

¿Puede alguien proporcionarme un ejemplo muy simple de cliente websocket usando javax.websocket ?

Quiero conectarme a websocket (ws: //socket.example.com: 1234), enviar un mensaje (agregar canal) y escuchar mensajes. Todos los mensajes (enviados y escuchados) están en formato JSON.

¿Y por cierto esta biblioteca es la mejor para la comunicación websocket simple?



Eche un vistazo a estos ejemplos de Java EE 7 de Arun Gupta.

Lo bifurqué en github .

Principal

/** * @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(); } }


He encontrado un gran ejemplo usando javax.websocket aquí:

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

Aquí el código basado en el ejemplo vinculado anteriormente:

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


Tengo Spring 4.2 en mi proyecto y muchas implementaciones de SockJS Stomp generalmente funcionan bien con las implementaciones de Spring Boot. Esta implementación de Baeldung funcionó (para mí sin cambiar de Spring 4.2 a 5). Después de usar las dependencias mencionadas en su blog, todavía me dio ClassNotFoundError. Agregué la dependencia a continuación para solucionarlo.

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


TooTallNate tiene un lado simple del cliente https://github.com/TooTallNate/Java-WebSocket

Simplemente agregue java_websocket.jar en la carpeta dist en su proyecto.

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

// y para cerrar websocket

mWs.close();


Utilice esta biblioteca org.java_websocket

Lo primero que debe importar esa biblioteca en build.gradle

repositories { mavenCentral() }

luego agregue la implementación en dependencia {}

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

Entonces puedes usar este código

En su actividad, declare un objeto para Websocketclient como

private WebSocketClient mWebSocketClient;

luego agregue este método para la devolución de llamada

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

}