Sping WebSocket SockJS use

important point:

1. Spring Framework supports websocket from version 4.0, and the sample code uses 4.1.3

2. SockJs is an encapsulated WebSocket implementation that can support lower versions of IE browsers.

3. When SockJs+Spring-WebSocket, because JSON communication is used between SockJs and Spring WebSocket, it is necessary to introduce the relevant jar package of jackson 2.

4. The project needs to use Spring MVC.

 

Specific code implementation (small example):

1. Spring WebSocket configuration class

package com.watcher.websocket.spring;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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 //Configuration class
@EnableWebSocket //Declare support for websocket
public class WebSocketConfig implements WebSocketConfigurer{

	@Override
	public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {

		//Register the websocket implementation class and specify the parameter access address; allowed-origins="*" allows cross-domain
		registry.addHandler(myHandler(), "/ws").addInterceptors(myHandshake()).setAllowedOrigins("*");
		//Allow clients to use SockJS
		registry.addHandler(myHandler(), "/sockjs/ws").addInterceptors(myHandshake()).withSockJS();
	}
	
	@Bean
	public MyHandler myHandler(){
		return new MyHandler();
	}

	@Bean
	public MyHandshakeInterceptor myHandshake(){
		return new MyHandshakeInterceptor();
	}
	

}

 

2. Handler class implementation (for processing specific messages)

package com.watcher.websocket.spring;

import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.WebSocketMessage;
import org.springframework.web.socket.WebSocketSession;

//extending either TextWebSocketHandler orBinaryWebSocketHandler
public class MyHandler implements WebSocketHandler {
	
	

	@Override
	public void afterConnectionClosed(WebSocketSession arg0, CloseStatus arg1) throws Exception {
		// TODO Auto-generated method stub
		
		System.out.println("Connection closed..."+arg0.getRemoteAddress().toString());
		
	}

	@Override
	public void afterConnectionEstablished(WebSocketSession arg0) throws Exception {
		// TODO Auto-generated method stub
		System.out.println("Connection established..."+arg0.getRemoteAddress().toString());
	}

	@Override
	public void handleMessage(WebSocketSession arg0, WebSocketMessage<?> arg1) throws Exception {
		// TODO Auto-generated method stub
	     try {
	    	 System.out.println("Req: "+arg1.getPayload());
			TextMessage returnMessage = new TextMessage(arg1.getPayload()  
				      + " received at server");  
			 arg0.sendMessage(returnMessage);
		} catch (Exception e) {
			e.printStackTrace ();
		}  
	}

	@Override
	public void handleTransportError(WebSocketSession arg0, Throwable arg1) throws Exception {
		// TODO Auto-generated method stub
		if(arg0.isOpen()){
			arg0.close();
		}
		System.out.println(arg1.toString());
		System.out.println("WS connection error,close...");
	}

	@Override
	public boolean supportsPartialMessages() {
		// TODO Auto-generated method stub
		return false;
	}

	
	
}

 3, handshake interceptor implementation (interceptor...)

package com.watcher.websocket.spring;

import java.util.Map;

import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;

/**
 *
 * Class Description: Handshake Interceptor
 * com.watcher.websocket.spring  MyHandshakeInterceptor
 * Created by 78098 on November 15, 2016.
 * version 1.0
 */
public class MyHandshakeInterceptor extends HttpSessionHandshakeInterceptor{

	@Override
	public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) {
		// TODO Auto-generated method stub
		System.out.println("After handshake "+request.getRemoteAddress().toString());
		super.afterHandshake(request, response, wsHandler, ex);
	}

	@Override
	public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler handler, Map<String, Object> map) throws Exception {
		// TODO Auto-generated method stub
		System.out.println("Before handshake "+request.getRemoteAddress().toString());
		return super.beforeHandshake(request, response, handler, map);
	}

	
	
}

 4. Page

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="./plugin/sockjs/sockjs-1.1.1.js"></script>
<script type="text/javascript">
	var url = "192.168.120.37:8080/springMybatis";
	var websocket = null;
	if ('WebSocket' in window) {
		websocket = new WebSocket("ws://" + url + "/ws");
	} else {
		websocket = new SockJS("http://" + url + "/sockjs/ws");
	}
	websocket.onopen = onOpen;
	websocket.onmessage = onMessage;
	websocket.onerror = onError;
	websocket.onclose = onClose;

	function onOpen(openEvent) {
		document.getElementById("console").innerHTML = document.getElementById("console").innerHTML+ "OPEN<br/>";
	}

	function onMessage(event) {
		document.getElementById("console").innerHTML = document.getElementById("console").innerHTML+ event.data+"<br/>";
	}
	function onError() {
	}
	function onClose() {
		document.getElementById("console").innerHTML = document.getElementById("console").innerHTML+ "CLOSE<br/>";
	}

	function doSend () {
		console.log(websocket.readyState);
		if (websocket.readyState == SockJS.OPEN) {
			var msg = document.getElementById("message").value;
			websocket.send(msg);
		} else {
			alert("Connection failed!");
		}
	}
	
	
	function disconnect(){
		if (websocket != null) {
			websocket.close();
			websocket = null;
        }
	}
	
	function reconnect(){
		if (websocket != null) {
			websocket.close();
			websocket = null;
        }
		if ('WebSocket' in window) {
			websocket = new WebSocket("ws://" + url + "/ws");
		} else {
			websocket = new SockJS("http://" + url + "/sockjs/ws");
		}
		websocket.onopen = onOpen;
		websocket.onmessage = onMessage;
		websocket.onerror = onError;
		websocket.onclose = onClose;
	}
</script>
</head>
<body>
	<div>
		<button id="disconnect" onclick="disconnect()">断开连接</button>
		<button id="send" onclick="doSend()">Send message</button>
		<button id="reconnect" onclick="reconnect()">重新连接</button>
	</div>
    <div>
       <textarea id="message" style="width: 350px">Here is a message!</textarea>
    </div>
    <div>Log information:</div>
	<p id="console" width="600px"></p>
</body>
</html>

 

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=326564425&siteId=291194637