前段时间做了一个二手平台,上面有个聊天功能,今天就给它写一写,具体页面就不写了,讲一讲功能
webSocket的是一种全双工的通信技术,通过websocket可以监控前端的页面变化,当然,这得与前端协调才行,我这边之前使用的是Vue作为前端,前端需要做一些对应的配置,具体前端内容就不说了,可以百度。
这里说明一下后端,我是在springboot中来使用websocket的,使用起来很便捷
引入集成websocket的依赖
1 2 3 4
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>
|
添加配置类
1 2 3 4 5 6 7
| @Configuration public class WebSocketConfig{ @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } }
|
声明服务端发送消息和接收消息的功能
1 2 3 4 5 6
| public interface IWebSocketService { void sendMessage(String message, List<String> toSids); String getMessage(String msg); }
|
实现类
简单解释一下这个实现类,存在注释的地方就不说明了,sendMessage
其实就是服务端推送消息到另一个用户处,当然,因为是在线聊天,所以对方用户需要存在,如果不存在,你可以通过数据库将所发送的消息存储到数据库中,作为历史消息,在对方下一次上线后显示出来即可,服务端想获取消息,在onMessage
这个方法,可以获取传入的数据,前端可以发json,后端使用json解析包解析一下就可以了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
| @Slf4j @Service @ServerEndpoint("/api/websocket/{sid}") public class IWebSocketServiceImpl implements IWebSocketService { @Autowired RabbitTemplate rabbitTemplate; private static AtomicInteger onlineCount = new AtomicInteger(0); private static CopyOnWriteArraySet<IWebSocketServiceImpl> webSocketSet = new CopyOnWriteArraySet<>(); private Session session; private String sid = ""; @Override public void sendMessage(String message, List<String> toSids) { log.info("推送消息到客户端 " + toSids + ",推送内容:" + message); for (IWebSocketServiceImpl item : webSocketSet) { try { if (CollectionUtils.isEmpty(toSids)) { item.sendMessage(message); } else if (toSids.contains(item.sid)) { item.sendMessage(message); } } catch (IOException e) { continue; } } } @Override public String getMessage(String msg) { return null; }
@OnOpen public void onOpen(Session session, @PathParam("sid") String sid) { this.session = session; webSocketSet.add(this); this.sid = sid; addOnlineCount(); try {
log.info("有新客户端开始监听,sid=" + sid + ",当前在线人数为:" + getOnlineCount()); } catch (Exception e) { log.error("websocket IO Exception"); } }
@OnClose public void onClose() { webSocketSet.remove(this); subOnlineCount(); log.info("释放的sid=" + sid + "的客户端"); releaseResource(); } @OnMessage public void onMessage(String message, Session session) { log.info("收到来自客户端 sid=" + sid + " 的信息:" + message);
} private void releaseResource() { log.info("有一连接关闭!当前在线人数为" + getOnlineCount()); }
@OnError public void onError(Session session, Throwable error) { log.error(session.getAsyncRemote() + "客户端发生错误"); error.printStackTrace(); }
public void sendMessage(String message) throws IOException { this.session.getAsyncRemote().sendText(message); }
public int getOnlineCount() { return onlineCount.get(); }
public void addOnlineCount() { onlineCount.getAndIncrement(); }
public void subOnlineCount() { onlineCount.getAndDecrement(); }
public CopyOnWriteArraySet<IWebSocketServiceImpl> getWebSocketSet() { return webSocketSet; } }
|
使用起来还是非常简单的,如果有小伙伴觉得哪里写的不太正确,可以指出,感谢支持!