当前位置:   article > 正文

webSocket网页通信---使用js模拟多页面实时通信

webSocket网页通信---使用js模拟多页面实时通信

webSocket是什么

        WebSocket是一种先进的网络技术,它提供了一种在单个TCP连接上进行全双工通信的能力。传统的基于HTTP的通信是单向的,即客户端发起请求,服务器响应请求,然后连接关闭。但是,WebSocket允许服务器和客户端之间建立长时间的连接,双方可以通过该连接进行双向数据传输,而不需要客户端重新发起HTTP请求。

主要特点和优势:

  1. 全双工通信:WebSocket允许服务器和客户端之间实时、双向的数据传输,使得实时性要求较高的应用(如聊天应用、在线游戏等)可以更高效地工作。

  2. 低延迟:相比传统的HTTP轮询方式,WebSocket可以减少通信的延迟,因为不需要在每次通信中都重新建立连接。

  3. 更少的通信开销:由于WebSocket在连接建立后可以保持打开状态,不需要在每次通信中发送HTTP头部信息,从而减少了通信开销。

  4. 跨域支持:与HTTP不同,WebSocket可以跨域进行通信,这意味着可以在不同域名的服务器之间建立WebSocket连接。

  5. 安全性:WebSocket可以通过TLS/SSL进行加密,确保数据传输的安全性。

使用场景:

  • 实时聊天应用:WebSocket使得聊天应用程序能够实时地发送消息并接收响应,而无需轮询服务器。

  • 在线游戏:多人在线游戏通常需要实时的双向通信,WebSocket能够提供这种功能,以支持游戏状态同步和实时动作响应。

  • 实时数据更新:例如股票市场报价、天气预报等需要实时更新的应用可以使用WebSocket来推送数据。

  • 协作应用:多人协作编辑、协同绘图等需要多方实时互动的应用可以受益于WebSocket的实时通信能力。

        总结来说,WebSocket是一种强大的通信协议,它可以长时间保持连接状态,只需要验证一次信息就可以长时间多次的交换信息

webSocket的工作流程

        在页面中使用webSocket连接到服务器,服务器验证后开启连接,此时页面和服务器之间可以随意发送信息,同时,服务器可以和多个页面同时连接,这表示它可以实现广播效果,将数据发送给所有页面,

以上是webSocket的页面和服务端连接,和多个页面的通信模型

 webSocket对象

 WebSocket 对象提供了用于创建和管理 WebSocket 连接,以及可以通过该连接发送和接收数据的 API

WebSocket构造函数

  1. WebSocket(url[, protocols])
  2. // 返回一个 WebSocket 对象。
  3. url
  4. 通信的服务地址
  5. protocols 可选
  6. 一个协议字符串或者一个包含协议字符串的数组。

 WebSocket常量

 

 WebSocket实例属性

  • WebSocket.binaryType      使用二进制的数据类型连接。
  • WebSocket.bufferedAmount 只读       未发送至服务器的字节数。
  • WebSocket.extensions 只读        服务器选择的扩展。
  • WebSocket.onclose        用于指定连接关闭后的回调函数。
  • WebSocket.onerror      用于指定连接失败后的回调函数。
  • WebSocket.onmessage        用于指定当从服务器接受到信息时的回调函数。
  • WebSocket.onopen        用于指定连接成功后的回调函数。
  • WebSocket.protocol 只读       服务器选择的下属协议。
  • WebSocket.readyState 只读     当前的链接状态。
  • WebSocket.url 只读        WebSocket 的绝对路径。

主要的方法

关闭连接

  1. WebSocket.close(code,reason);
  2. code 可选
  3. 一个数字状态码,它解释了连接关闭的原因。如果没有传这个参数,默认使用 1005,状态码不能小于1000
  4. reason 可选
  5. 一个人类可读的字符串,它解释了连接关闭的原因。这个 UTF-8 编码的字符串不能超过 123 个字节。

 

发送数据

  1. WebSocket.send(data);
  2. data : 用于传输至服务器的数据。

 data必须是以下类型之一:

