注意点:
1、Spring Framework从4.0版本开始支持websocket,示例代码使用的是4.1.3
2、SockJs是一个封装的WebSocket实现,可以支持低版本的IE浏览器。
3、SockJs+Spring-WebSocket时,由于SockJs与Spring WebSocket之间采用JSON通讯,需要引入jackson 2的相关jar包。
4、项目需要使用到Spring MVC。
具体代码实现(小例子):
1、Spring WebSocket配置类
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 //配置类 @EnableWebSocket //声明支持websocket public class WebSocketConfig implements WebSocketConfigurer{ @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { //注册websocket实现类,指定参数访问地址;allowed-origins="*" 允许跨域 registry.addHandler(myHandler(), "/ws").addInterceptors(myHandshake()).setAllowedOrigins("*"); //允许客户端使用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类实现(用于处理具体的消息)
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、握手拦截器实现(拦截器...)
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; /** * * 类描述:握手拦截器 * com.watcher.websocket.spring MyHandshakeInterceptor * Created by 78098 on 2016年11月15日. * 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、页面
<!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("连接失败!"); } } 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()">发送消息</button> <button id="reconnect" onclick="reconnect()">重新连接</button> </div> <div> <textarea id="message" style="width: 350px">Here is a message!</textarea> </div> <div>日志信息:</div> <p id="console" width="600px"></p> </body> </html>
相关推荐
客户端通常使用JavaScript库如SockJS和Stomp.js来连接到WebSocket服务器。它们提供了友好的API,可以方便地建立连接、订阅主题和发送/接收消息。 4. **服务端处理**: 在服务器端,你需要创建一个处理WebSocket...
在Spring WebSocket中,我们通常使用STOMP(Simple Text Oriented Messaging Protocol)协议来传输消息。STOMP提供了一个简单的文本帧结构,使得不同平台的客户端和服务器可以轻松交互。我们需要在前端使用一个支持...
3. **WebSocket客户端**:在前端,可以使用JavaScript的WebSocket API或者库(如Stomp.js、sockjs-client)来建立WebSocket连接,订阅和发送消息。例如,通过`new WebSocket('ws://localhost:8080/ws')`创建连接,...
Spring Websocket与SockJS结合使用时,Spring负责服务器端的WebSocket配置和管理,而SockJS负责客户端的WebSocket兼容性问题。在Spring配置中,可以通过设置`sockjsTransportUrlPattern`来启用SockJS服务。客户端...
在Spring中,我们可以使用`spring-messaging-stomp-websocket`模块集成SockJS。配置WebSocket和SockJS可以通过以下XML或Java配置实现: ```xml <websocket:message-broker application-destination-prefix="/app"> ...
对于Spring WebSocket,可以利用SockJS库和Stomp.js库,提供浏览器兼容性和STOMP支持。 **六、安全性考虑** 在生产环境中,务必考虑WebSocket的安全性,例如使用SSL/TLS加密连接,配置Spring Security来控制访问...
3. 客户端配置:在前端,你可以使用JavaScript库如SockJS和StompJS来连接到WebSocket服务器并订阅主题,接收和发送消息。 4. Spring MVC集成:如果项目中已经使用了Spring MVC,可以通过`...
2. **SockJS**: 为了解决WebSocket在不同浏览器的兼容性问题,Spring提供了SockJS协议,它是一种透明的WebSocket替代方案,能在所有现代浏览器中工作。 3. **STOMP**: 作为WebSocket的消息传输协议,STOMP(Simple ...
本篇文章将深入探讨Spring WebSocket的核心概念、配置、使用方法以及其实现原理。 1. **WebSocket简介** WebSocket协议是HTTP协议的补充,解决了HTTP协议的单向通信问题,实现了全双工通信。它通过建立持久连接,...
5. **客户端支持**:在前端,使用JavaScript的WebSocket API或者基于Stomp的库(如`sockjs-client`和`stompjs`)与Spring的WebSocket服务器通信。 6. **测试与调试**:使用WebSocket客户端工具或自定义的测试页面,...
在本文中,我们将深入探讨如何使用Spring框架,特别是Spring WebSocket,来创建一个简单的WebSocket应用程序。这对于初学者来说是一个很好的起点,因为它提供了一个直观的理解和实践机会。 首先,让我们了解Spring ...
### Spring Websocket+STOMP+SockJS 实现的实时通信详解 #### 一、Websocket与传统的HTTP连接对比 在探讨Spring Websocket+STOMP+SockJS如何实现实时通信之前,我们首先需要理解Websocket协议与传统的HTTP连接有何...
SpringWebSocket-master.zip是一个包含Spring Boot应用的示例项目,展示了如何使用WebSocket技术和STOMP协议实现前后端通信。WebSocket是一种在单个TCP连接上进行全双工通信的协议,相较于传统的HTTP请求,它允许...
总的来说,虽然Spring WebSocket的使用通常与Spring MVC结合,但在非Spring MVC环境中,通过合理的配置和编程,依然可以实现WebSocket的通信功能。以上步骤详细介绍了如何在不依赖Spring MVC的情况下,利用Spring ...
这个“myeclipse+spring+websocket+sockjs(非maven项目)”的简单DEMO,提供了一个在不使用Maven构建工具的情况下,如何在MyEclipse集成环境中配置和运行WebSocket应用程序的实例。 首先,MyEclipse是一款强大的Java...
在Spring中,我们可以通过`SimpMessagingTemplate`来发送STOMP消息,而客户端则可以使用JavaScript库如SockJS来接收和发送STOMP消息。 六、WebSocket和Spring MVC的集成 Spring WebSocket可以无缝集成到Spring MVC...
使用 Spring 的 WebSocket 创建通信服务的示例代码 在本文中,我们将介绍使用 Spring 的 WebSocket 创建通信服务的示例代码。WebSocket 是一种高效的通信协议,能够实现实时的双向通信。 Spring Framework 提供了对...
在Spring WebSocket中,通常会使用STOMP客户端库(如JavaScript的sockjs-client和stompjs)来订阅和发布消息。客户端通过WebSocket连接到服务器,然后订阅主题,服务器可以通过这个连接向特定订阅者发送消息。 五、...
4. **客户端连接**:在前端,使用JavaScript的WebSocket API建立连接,通常会用到STOMP库如`sockjs-client`和`stompjs`来简化操作。创建连接并订阅服务器的特定主题,以便接收实时数据。 5. **ECharts实时更新**:...
通常会使用JavaScript库如SockJS和Stomp.js,它们为浏览器提供了WebSocket的抽象层。 5. **消息处理器**:处理从客户端接收到的消息,并将响应返回给客户端,可以是Spring的`MessageHandler`实现。 6. **业务逻辑**...