一 应用
本应用使用WebSocket实现多人实时聊天
二 代码
客户端代码
Js代码  
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta name="author" content="Yeeku.H.Lee(CrazyIt.org)" />
  5. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  6. <title> 使用WebSocket通信 </title>
  7. <script type="text/javascript">
  8. // 创建Web Socket对象
  9. var webSocket = new WebSocket("ws://127.0.0.1:30000");
  10. webSocket.onopen = function()
  11. {
  12. // 为onmessage事件绑定监听器,接收消息
  13. webSocket.onmessage= function(event)
  14. {
  15. // 接收、并显示消息
  16. document.getElementById('show').innerHTML
  17. += event.data + "<br/>";
  18. }
  19. };
  20. var sendMsg = function(val)
  21. {
  22. var inputElement = document.getElementById('msg');
  23. // 发送消息
  24. webSocket.send(inputElement.value);
  25. // 清空单行文本框
  26. inputElement.value = "";
  27. }
  28. </script>
  29. </head>
  30. <body>
  31. <div style="width:600px;height:240px;
  32. overflow-y:auto;border:1px solid #333;" id="show"></div>
  33. <input type="text" size="80" id="msg" name="msg"/>
  34. <input type="button" value="发送" οnclick="sendMsg();"/>
  35. </body>
  36. </html>
