[[IT知识]] WebSocket技术革新:打造高效实时通信系统

[复制链接]
查看: 36|回复: 0
发表于 2025-1-19 22:40:57 | 显示全部楼层 | 阅读模式
易博V9下载

WebSocket技术革新:打造高效实时通信系统

开头还是说点废话吧。WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。

WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

现在,很多网站为了实现推送技术,所用的技术都是 Ajax 轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。

HTML5 定义的 WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。


WebSocket技术革新:打造高效实时通信系统

从GitEE上搞了一个项目下来,然后精简和调整,尽量把代码调整到一看就懂。

项目就是普通的SpringBoot,没有用的东西全部移除,只需要一张表,当然也可以不用登陆,这样更精简。

核心代码就是ServerEndpoint的处理类:

  1. package boot.spring.service;
  2. import java.io.IOException;
  3. import java.util.Date;
  4. import java.util.concurrent.ConcurrentHashMap;
  5. import javax.websocket.OnClose;
  6. import javax.websocket.OnError;
  7. import javax.websocket.OnMessage;
  8. import javax.websocket.OnOpen;
  9. import javax.websocket.Session;
  10. import javax.websocket.server.PathParam;
  11. import javax.websocket.server.ServerEndpoint;
  12. import org.springframework.stereotype.Component;
  13. import com.alibaba.fastjson.JSON;
  14. import boot.spring.po.Message;
  15. @ServerEndpoint("/webSocket/{username}")
  16. @Component
  17. public class WebSocketServer {
  18. // concurrent包的线程安全Set,用来存放每个客户端对应的WebSocketServer对象。
  19. private static ConcurrentHashMap<String, Session> sessionPools = new ConcurrentHashMap<>();
  20. // 建立连接成功调用
  21. @OnOpen
  22. public void onOpen(Session session, @PathParam(value = "username") String userName) {
  23. // 链接建立,存储链接对象
  24. sessionPools.put(userName, session);
  25. // 广播上线消息
  26. Message msg = new Message();
  27. msg.setFrom("系统消息");
  28. msg.setDate(new Date());
  29. msg.setTo("0");
  30. msg.setText(userName);
  31. broadcast(JSON.toJSONString(msg, true));
  32. }
  33. // 关闭连接时调用
  34. @OnClose
  35. public void onClose(@PathParam(value = "username") String userName) {
  36. sessionPools.remove(userName);
  37. // 广播下线消息
  38. Message msg = new Message();
  39. msg.setFrom("系统消息");
  40. msg.setDate(new Date());
  41. msg.setTo("-2");
  42. msg.setText(userName);
  43. broadcast(JSON.toJSONString(msg, true));
  44. }
  45. // 收到客户端信息后,根据接收人的username把消息推下去或者群发
  46. // to=-1群发消息
  47. @OnMessage
  48. public void onMessage(String message) throws IOException {
  49. Message msg = JSON.parseObject(message, Message.class);
  50. msg.setDate(new Date());
  51. if (msg.getTo().equals("-1")) {
  52. broadcast(JSON.toJSONString(msg, true)); // -1群发
  53. } else {
  54. sendInfo(msg.getTo(), JSON.toJSONString(msg, true));
  55. }
  56. }
  57. // 错误时调用
  58. @OnError
  59. public void onError(Session session, Throwable throwable) {
  60. throwable.printStackTrace();
  61. }
  62. // 给指定用户发送信息
  63. public void sendInfo(String userName, String message) {
  64. Session session = sessionPools.get(userName);
  65. try {
  66. sendMessage(session, message);
  67. } catch (Exception e) {
  68. e.printStackTrace();
  69. }
  70. }
  71. // 群发消息
  72. public void broadcast(String message) {
  73. for (Session session : sessionPools.values()) {
  74. try {
  75. sendMessage(session, message);
  76. } catch (Exception e) {
  77. e.printStackTrace();
  78. continue;
  79. }
  80. }
  81. }
  82. // 发送消息
  83. public void sendMessage(Session session, String message) throws IOException {
  84. if (session != null) {
  85. synchronized (session) {
  86. session.getBasicRemote().sendText(message);
  87. }
  88. }
  89. }
  90. public static ConcurrentHashMap<String, Session> getSessionPools() {
  91. return sessionPools;
  92. }
  93. }
复制代码

聊天室页面代码:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>聊天室</title>
  5. <link rel="stylesheet" href="./css/bootstrap.min.css" />
  6. <script src="./js/jquery-1.12.3.min.js"></script>
  7. <script src="./js/bootstrap.min.js"></script>
  8. <style>
  9. body {
  10. margin-top: 5px;
  11. }
  12. </style>
  13. </head>
  14. <body>
  15. <div>
  16. <p>登陆效果图如下,用aa,bb,cc登陆:</p>
  17. <p>三个人依次进入聊天室后效果如下,可以群发消息和点击登陆的用户私聊</p>
  18. <p>私聊时效果如下</p>
  19. </div>
  20. </body>
  21. </html>
复制代码

代码下载:

END

易博软件介绍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1、请认真发帖,禁止回复纯表情,纯数字等无意义的内容!帖子内容不要太简单!
2、提倡文明上网,净化网络环境!抵制低俗不良违法有害信息。
3、如果你对主帖作者的帖子不屑一顾的话,请勿回帖。谢谢合作!
3、问答求助区发帖求助后,如有其他用户热心帮您解决问题后,请自觉点击设为最佳答案按钮。

 
 
QQ在线客服
QQ技术支持
工作时间:
8:00-18:00
软著登字:
1361266号
官方微信扫一扫
weixin

QQ|小黑屋|Archiver|慈众营销 ( 粤ICP备15049986号 )|网站地图

自动发帖软件 | 自动发帖器 | 营销推广软件 | 网络营销工具 | 网络营销软件 | 网站推广工具 | 网络推广软件 | 网络推广工具 | 网页推广软件 | 信息发布软件 | 网站推广工具 | 网页推广软件

Powered by Discuz! X3.4   © 2012-2020 Comsenz Inc.  慈众科技 - Collect from 深圳吉宝泰佛文化有限公司 公司地址:罗湖区黄贝街道深南东路集浩大厦A1403

返回顶部 返回列表