String
        文本字符串。字符串将以 UTF-8 格式添加到缓冲区,并且 bufferedAmount 将加上该字符串以 UTF-8 格式编码时的字节数的值。

ArrayBuffer
        你可以使用类型化数组对象发送底层二进制数据;其二进制数据内存将被缓存于缓冲区,bufferedAmount 将加上所需字节数的值。

Blob
        Blob 类型将队列 blob 中的原始数据以二进制中传输。 bufferedAmount 将加上原始数据的字节数的值。

ArrayBufferView
        你可以以二进制帧的形式发送任何 JavaScript 类数组对象 ;其二进制数据内容将被队列于缓冲区中。值 bufferedAmount 将加上必要字节数的值。

也就是说只能传输,字符串和二进制文件数据,有关二进制文件类型可以参考:

js二进制数据,文件---ArrayBuffer,二进制数组_js arraybuffer()-CSDN博客

js二进制数据,文件---blob对象_js 输出 blob-CSDN博客

主要事件

一共有 4 个事件:

  • open —— 连接已建立,
  • message —— 接收到数据,
  • error —— WebSocket 错误,
  • close —— 连接已关闭。

当链接状态改变时,会触发对应的事件

使用nodejs本地服务模拟webSocket服务,实现页面实时通信

新建3个文件,

index.html : 通信的页面

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>Document</title>
  7. </head>
  8. <body>
  9. <textarea name="" cols="30" rows="10" id="text"></textarea>
  10. <input type="file" name="" id="file">
  11. <script>
  12. </script>
  13. <script src="webSocket.js"></script>
  14. </body>
  15. </html>

webSocket.js:页面通信的逻辑

  1. const socket = new WebSocket('ws://localhost:5000');
  2. const text = document.getElementById('text');
  3. const file = document.getElementById('file');
  4. file.onchange = (e) => {
  5. const file = e.target.files[0];
  6. const blob = new Blob([file], { type: 'image/jpeg' });
  7. socket.send(blob);
  8. }
  9. window.onkeydown = (e) => {
  10. // console.log(e.keyCode)
  11. if (e.keyCode === 13) {//回车
  12. e.preventDefault();
  13. if (socket.readyState === WebSocket.OPEN) {
  14. socket.send(text.value);
  15. }
  16. }
  17. }
  18. socket.onopen = function (event) {
  19. console.log(socket);
  20. console.log('连接到服务器');
  21. socket.send('Hello, 服务器!');
  22. }
  23. socket.onmessage = function (event) {
  24. // console.log(event)
  25. console.log('收到消息: ', event.data);
  26. let p = document.createElement('p');
  27. p.innerText = event.data;
  28. document.body.appendChild(p);
  29. }
  30. socket.onclose = function (event) {
  31. console.log('连接已关闭');
  32. }

server.js:启动本地webSocket服务

实现webSocket本地服务需要先安装ws包

npm install ws
  1. // 启动一个支持websocket的nodejs服务
  2. const WebSocket = require('ws');
  3. const wss = new WebSocket.Server({ port: 5000 });
  4. wss.on('connection', function (ws) {
  5. ws.on('message', function (message) {
  6. // 广播消息到所有客户端,除开发送端ws
  7. wss.clients.forEach(function (client) {
  8. if (client !== ws && client.readyState === WebSocket.OPEN) {
  9. client.send("来自其他页面的消息:"+message);
  10. }
  11. });
  12. console.log('received: %s', message);
  13. ws.send('服务器收到消息:' + message);
  14. });
  15. ws.send('你已连接到WebSocket服务器');
  16. });
  17. console.log('WebSocket服务正在监听5000端口 http://localhost:5000...');

结果展示

先启动server.js :

node server.js

然后打开两个页面

在文本框中输入文字,按下回车发送到server.js本地服务,之后server.js会广播给其他连接的页面,(这里我将广播给其他页面的信息也发送给了原页面)

服务器收到消息 是本页面发送的内容,来自其他页面的消息 是其他页面发送的内容

这样就实现了两个页面的实时通信

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/795378
推荐阅读
相关标签
  

闽ICP备14008679号