服务器代码
Js代码  
  1. import java.io.*;
  2. import java.net.*;
  3. import java.nio.charset.Charset;
  4. import java.security.MessageDigest;
  5. import java.util.regex.*;
  6. import java.util.*;
  7. import sun.misc.BASE64Encoder;
  8. /**
  9. * Description:
  10. * <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a>
  11. * <br/>Copyright (C), 2001-2012, Yeeku.H.Lee
  12. * <br/>This program is protected by copyright laws.
  13. * <br/>Program Name:
  14. * <br/>Date:
  15. * @author Yeeku.H.Lee kongyeeku@163.com
  16. * @version 1.0
  17. */
  18. public class ChatServer
  19. {
  20. // 记录所有的客户端Soccket
  21. public static List<Socket> clientSockets
  22. = new ArrayList<Socket>();
  23. public ChatServer()throws IOException
  24. {
  25. // 创建ServerSocket,准备接受客户端连接
  26. ServerSocket ss = new ServerSocket(30000);
  27. while(true)
  28. {
  29. // 接收到客户端连接
  30. Socket socket = ss.accept();
  31. // 将客户端Socket添加到clientSockets集合中
  32. clientSockets.add(socket);
  33. // 启动线程
  34. new ServerThread(socket).start();
  35. }
  36. }
  37. public static void main(String[] args)
  38. throws Exception
  39. {
  40. new ChatServer();
  41. }
  42. }
  43. class ServerThread extends Thread
  44. {
  45. private Socket socket;
  46. public ServerThread(Socket socket)
  47. {
  48. this.socket = socket;
  49. }
  50. public void run()
  51. {
  52. try
  53. {
  54. // 得到Socket对应的输入流
  55. InputStream in = socket.getInputStream();
  56. // 得到Socket对应的输出流
  57. OutputStream out = socket.getOutputStream();
  58. byte[] buff = new byte[1024];
  59. String req = "";
  60. // 读取数据,此时建立与WebSocket的"握手"。
  61. int count = in.read(buff);
  62. // 如果读取的数据长度大于0
  63. if(count > 0)
  64. {
  65. // 将读取的数据转化为字符串
  66. req = new String(buff , 0 , count);
  67. System.out.println("握手请求:" + req);
  68. // 获取WebSocket的key
  69. String secKey = getSecWebSocketKey(req);
  70. System.out.println("secKey = " + secKey);
  71. String response = "HTTP/1.1 101 Switching Protocols\r\nUpgrade: "
  72. + "websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: "
  73. + getSecWebSocketAccept(secKey) + "\r\n\r\n";
  74. System.out.println("secAccept = " + getSecWebSocketAccept(secKey));
  75. out.write(response.getBytes());
  76. }
  77. int hasRead = 0;
  78. // 不断读取WebSocket发送过来的数据
  79. while((hasRead = in.read(buff)) > 0)
  80. {
  81. System.out.println("接收的字节数:" + hasRead);
  82. /*
  83. 因为WebSocket发送过来的数据遵循了一定的协议格式,
  84. 其中第3个~第6个字节是数据掩码。
  85. 从第7个字节开始才是真正的有效数据。
  86. 因此程序使用第3个~第6个字节对后面的数据进行了处理
  87. */
  88. for (int i = 0 ; i < hasRead - 6 ; i++ )
  89. {
  90. buff[i + 6] = (byte) (buff[i % 4 + 2] ^ buff[i + 6]);
  91. }
  92. // 获得从浏览器发送过来的数据
  93. String pushMsg = new String(buff
  94. , 6 , hasRead - 6 , "UTF-8");
  95. // 遍历Socket集合,依次向每个Socket发送数据
  96. for (Iterator<Socket> it = ChatServer.clientSockets.iterator()
  97. ; it.hasNext() ;)
  98. {
  99. try
  100. {
  101. Socket s = it.next();
  102. // 发送数据时,第一个字节必须与读到的第一个字节相同
  103. byte[] pushHead = new byte[2];
  104. pushHead[0] = buff[0];
  105. // 发送数据时,第二个字节记录发送数据的长度
  106. pushHead[1] = (byte) pushMsg.getBytes("UTF-8").length;
  107. // 发送前两个字节
  108. s.getOutputStream().write(pushHead);
  109. // 发送有效数据
  110. s.getOutputStream().write(pushMsg.getBytes("UTF-8"));
  111. }
  112. catch (SocketException ex)
  113. {
  114. // 如果捕捉到异常,表明该Socket已经关闭
  115. // 将该Socket从Socket集合中删除
  116. it.remove();
  117. }
  118. }
  119. }
  120. }
  121. catch (Exception e)
  122. {
  123. e.printStackTrace();
  124. }
  125. finally
  126. {
  127. try
  128. {
  129. // 关闭Socket
  130. socket.close();
  131. }
  132. catch (IOException ex)
  133. {
  134. ex.printStackTrace();
  135. }
  136. }
  137. }
  138. // 获取WebSocket请求的SecKey
  139. private String getSecWebSocketKey(String req)
  140. {
  141. //构建正则表达式,获取Sec-WebSocket-Key: 后面的内容
  142. Pattern p = Pattern.compile("^(Sec-WebSocket-Key:).+",
  143. Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
  144. Matcher m = p.matcher(req);
  145. if (m.find())
  146. {
  147. // 提取Sec-WebSocket-Key
  148. String foundstring = m.group();
  149. return foundstring.split(":")[1].trim();
  150. }
  151. else
  152. {
  153. return null;
  154. }
  155. }
  156. // 根据WebSocket请求的SecKey计算SecAccept
  157. private String getSecWebSocketAccept(String key)
  158. throws Exception
  159. {
  160. String guid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
  161. key += guid;
  162. MessageDigest md = MessageDigest.getInstance("SHA-1");
  163. md.update(key.getBytes("ISO-8859-1") , 0 , key.length());
  164. byte[] sha1Hash = md.digest();
  165. BASE64Encoder encoder = new BASE64Encoder();
  166. return encoder.encode(sha1Hash);
  167. }
  168. }
三 运行结果

 

使用WebSocket实现多人实时聊天相关推荐

  1. springboot+websocket+layui制作的实时聊天室,后端开发入门样例

    实时聊天室 前言 效果图 涉及技术 springboot layui websocket 实现思路 websocket在springboot下的实现 前端实现 建立websocket连接 前端对应的w ...

  2. 利用websocket+Vuex完成一个实时聊天软件(前端部分)

    文章目录 前言 一.效果如图 二.具体实现步骤 1.引入Vuex 2.webscoked实现 总结 前言 这篇文章主要利用websocked 建立长连接,利用Vuex全局通信的特性,以及watch,c ...

  3. websocket实现多用户一对一实时聊天

    在线聊天模实现 项目是基于node.js服务器搭建的简易双向通信网页,实现了实时更新在线人数以及用户间即时通讯的功能. 1.websocket连接创建 基于后台websocket地址创建简易的连接,并 ...

  4. WebSocket实现多人在线聊天功能

    WebSocket是现在最流行的实现多人在线聊或者私聊的技术,它可以实现客户端到客户端的通信,和以往的TCP和UDP不一样,它俩是客户端到服务端的通信,而且服务端不能直接给客户端发送消息,但是WebS ...

  5. Python+django网页设计入门(20):使用WebSocket创建多人在线聊天室

    2019年3月8日-10日公众号送书活动:中小学生Python课应该学什么 ================ 前导课程: Python+django网页设计入门(19):创建新模型扩展自带用户表的字段 ...

  6. 【java IO流项目】实现多人实时聊天室,需连接同一WiFi

    想要完成这个项目的前提条件 ①多个人连接同一WiFi在局域网里,所有人关闭防火墙,就使用中的,不会就关闭所有 ②指定一个人为服务端 ,这个人去命令行ipconfig查看自己的ipv4 这是我win11 ...

  7. 【nodejs实打造多人实时聊天室】

    server.js文件 // 加载net模块 var net = require("net"); // 创建net实例对象 var server = net.createServe ...

  8. 【详解】springboot 集成 websocket实现网页版实时聊天

    1.application.yml 配置文件 server:port: 8080spring:thymeleaf:prefix: classpath:/view/suffix: .htmlencodi ...

  9. 网页实时聊天之PHP如何实现websocket

    网页实时聊天之PHP如何实现websocket 一.总结 一句话总结: 应用 PHP 的 socket 函数库:PHP 的 socket 函数库跟 C 语言的 socket 函数非常类似 PHP 实现 ...

  10. websocket 西部数码php_网页实时聊天之PHP实现websocket

    前言 websocket 作为 HTML5 里一个新的特性一直很受人关注,因为它真的非常酷,打破了 http "请求-响应"的常规思维,实现了服务器向客户端主动推送消息,本文介绍如 ...

最新文章

  1. mysql5.6英文版安装步骤_mysql5.6版本安装步骤详解
  2. salesforce 零基础学习(六十二)获取sObject中类型为Picklist的field values(含record type)...
  3. c++ primer 习题13.39自己做的答案
  4. DBCP针对不同数据库的validationQuery
  5. 庖丁解牛TLD(三)——算法初始化
  6. Java 的布局管理器GridBagLayout的使用方法【图文说明】
  7. Hadoop生态圈-Flume的组件之sink处理器
  8. Cowrie 部署 SSH 蜜罐
  9. CAD图纸可以约束转换后图纸格式的大小吗?
  10. 三星android版本升级包下载,三星oneui3.0系统
  11. Java中BigDecimal用法
  12. ssh: connect to host github.com port 22: Connection refused
  13. 网页崩溃原因软件测试,让Web站点崩溃最常见的七大原因
  14. JAVA模拟扑克牌洗牌发牌
  15. 1168: PIPI的方格
  16. 【补充习题七】积分不等式及定积分性质
  17. 英特尔CPU详细参数表(新老CPU详细对照表)
  18. Nginx通过OpenSSL创建自签名证书配置HTTPS及二级目录
  19. NISP二级证书换CISP证书是怎么回事?
  20. 工作无聊?程序员上班没事做该怎么办!

热门文章

  1. mac/macbook触摸板/鼠标/键盘失灵
  2. 如何对NTFS文件进行压缩和加密
  3. matlab特定颜色提取
  4. java数字签名实现简单的动态秘钥
  5. C语言理论小学案例试讲,【精选】C语言试讲 演示文稿C语言试讲 演示文稿.ppt
  6. 基于单片机门电路测试
  7. ACM ICPC 2008–2009 NEERC MSC A, B, C, G, L
  8. 从C到C++___类继承(五)多重继承
  9. 安兔兔:2018年8月iOS设备性能排行榜
  10. 电信光纤猫与无线路由器连接