springMVC整合websocket实践

websocket 是html5新规范,现在主流浏览器(ie 10+)均支持。最近用了一下,总结下。

总体思路使用spring mvc做路由。dispatchservlet是支持 http与websocket协议的。只是在处理上用的handle不同。

client:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>WebSoket Demo</title>
<script type="text/javascript">
	//验证浏览器是否支持WebSocket协议
	if (!window.WebSocket) {
		alert("WebSocket not supported by this browser!");
	}
	var ws;
	function display() {
		//var valueLabel = document.getElementById("valueLabel"); 
		//valueLabel.innerHTML = ""; 
		ws = new WebSocket("ws://" + document.location.host + "/myHandler.do");
		//监听消息
		ws.onmessage = function(event) {
			log(event.data);
		};
		// 打开WebSocket 
		ws.onclose = function(event) {
			//WebSocket Status:: Socket Closed
		};
		// 打开WebSocket
		ws.onopen = function(event) {
			//WebSocket Status:: Socket Open
			//// 发送一个初始化消息
			ws.send("Hello, Server!");
		};
		ws.onerror = function(event) {
			//WebSocket Status:: Error was reported
		};
	}
	var log = function(s) {
		if (document.readyState !== "complete") {
			log.buffer.push(s);
		} else {
			document.getElementById("contentId").innerHTML += (s + "\n");
		}
	}
	function sendMsg() {
		var msg = document.getElementById("messageId");
		//alert(msg.value);
		ws.send(msg.value);
	}
</script>
</head>
<body οnlοad="display();">
	<div id="valueLabel"></div>
	<textarea rows="20" cols="30" id="contentId"></textarea>
	<br />
	<input name="message" id="messageId" />
	<button id="sendButton" onClick="javascript:sendMsg()">Send</button>
</body>
</html>

server :

用于处理收到的websocket消息,

TextWebSocketHandler只处理文本消息

package nms.client.web;

import java.io.IOException;

import nms.server.alarm.status.AlarmRefreshStatus;
import nms.server.common.JsonHelper;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;

public class MyHandler extends TextWebSocketHandler {
	/**
	 * Logger for this class
	 */
	private static final Log LOGGER = LogFactory.getLog(MyHandler.class);

	@Override
	public void handleTextMessage(WebSocketSession session, TextMessage message) throws IOException {
//简单返回收到的消息
		session.sendMessage(message);
		
	}
}


配置路由,注册handle类。是否加.do看dispatchserverlet类拦截的消息名称后缀,如果有就加。我的是拦截.do。

package nms.client.web;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;

@Configuration
@EnableWebMvc
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

	@Override
	public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
		registry.addHandler(myHandler(), "/myHandler.do");
	}

	@Bean
	public WebSocketHandler myHandler() {
		return new MyHandler();
	}

}

运行是这样子的:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章