接上一篇改篇:Java EE7,Tomcat8,HTML5,WebSocket1编码器与解码器的例子

来源:互联网 发布:手机强刷软件 编辑:程序博客网 时间:2024/06/08 08:02

场景:很多时候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 {@OnMessagepublic 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);}@OnOpenpublic void onOpen(Session session,EndpointConfig config) {System.out.println("Client connected::"+config.toString());}@OnClosepublic void onClose(Session session,CloseReason closeReason) {System.out.println("Connection closed::"+closeReason.toString());}@OnErrorpublic void onError(Session session,Throwable thr) {System.out.println("onError::"+thr.getMessage());}}


2.普通POJO消息类
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;}}

3.编码类

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>{@Overridepublic void destroy() {System.out.println("MessageEncoder - destroy method called");}@Overridepublic void init(EndpointConfig arg0) {System.out.println("MessageEncoder - init method called");}@Overridepublic 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>{@Overridepublic void destroy() {System.out.println("MessageDecoder - destroy method called");}@Overridepublic void init(EndpointConfig arg0) {System.out.println("MessageDecoder -init method called");}@Overridepublic 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;}@Overridepublic 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;}}}

5.客户端

<!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很容易搞下来



原创粉丝点击