场景:很多时候websocket传送不仅仅是一个字段的文本.如果是多几个字段,那可以使用JSON格式传送消息来解决.
设计:主要使用消息的编码器和解码器
1.ServerEndPoint服务器端点
import java.io.IOException; import javax.websocket.CloseReason; import javax.websocket.EncodeException; import javax.websocket.EndpointConfig; import javax.websocket.OnClose; import javax.websocket.OnError; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.Session; import javax.websocket.server.ServerEndpoint; @ServerEndpoint(value="/websocket",encoders={MessageEncoder.class},decoders={MessageDecoder.class}) public class WebSocketTest { @OnMessage public void onMessage(Message message, Session session) throws IOException, EncodeException { System.out.println("onMessage::"+message.toString()); Message response = new Message(); response.setSubject("Response to " + message.getSubject()); response.setContent("echo " + message.getContent()); session.getBasicRemote().sendObject(response); } @OnOpen public void onOpen(Session session,EndpointConfig config) { System.out.println("Client connected::"+config.toString()); } @OnClose public void onClose(Session session,CloseReason closeReason) { System.out.println("Connection closed::"+closeReason.toString()); } @OnError public void onError(Session session,Throwable thr) { System.out.println("onError::"+thr.getMessage()); } }
public class Message { private String subject; private String content; public String getSubject() { return subject; } public void setSubject(String subject) { this.subject = subject; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } }
import javax.json.Json; import javax.json.JsonObject; import javax.websocket.EncodeException; import javax.websocket.Encoder; import javax.websocket.EndpointConfig; public class MessageEncoder implements Encoder.Text<Message>{ @Override public void destroy() { System.out.println("MessageEncoder - destroy method called"); } @Override public void init(EndpointConfig arg0) { System.out.println("MessageEncoder - init method called"); } @Override public String encode(Message message) throws EncodeException { JsonObject jsonObject=Json.createObjectBuilder().add("subject", message.getSubject()).add("content", message.getContent()).build(); return jsonObject.toString(); } }
4.解码类
import java.io.StringReader; import javax.json.Json; import javax.json.JsonObject; import javax.websocket.DecodeException; import javax.websocket.Decoder; import javax.websocket.EndpointConfig; public class MessageDecoder implements Decoder.Text<Message>{ @Override public void destroy() { System.out.println("MessageDecoder - destroy method called"); } @Override public void init(EndpointConfig arg0) { System.out.println("MessageDecoder -init method called"); } @Override public Message decode(String jsonMessage) throws DecodeException { JsonObject jsonObject=Json.createReader(new StringReader(jsonMessage)).readObject(); Message message=new Message(); message.setSubject(jsonObject.getString("subject")); message.setContent(jsonObject.getString("content")); return message; } @Override public boolean willDecode(String jsonMessage) { /** check if incoming message is valid json */ try{ Json.createReader(new StringReader(jsonMessage)).readObject(); return true; }catch(Exception e){ System.out.println(e.getMessage()); return false; } } }
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <div> <span>Subject:</span> <input id="subject" type="text" /> <br /> <span>Content:</span><input id="content" type="text" /> </div> <div> <input type="submit" value="Send message" onclick="send()" /> </div> <div id="messages"></div> <script type="text/javascript"> var webSocket = new WebSocket('ws://localhost:8080/w/websocket'); webSocket.onerror = function(event) { onError(event); }; webSocket.onopen = function(event) { onOpen(event); }; webSocket.onmessage = function(event) { onMessage(event); }; function onMessage(event) { var json = JSON.parse(event.data); document.getElementById('messages').innerHTML = '<br />Received server response!' + '<br />Subject: ' + json.subject + '<br />Content: ' + json.content; } function onOpen(event) { console.log('Connection established'); } function onError(event) { alert('Error'); } function send() { var subject = document.getElementById('subject').value; var content = document.getElementById('content').value; var json = { 'subject' : subject, 'content' : content }; console.log('send:::'+JSON.stringify(json)); webSocket.send(JSON.stringify(json)); return false; } </script> </body> </html>
这里用到了javax.json.Json, tomcat 8 rc5是没有这样的类,所以要加这样的包进来.
上传了两次源码到csdn都不成功.上面的代码基本全了,缺一个包,用maven很容易搞下来