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();
}
}
運行是這樣子的: