websocket对java刚入门的小伙伴来说可能有点陌生,今天我们就来讲讲websocket该如何整合在springboot中及它的基本概念。
一、websocket是什么?
一种基于TCP的网络协议,如果实现了它,服务器就能够主动发送消息给客户端,客户端也能够给服务器发送消息。在HTTP协议中,通讯只能是由客户端发起,所以以前获取消息时,是在前端采用轮询方式向后端请求获取数据获取的,这样效率极低,且极易浪费资源,由此,WebSocket诞生。
二、springboot整合websocket
maven依赖导入
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> <version>2.2.0.RELEASE</version> </dependency>
配置 WebSocketConfig
package com.ruhaunxingyun.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.server.standard.ServerEndpointExporter; /** * @description: 开启WebSocket * @author: ruphie * @date: Create in 2020/6/15 12:11 * @company: ruhuanxingyun */ @Configuration public class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } }
核心类WebSocketServer编写
package com.ruhuanxingyun.websocket; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.websocket.*; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import java.io.IOException; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; /** * @description: 发送与接收消息 * @author: ruphie * @date: Create in 2020/6/15 13:24 * @company: ruhuanxingyun */ @Component @ServerEndpoint("/ws/ruhuanxingyun/{userId}") @Slf4j public class WebSocketServer { private static AtomicInteger onlineNum = new AtomicInteger(); private static Map < Long, Session > map = new ConcurrentHashMap < > (); /** * 建立连接 * * @param session session * @param userId 用户ID */ @OnOpen public void onOpen(Session session, @PathParam("userId") String userId) { int num = onlineNum.incrementAndGet(); map.put(Long.valueOf(userId), session); log.info("新建立客户端连接,sessionId为:{},当前连接数为:{}", session.getId(), num); } /** * 关闭连接 * * @param session session */ @OnClose public void onClose(Session session) { map.values() .remove(session); int num = onlineNum.decrementAndGet(); log.info("sessionId为{}的客户端连接关闭,当前剩余连接数为:{}", session.getId(), num); } /** * 客户端发送消息 * * @param session session * @param message 消息 */ @OnMessage public void onMessage(Session session, String message) { log.info("sessionId : {} , onMessage : {}", session.getId(), message); } /** * 发生错误 */ @OnError public void onError(Session session, Throwable error) { log.error("WebSocket发生错误:{},Session ID: {}", error, session.getId()); } /** * 服务器端推送消息 * * @param session session * @param message 消息 */ public static void sendMessage(Session session, String message) { try { if (session.isOpen()) { // 同步消息 session.getBasicRemote() .sendText(message); // 异步消息 //session.getAsyncRemote().sendText(message); } } catch (IOException e) { e.printStackTrace(); log.error("WebSocket发送消息出错:{}", e.getMessage()); } } }
以上就是关于springboot整合websocket的所有内容,还想知道更多java项目中常见问题解决方法及答案请一定记得关注奇Q工具网了解详情。
推荐阅读:
springboot书籍推荐,springboot书籍排行解析