SpringMVC集成WebSocket【使用原生API】
使用JSR 356 API编写WebSocket应用,借鉴地址:https://www.baeldung.com/java-websockets
1.添加依赖
<dependency> <groupId>javax.websocket</groupId> <artifactId>javax.websocket-api</artifactId> <version>1.1</version> </dependency>
2.编写一些配置【可忽略】
package cn.coreqi.servletsocketdemo.config; import javax.servlet.http.HttpSession; import javax.websocket.HandshakeResponse; import javax.websocket.server.HandshakeRequest; import javax.websocket.server.ServerEndpointConfig; /** * 获取session所在的 httpSession */ public class GetHttpSessionConfigurator extends ServerEndpointConfig.Configurator { @Override public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) { HttpSession httpSession = (HttpSession) request.getHttpSession(); sec.getUserProperties().put(HttpSession.class.getName(), httpSession); } }
3.编写服务端端点
package cn.coreqi.servletsocketdemo.websocket; import cn.coreqi.servletsocketdemo.config.GetHttpSessionConfigurator; import cn.coreqi.servletsocketdemo.model.DefaultResultModel; import com.alibaba.fastjson.JSONObject; import org.springframework.stereotype.Component; import javax.websocket.*; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import java.util.HashMap; import java.util.Map; @Component @ServerEndpoint(value = "/websocket/{projectId}",configurator = GetHttpSessionConfigurator.class) public class WebSocketTest { // 保存所有的用户session private static Map<String, Session> SESSION_MAP = new HashMap<>(); @OnOpen public void onOpen(Session session, @PathParam(value="projectId")String projectId) { DefaultResultModel model = new DefaultResultModel(); model.setNow(System.currentTimeMillis()); model.setData(projectId); model.setMsg("onOpen"); session.getAsyncRemote().sendText(JSONObject.toJSONString(model)); } @OnError public void onError(Throwable t) { System.err.println("WebSocket出错了"); t.printStackTrace(); } @OnClose public void onClose() { } @OnMessage public void onMessage(Session session,String message) { DefaultResultModel model = new DefaultResultModel(); model.setNow(System.currentTimeMillis()); model.setData(message); model.setMsg("onMessage"); session.getAsyncRemote().sendText(JSONObject.toJSONString(model)); } }
4.前端页面【需要浏览器原生支持WebSocket】
<script type="text/javascript"> var div = document.getElementById('div'); var prefix = "ws://localhost:8080/"; var websocketUrl = prefix + 'websocket/7777'; var socket = new WebSocket(websocketUrl); socket.onopen = function(event){ console.log(event); socket.send('websocket client connect test'); } socket.onclose = function(event){ console.log(event); } socket.onerror = function(event){ console.log(event); } socket.onmessage = function(event){ console.log(event) div.innerHTML += ('接受到服务器消息:' + event.data); } </script>
作者:奇
出处:https://www.cnblogs.com/fanqisoft/p/16125277.html
版权:本作品采用「本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。」许可协议进行许可。
如果文章内容对您有所帮助,欢迎赞赏.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2019-04-10 SpringSecurity基于数据库RBAC数据模型控制权限
2019-04-10 SpringSecurity项目中如何在多个模块中配置认证信息
2019-04-10 SpringSecurity权限表达式