Websocket
endpoints can send both text and binary messages, ping and pong
frames.
It
is a 3 step process
Step
1: Get the session object. Session object is available as a
parameter to the life cycle methods of endpoint.
Step
2: Get the RemoteEndpoint
object from the session object obtained in step 1. The
Session.getBasicRemote method and the Session.getAsyncRemote method
return RemoteEndpoint.Basic and RemoteEndpoint.Async objects
respectively. RemoteEndpoint.Async interface provides nonblocking
methods to send messages.
Step
3: Use the RemoteEndpoint
object to send messages to the peer.
Methods
in RemoteEndpoint.Basic to send message to client
Method | Description |
sendBinary(ByteBuffer data) | Send a binary message, returning when all of the message has been transmitted. |
sendBinary(ByteBuffer partialByte, boolean isLast) | Send a binary message in parts, blocking until all of the message has been transmitted. Non-final parts are sent with isLast set to false. The final piece must be sent with isLast set to true. |
sendObject(Object data) | Sends a custom developer object, blocking until it has been transmitted |
sendText(String text) | Send a text message, blocking until all of the message has been transmitted. |
sendText(String partialMessage, boolean isLast) | Send a text message in parts, blocking until all of the message has been transmitted.Non-final parts are sent with isLast set to false. The final piece must be sent with isLast set to true. |
Methods
in RemoteEndpoint.Async to send message to client
Method | Description |
sendBinary(ByteBuffer data) | Initiates the asynchronous transmission of a binary message. This method returns before the message is transmitted. |
sendBinary(ByteBuffer data, SendHandler handler) | Initiates the asynchronous transmission of a binary message. This method returns before the message is transmitted. The handler will be notified of progress. |
sendObject(Object data) | Initiates the asynchronous transmission of a custom developer object. |
sendObject(Object data, SendHandler handler) | Initiates the asynchronous transmission of a custom developer object. The handler will be notified of progress. |
sendText(String text) | Initiates the asynchronous transmission of a text message. This method returns before the message is transmitted. |
sendText(String text, SendHandler handler) | Initiates the asynchronous transmission of a text message. This method returns before the message is transmitted. The handler will be notified of progress. |
RemoteEndpoint.Basic,
RemoteEndpoint.Async interfaces extends RemoteEndpoint interface
which provide method to send ping and pong frames.
Methods
in RemoteEndpoint to send message to client
Method | Description |
sendPing(ByteBuffer applicationData) | Send a Ping message containing the given application data to the remote endpoint. |
sendPong(ByteBuffer applicationData) | Allows the developer to send an unsolicited Pong message containing the given application data in order to serve as a unidirectional heartbeat for the session. |
For
Example, will write an Application, where client sends a number to
server and server calculates probable prime specific to this number
and send the result back to client.
import java.math.*; public class ProbablePrime { static String getProbablePrime(String num){ BigInteger b1 = new BigInteger(num); return b1.nextProbablePrime().toString(); } }
import java.io.IOException; import javax.websocket.OnClose; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.RemoteEndpoint; import javax.websocket.Session; import javax.websocket.server.ServerEndpoint; @ServerEndpoint("/endpoint") public class EchoServer { /* Notified when a new web socket session is open. */ @OnOpen public void onOpen(Session session){ System.out.println(session.getId() + " has opened a connection"); try { session.getBasicRemote().sendText("Connection Established"); } catch (IOException ex) { ex.printStackTrace(); } } /* Notified when the client sends message to server */ @OnMessage public void onMessage(String message, Session session){ RemoteEndpoint.Basic basic = session.getBasicRemote(); String s = ProbablePrime.getProbablePrime(message); try { basic.sendText("Probable prime is " + s); } catch (IOException ex) { ex.printStackTrace(); } } /* notified when the user closes connection */ @OnClose public void onClose(Session session){ System.out.println("Session " +session.getId()+" has ended"); } }
<!DOCTYPE html> <html> <head> <title>Echo Chamber</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width"> </head> <body> <div> <input type="text" id="messageinput"/> </div> <div> <button type="button" onclick="openSocket();" >Open</button> <button type="button" onclick="send();" >Get Probable Prime</button> <button type="button" onclick="closeSocket();" >Close</button> </div> <!-- Server responses get written here --> <div id="messages"></div> <!-- Java script for websockets --> <script type="text/javascript"> var connection; var messages = document.getElementById("messages"); function openSocket(){ // Ensures only one connection is open at a time if(connection !== undefined && connection.readyState !== connection.CLOSED){ writeResponse("WebSocket is already opened."); return; } // Create a new instance of the websocket connection = new WebSocket("ws://localhost:8080/websockets/endpoint"); /* Binds the listeners to socket */ connection.onopen = function(event){ if(event.data === undefined) return; writeResponse(event.data); }; connection.onmessage = function(event){ writeResponse(event.data); }; connection.onclose = function(event){ writeResponse("Connection closed"); }; } /* Send messgae to the server */ function send(){ var text = document.getElementById("messageinput").value; connection.send(text); } /* Close the socket */ function closeSocket(){ connection.close(); } function writeResponse(text){ messages.innerHTML += "<br/>" + text; } </script> </body> </html>
Output
No comments:
Post a Comment