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

场景:很多时候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());
	}
}


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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值