在SpringBoot中使用WebSocket
一、概述
最近在SpringBoot中用到了WebSocket的功能,在此记录一下使用步骤。SpringBoot使用WebSocket还是比较简单的,只需要4步就行了。如下
二、使用步骤
第一步:
在pom.xml文件中导入坐标
<!-- websocket dependency --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>
第二步:
在入口类上加上@EnableWebSocket注解,表明项目中要使用WebSocket功能
@SpringBootApplication @EnableWebSocket public class DemoApplication {
第三步:
新建一个WebSocket配置类
/** * WebSocket配置类 */ @Configuration public class WSConfig { @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } }
第四步:
新建WebSocketServer类使用具体的WebSocket功能,此类负责消息的接收以及转发功能
/** * WebSocketServer服务端 */ @Slf4j @Component @ServerEndpoint("/websocket/{uid}") public class WebSocketServer { /** * 静态变量,用来记录当前在线连接数,线程安全的类。 */ private static AtomicInteger onlineSessionClientCount = new AtomicInteger(0); /** * 存放所有在线的客户端 */ private static Map<String, Session> onlineSessionClientMap = new ConcurrentHashMap<>(); /** * 连接uid和连接会话 */ private String uid; private Session session; /** * 连接建立成功调用的方法。由前端<code>new WebSocket</code>触发 * * @param uid 每次页面建立连接时传入到服务端的id,比如用户id等。可以自定义。 * @param session 与某个客户端的连接会话,需要通过它来给客户端发送消息 */ @OnOpen public void onOpen(@PathParam("uid") String uid, Session session) { /** * session.getId():当前session会话会自动生成一个id,从0开始累加的。 */ log.info("连接建立中 ==> session_id = {}, sid = {}", session.getId(), uid); //加入 Map中。将页面的uid和session绑定或者session.getId()与session //onlineSessionIdClientMap.put(session.getId(), session); onlineSessionClientMap.put(uid, session); //在线数加1 onlineSessionClientCount.incrementAndGet(); this.uid = uid; this.session = session; // sendToOne(uid, "连接成功"); log.info("连接建立成功,当前在线数为:{} ==> 开始监听新连接:session_id = {}, sid = {},。", onlineSessionClientCount, session.getId(), uid); } /** * 连接关闭调用的方法。由前端<code>socket.close()</code>触发 * * @param uid * @param session */ @OnClose public void onClose(@PathParam("uid") String uid, Session session) { //onlineSessionIdClientMap.remove(session.getId()); // 从 Map中移除 onlineSessionClientMap.remove(uid); //在线数减1 onlineSessionClientCount.decrementAndGet(); log.info("连接关闭成功,当前在线数为:{} ==> 关闭该连接信息:session_id = {}, sid = {},。", onlineSessionClientCount, session.getId(), uid); } /** * 收到客户端消息后调用的方法。由前端<code>socket.send</code>触发 * * 当服务端执行toSession.getAsyncRemote().sendText(xxx)后,前端的socket.onmessage得到监听。 * * @param message * @param session */ @OnMessage public void onMessage(String message, Session session) { /** * html界面传递来得数据格式,可以自定义. * {"sid":"user-1","message":"hello websocket"} */ log.info("接收到消息-----------------"+message); //A发送消息给B,服务端收到A的消息后,从A的消息体中拿到B的uid及携带的手机号。查找B是否在线,如果B在线,则使用B的session发消息给B自己 Message msgObj = JsonUtils.getObject(message, Message.class); String toSid = msgObj.getUid(); String msg = msgObj.getMessage(); String phone = msgObj.getPhone(); //A给B发送消息,A要知道B的信息,发送消息的时候把B的信息携带过来 log.info("服务端收到客户端消息 ==> fromSid = {}, toSid = {}, message = {}", uid, toSid, message); sendToOne(phone, message); } /** * 发生错误调用的方法 * * @param session * @param error */ @OnError public void onError(Session session, Throwable error) { log.error("WebSocket发生错误,错误信息为:" + error.getMessage()); error.printStackTrace(); } /** * 群发消息 * * @param message 消息 */ private void sendToAll(String message) { // 遍历在线map集合 onlineSessionClientMap.forEach((onlineSid, toSession) -> { // 排除掉自己 if (!uid.equalsIgnoreCase(onlineSid)) { log.info("服务端给客户端群发消息 ==> sid = {}, toSid = {}, message = {}", uid, onlineSid, message); toSession.getAsyncRemote().sendText(message); } }); } /** * 指定发送消息 * * @param toUid * @param message */ private void sendToOne(String toUid, String message) { /* * 判断发送者是否在线 */ Session toSession = onlineSessionClientMap.get(toUid); if (toSession == null) { log.error("服务端给客户端发送消息 ==> toSid = {} 不存在, message = {}", toUid, message); return; } // 异步发送 log.info("服务端给客户端发送消息 ==> toSid = {}, message = {}", toUid, message); toSession.getAsyncRemote().sendText(message); } }
五、具体的使用步骤
1.先启动SpringBoot,会自动装载并启动WebSocketServer
2.onOpen方法达标websocket打开了,onMessage方法中可以接受各个客户端发发送的消息,onClose方法监听客户端关闭,onError方法监听错误消息
3.客户端通过如下来访问websocket
ws://主机名称:端口/websocket/{uid}来访问(连接websocket)
这里的端口指的是yml中配置的端口,/websocket/{uid}指的就是WebSocketServer类注解上配置的路径,uid可以是任意值,但最好是用户的唯一标识
好了,完结,撒花
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库