场景:很多时候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;
}
}
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>{
@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;
}
}
}
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" οnclick="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很容易搞下来