1.1 服務註冊javascript
服務註冊分爲兩種模式:註解模式(推薦)、XML配置模式html
1.1.1 註解配置模式java
Java代碼 web
/** * * @author Goma * */ @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(myhandler(), "/websocket").addInterceptors(myInterceptors()).setAllowedOrigins("*"); registry.addHandler(myhandler(), "/sockjs/websocket").addInterceptors(myInterceptors()).withSockJS(); } @Bean public WebSocketHandler myhandler() { return new WebsocketEndPoint(); } @Bean public HandshakeInterceptor myInterceptors() { return new HandshakeInterceptor(); } }
注:該類須要放在SpringMVC掃描路徑下spring
@Configuration 指明該類爲Spring 配置類瀏覽器
@EnableWebSocket 聲明該類支持WebSocket服務器
registry.addHandler(myhandler(), "/websocket").addInterceptors(myInterceptors()).setAllowedOrigins("*");
用來註冊WebSocket Server實現類,第二個參數是訪問WebSocket的地址websocket
注:setAllowedOrigins方法用來設置來自那些域名的請求可訪問,默認爲localhostsession
registry.addHandler(myhandler(), "/sockjs/websocket").addInterceptors(myInterceptors()).withSockJS();
容許客戶端使用SockJSapp
1.1.2 XML配置模式
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:websocket="http://www.springframework.org/schema/websocket" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/websocket http://www.springframework.org/schema/websocket/spring-websocket.xsd">
<bean id="websocket" class="com.camelot.lrpportal.web.webapp.controller.WebsocketEndPoint"/> <websocket:handlers> <websocket:mapping path="/websocket" handler="websocket"/> <websocket:handshake-interceptors> <bean class="com.camelot.lrpportal.web.webapp.controller.HandshakeInterceptor"/> </websocket:handshake-interceptors> </websocket:handlers>
1.2 服務端編寫
public class WebsocketEndPoint extends TextWebSocketHandler { private Logger logger = Logger.getLogger(getClass()); @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { super.handleTextMessage(session, message); logger.debug("GOMA === > WebSocketEndPoint.handlerTextMessage..."); TextMessage returnMessage = new TextMessage(message.getPayload()+" received at server"); session.sendMessage(returnMessage); } }
這個類處理來之瀏覽器(客戶端)的WebSocket請求。在這個例子中,咱們建立一個叫WebSocketEndPoint的類,並讓它集成TextWebsocketHandler類。而後重寫父類方法handlerTextMessage(),每當客戶端發送信息過來,都會由這個函數接收並處理。
固然這裏還能夠重寫其餘方法,如afterConnectionEstablished、afterConnectionClosed、handleTransportError 等等
擴展:這裏能夠將登陸用戶保存到對象中,而後能夠實現點對點消息發送、發送全部用戶等功能。
1.3 握手攔截器
WebSocket握手攔截器用來攔截和處理客戶端和服務器端分別在握手前和握手後的事件,咱們這裏添加這個攔截器是爲了清晰的知道何時以及是否握手成功。
public class HandshakeInterceptor extends HttpSessionHandshakeInterceptor { private Logger logger = Logger.getLogger(getClass()); @Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception { logger.debug("GOMA ===> Before Handshake"); return super.beforeHandshake(request, response, wsHandler, attributes); } @Override public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) { logger.debug("GOMA ===> After Handshake"); super.afterHandshake(request, response, wsHandler, ex); } }
2、WebSocket 客戶端配置
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript"> function setConnected(connected) { document.getElementById('connect').disabled = connected; document.getElementById('disconnect').disabled = !connected; document.getElementById('response').innerHTML = ''; } function connect() { if ('WebSocket' in window){ console.log('Websocket supported'); socket = new WebSocket('ws://localhost:8080/lrpportal-web-webapp/websocket'); console.log('Connection attempted'); socket.onopen = function(){ console.log('Connection open!'); setConnected(true); } socket.onclose = function(){ console.log('Disconnecting connection'); } socket.onmessage = function (evt) { var received_msg = evt.data; console.log(received_msg); console.log('message received!'); showMessage(received_msg); } } else { console.log('Websocket not supported'); } } function disconnect() { setConnected(false); console.log("Disconnected"); } function sendName() { var message = document.getElementById('message').value; socket.send(JSON.stringify({ 'message': message })); } function showMessage(message) { var response = document.getElementById('response'); var p = document.createElement('p'); p.style.wordWrap = 'break-word'; p.appendChild(document.createTextNode(message)); response.appendChild(p); } /* 1. new WebSocket('ws://localhost:8080//websocket')嘗試與服務器創建鏈接; 2. 握手成功並創建鏈接後,socket.onopen被調用 3. 當接收來自服務器的消息,socket.onmessage被調用 4. socket.send()用來發送消息至服務端 */ </script> </head> <body> <button id="connect" onclick="connect()">connect</button> <button id="disconnect" onclick="disconnect()"/>disconnect</button><br> <input id="message" value="send message"/> <button onclick="sendName()">發送消息</button> <div id="response"></div> </body> </html>