一聚教程网:一个值得你收藏的教程网站

最新下载

Java中Spring WebSocket详解

时间:2017-12-25 14:13:11 编辑:猪哥 来源:转载

首先 pom.xml


	org.springframework.boot
	spring-boot-starter-parent
	1.5.8.RELEASE


	org.apache.commons
	commons-io


	javax.websocket
	javax.websocket-api
	1.0
	provided


	org.springframework
	spring-websocket


	org.springframework.boot
	spring-boot-starter-web
	
		
			org.springframework.boot
			spring-boot-starter-tomcat
		
	


	org.springframework.boot
	spring-boot-starter-undertow

接收消息后的处理类 GameHandler :

import java.net.URI;
import org.springframework.web.socket.BinaryMessage;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.PongMessage;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.AbstractWebSocketHandler;

public class GameHandler extends AbstractWebSocketHandler {
 /**
  * 处理字符串类的信息
  *
  * @param session
  * @param message
  * @throws Exception
  */
 @Override
 protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
  session.sendMessage(new TextMessage(message.asBytes()));
 }

 /**
  * 处理二进制类的信息
  *
  * @param session
  * @param message
  * @throws Exception
  */
 @Override
 protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws Exception {
  session.sendMessage(new BinaryMessage(message.getPayload()));
 }

 /**
  * ping-pong
  *
  * @param session
  * @param message
  * @throws Exception
  */
 @Override
 protected void handlePongMessage(WebSocketSession session, PongMessage message) throws Exception {
	
 }
 /**
  * 传出错误的处理
  *
  * @param session
  * @param exception
  * @throws Exception
  */
 @Override
 public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
 }
 /**
  * 连接关闭的处理
  *
  * @param session
  * @param status
  * @throws Exception
  */
 @Override
 public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
 }
 /**
  * 连接建立后的处理
  *
  * @param session
  * @throws Exception
  */
 @Override
 public void afterConnectionEstablished(WebSocketSession session) throws Exception {	
 }
}

 握手信息拦截器 WebSocketHandshakeInterceptor :

import java.util.Map;
import javax.servlet.http.Cookie;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.HandshakeInterceptor;

public class WebSocketHandshakeInterceptor implements HandshakeInterceptor {
 @Override
 public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse shr1, WebSocketHandler wsh, Map attributes) throws Exception {
  // 此处可以做一些权限认证的事情或者其他
  return true;
 }
 @Override
 public void afterHandshake(ServerHttpRequest shr, ServerHttpResponse shr1, WebSocketHandler wsh, Exception excptn) {	
 }
}

使用WebSocket的配置类 WebSocketConfig :

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
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
@EnableWebSocket
public class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer {
@Override
 public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
  // 允许连接的域,只能以http或https开头
  String[] allowsOrigins = {"http://127.0.0.1:1213", "http://localhost:1213"};
  registry.addHandler(gameHandler(),"/game").addInterceptors(handshakeInterceptor()).setAllowedOrigins(allowsOrigins);
 }
 @Bean
 public GameHandler gameHandler() {
  return new GameHandler();
 }
 @Bean
 public WebSocketHandshakeInterceptor handshakeInterceptor() {
  return new WebSocketHandshakeInterceptor();
 }
}

启动类 Launcher :

@SpringBootApplication
public class Launcher {
 public static void main(String[] params) {
  SpringApplication.run(Launcher.class, params);
	}
}

配置文件 main/resources/application.properties:

server.port=1213
server.session-timeout=1800
server.undertow.io-threads=4
server.undertow.worker-threads=20
server.undertow.buffer-size=1024
server.undertow.buffers-per-region=1024
server.undertow.direct-buffers=true

前端的测试页面 mainresourcesstaticindex.html



 
  
  
  
  Platform Gateway
  css.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="external nofollow" rel="stylesheet">
  
  <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
  <script src="https://cdn.bootcss.com/jquery-scrollTo/2.1.2/jquery.scrollTo.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/pako/1.0.6/pako.min.js"></script>
  
  
 
 
  
   

WebSocket Test Page


ws://127.0.0.1:1213/

<script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> <script type="text/javascript"> function zip(str) { var binaryString = pako.gzip(str, {to: 'string'}); return btoa(binaryString); } function unzip(b64Data) { var strData = atob(b64Data); var charData = strData.split('').map(function (x) { return x.charCodeAt(0); }); var binData = new Uint8Array(charData); var data = pako.inflate(binData); strData = String.fromCharCode.apply(null, new Uint16Array(data)); return strData; } var websocket = null; var wsBaseUrl = null; var wsUrl = null; function init() { wsBaseUrl = "ws://" + window.location.host + "/"; $("#basic-ws").text(wsBaseUrl); $(function () { $('[data-toggle="popover"]').popover(); }); return false; } //关闭WebSocket连接 function closeWebSocket() { if (websocket) { websocket.close(); } return false; } //将消息显示在网页上 function setMessageInnerHTML(who, msg) { var message = null; if (who === 1) { message = '本地: ' + msg + ''; } else { message = '服务器: ' + msg + ''; } document.getElementById('message').innerHTML = (document.getElementById('message').innerHTML + message); $("#message").scrollTo('100%'); return false; } //发送消息 function send() { if (websocket) { var message = $("#inMsg").val(); websocket.send(zip(message)); setMessageInnerHTML(1, message); } return false; } function connect() { var url = $("#basic-ws-addr").val(); if (url.length <= 0) { $('#basic-ws-addr').popover('show'); setTimeout(function () { $('#basic-ws-addr').popover('hide'); }, 3000); } else { wsUrl = wsBaseUrl + url; if ('WebSocket' in window) { websocket = new WebSocket(wsUrl); //连接发生错误的回调方法 websocket.onerror = function () { setMessageInnerHTML(0, "WebSocket连接发生错误 -> " + wsUrl); $("#btnConnect").removeAttr("disabled"); $("#btnClose").attr("disabled", "disabled"); $("#btnSend").attr("disabled", "disabled"); }; //连接成功建立的回调方法 websocket.onopen = function () { setMessageInnerHTML(0, "WebSocket连接成功 -> " + wsUrl); $("#btnConnect").attr("disabled", "disabled"); $("#btnClose").removeAttr("disabled"); $("#btnSend").removeAttr("disabled"); }; //接收到消息的回调方法 websocket.onmessage = function (event) { setMessageInnerHTML(0, unzip(event.data)); }; //连接关闭的回调方法 websocket.onclose = function () { setMessageInnerHTML(0, "WebSocket连接关闭 -> " + wsUrl); $("#btnConnect").removeAttr("disabled"); $("#btnClose").attr("disabled", "disabled"); $("#btnSend").attr("disabled", "disabled"); }; //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。 window.onbeforeunload = function () { closeWebSocket(); }; } else { alert('Not support websocket'); } } return false; } window.onload = init(); </script>

文章评论

热门栏目