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();
	}

}

運行是這樣子的:



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