websocket是Ht ML 5新增加特性之一,目的是浏览器与服务端建立全双工的通信方式,解决http请求-响应带来过多的资 源 消耗,同时对特殊场景应用提供了 全新 的实现方式,比如聊天、股票交易、游戏等对对实时性要求较高的 行业 领域。
背景在浏览器中通过http仅能实现单向的通信,comet可以一定程度上模拟双向通信,但效率较低,并需要 服务器 有较好的支持; flash中的socket和 XM lsocket可以实现真正的双向通信,通过 flex ajax br idge,可以在javascript中使用这两项功能. 可以预见,如果websocket一旦在浏览器中得到实现,将会替代上面两项技 术 ,得到广泛的使用. 面对 这种状况,HTML5定义了WebSocket协议,能更好的 节省 服务器资源和 带宽 并达到实时通讯。目前各大主流浏览器都支持websocket,IE浏览器要IE10+
一、POM依赖
POM依赖,s PR ing4.1.4.RELEASE,spring核心依赖请自行添加,下面是websocket相关jar
<de PE ndency> <groupId>javax.websocket</groupId> <artifactId>javax.websocket-api</artifactId> <version>1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId> org .springfr am ework</groupId> <artifactId>spring-websocket</artifactId> <version>4.1.4.RELEASE</version> </dependency>
二、WebSocket入口
@ config uration @EnableWebMvc @EnableWebSocket p ub lic class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer { @ override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { //允许连接的域,只能以http或https开头 String[] allowsOri gin s = {"http://HdhCmsTestxxx .COM "}; //WebIM WebSocket通道 registry.addHandler(c hat WebSocketHandler(),"/ webSocketIMServer").set Allowed Origins(allowsOrigins).addInterceptors(myInterceptor()); registry.addHandler(chatWebSocketHandler(), "/sockjs/w ebSocketIMServer").setAllowedOrigins(allowsOrigins).addInterceptors(myInterceptor()).w IT hSockJS(); } @Bean public ChatWebSocketHandler chatWebSocketHandler() { return new ChatWebSocketHandler(); } @Bean public WebSocketHandshak ei nterceptor myInterceptor(){ return new WebSocketHandshakeInterceptor(); } }
实现WebSocketConfigurer接口,重写registerWebSocketHandlers方法,这是一个核心实现方法,配置websocket入口,允许访问的域、注册Handler、SockJs支持和拦截器。
registry.addHandler注册和路由的功能,当客户端发起websocket连接,把/path交给对应的handler处理,而不实现具体的业务逻辑,可以理解为收集和 任务 分发中心。
setAllowedOrigins(String[] dom ai ns),允许指定的域名或IP(含端口号)建立 长连接 ,如果只允许自家域名访问,这里轻松设置。如果不限时使用"*"号,如果指定了域名,则必须要以http或https开头。
addInterceptors,顾名思义就是为handler添加拦截器,可以在调用handler前后加入我们自己的逻辑代码。
spring websocket也支持STOMP协议,下回再分享。
三、拦截器实现
public class WebSocketHandshakeInterceptor implements HandshakeInterceptor { @Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object > attributes) t hr ows Exception { if (request instanceof ServletServerHttpRequest) { attributes.put("username",userName); } return true; } @Override public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) { } }
beforeHandshake,在调用handler前处理方法。常用在注册用户信息,绑定WebSocketSession,在handler里根据用户信息获取WebSocketSession发送消息。
四、Handler 处理类
public class ChatWebSocketHandler extends TextWebSocketHandler{ private final stat ic List<WebSocketSession> sessions = Collections.synchronizedList(new ArrayList<WebSocketSession>()); //接收文本消息,并发送出去 @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { chatTextMessageHandler(message.getPayload()); super.handleTextMessage(session, message); } //连接建立后处理 @Sup Press Warnings("unchecked") @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { LOG ger.debug("connect to the websocket chat success .. ...."); sessions.add(session); //处理离线消息 } //抛出异常时处理 @Override public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { if(session.isOpen()){ session.close(); } logger.debug("websocket chat connection closed......"); sessions.remove(session); } //连接关闭后处理 @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception { logger.debug("websocket chat connection closed......"); sessions.remove(session); } @Override public boolean supportsPartialMessages() { return false; } }
五、客户端连接
VAR host = window.location.host; var websocket; if (& # 39;WebSocket' in window) { websocket = new ReconnectingWebSocket("ws://" + host + "/webSocketIMServer", null, {debug:true, maxReconnectAttempts:4}); } else if (' ;m ozWebSocket' in window) { websocket = new MozWebSocket("ws://" + host + "/webSocketIMServer"); } else { websocket = new SockJS("http://" + host + "/sockjs/webSocketIMServer"); } websocket.onopen = function(evnt) { console.log("websocket连接上"); }; websocket.onmessage = function(evnt) { messageHandler(evnt.data); }; websocket.onerror = function(evnt) { console.log("websocket错误"); }; websocket.onclose = function(evnt) { console.log("websocket关闭"); }
这里用到了ReconnectingWebSocket.js,对浏览器 自带 websocket添加了扩展,例如重连,连接超时时间,失败重连间隔,尝试连接最大次数等。
项目主页:ReconnectingWebSocket
以上就是spring WebSocket的详细介绍的详细内容,更多请关注其它相关 文章 !
总结
以上是 为你收集整理的 spring WebSocket的详细介绍 全部内容,希望文章能够帮你解决 spring WebSocket的详细介绍 所遇到的问题。
如果觉得 网站内容还不错, 推荐好友。
查看更多关于spring WebSocket的详细介绍的详细内容...