文章目录
概述项目集成引入依赖创建配置类WebSocketServer测试
概述
WebSocket协议是基于TCP的一种网络协议。WebSocket实现了客户端与服务器全双工通信,既然是全双工,就说明服务器可以主动发送信息给客户端。项目集成
引入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId></dependency>
创建配置类
@Configurationpublic class WebSocketConfig { /** * ServerEndpointExporter 作用 * * 这个Bean会自动注册使用@ServerEndpoint注解声明的websocket endpoint * */@Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); }}
WebSocketServer
@Slf4j@Component@ServerEndpoint("/webSocket/{username}")public class WebSocketServer { //concurrent包的线程安全Set,用来存放每个客户端对应的WebSocketServer对象。 private static ConcurrentHashMap<String, Session> sessionPools = new ConcurrentHashMap<>(); //发送消息 public void sendMessage(Session session, String message) throws IOException { if(session != null){ synchronized (session) { System.out.println("发送数据:" + message); session.getBasicRemote().sendText(message); } } } //给指定用户发送信息 public void sendInfo(String userName, String message){ Session session = sessionPools.get(userName); try { sendMessage(session, message); }catch (Exception e){ e.printStackTrace(); } } //建立连接成功调用 @OnOpen public void onOpen(Session session, @PathParam(value = "username") String userName){ sessionPools.put(userName, session); log.info("有新连接加入:{}", userName); Result result = new Result<>(); result.setCode("success"); result.setData(userName + "连接成功"); sendInfo(userName,JSONUtil.toJsonStr(result)); } //关闭连接时调用 @OnClose public void onClose(@PathParam(value = "username") String userName){ sessionPools.remove(userName); } //错误时调用 @OnError public void onError(Session session, Throwable throwable){ System.out.println("发生错误"); throwable.printStackTrace(); } public static ConcurrentHashMap<String, Session> getSessionPools() { return sessionPools; }}
@ServerEndpoint
@ServerEndpoint 注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端, 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端。@OnOpen
当 websocket 建立连接成功后会触发这个注解修饰的方法,注意它有一个 Session 参数@OnClose
当 websocket 建立的连接断开后会触发这个注解修饰的方法。@OnMessage
当客户端发送消息到服务端时,会触发这个注解修改的方法,它有一个 String 入参表明客户端传入的值@OnError
当 websocket 建立连接时出现异常会触发这个注解修饰的方法,注意它有一个 Session 参数。服务端如何发送消息给客户端
服务端发送消息必须通过上面的 Session 类,通常是在@OnOpen
方法中,当连接成功后把 session 存入 Map 的 value,key 是与 session 对应的用户标识,当要发送的时候通过 key 获得 session 再发送,这里可以通过 session.getBasicRemote().sendText(message)
来对客户端发送消息。 测试
http://www.websocket-test.com/你知道的越多,你不知道的越多。