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

news2024/11/16 8:23:45

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构造函数

WebSocket(url[, protocols])
// 返回一个 WebSocket 对象。

url 
通信的服务地址


protocols 可选
一个协议字符串或者一个包含协议字符串的数组。

 WebSocket常量

 

 WebSocket实例属性

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

主要的方法

关闭连接

WebSocket.close(code,reason);

code 可选
一个数字状态码,它解释了连接关闭的原因。如果没有传这个参数,默认使用 1005,状态码不能小于1000

reason 可选
一个人类可读的字符串,它解释了连接关闭的原因。这个 UTF-8 编码的字符串不能超过 123 个字节。

 

发送数据

WebSocket.send(data);

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 : 通信的页面

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <textarea name="" cols="30" rows="10" id="text"></textarea>
  <input type="file" name="" id="file">
  <script>
  </script>
  <script src="webSocket.js"></script>
</body>
</html>

webSocket.js:页面通信的逻辑

const socket = new WebSocket('ws://localhost:5000');
const text = document.getElementById('text');
const file = document.getElementById('file');

file.onchange = (e) => {
  const file = e.target.files[0];
  const blob = new Blob([file], { type: 'image/jpeg' });
  socket.send(blob);
}

window.onkeydown = (e) => {
  // console.log(e.keyCode)

  if (e.keyCode === 13) {//回车
    e.preventDefault();
    if (socket.readyState === WebSocket.OPEN) {
      socket.send(text.value);
    }

  }
}
socket.onopen = function (event) {
  console.log(socket);
  console.log('连接到服务器');
  socket.send('Hello, 服务器!');
}

socket.onmessage = function (event) {
  // console.log(event)
  console.log('收到消息: ', event.data);

  let p = document.createElement('p');
  p.innerText = event.data;
  document.body.appendChild(p);


}

socket.onclose = function (event) {
  console.log('连接已关闭');
}

server.js:启动本地webSocket服务

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

npm install ws
// 启动一个支持websocket的nodejs服务
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 5000 });

wss.on('connection', function (ws) {
  ws.on('message', function (message) {
    
    // 广播消息到所有客户端,除开发送端ws
    wss.clients.forEach(function (client) {
      if (client !== ws && client.readyState === WebSocket.OPEN) {
        client.send("来自其他页面的消息:"+message);
      }
    });

      console.log('received: %s', message);
      ws.send('服务器收到消息:' + message);
  });

  ws.send('你已连接到WebSocket服务器');
});

console.log('WebSocket服务正在监听5000端口 http://localhost:5000...');

结果展示

先启动server.js :

node server.js

然后打开两个页面

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1892380.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx系列(二)---Mac上的快速使用

一、安装 前置软件&#xff1a;Homebrew 安装方法&#xff1a;终端输入/bin/bash -c "$(curl -fsSL <https://cdn.jsdelivr.net/gh/ineo6/homebrew-install/install.sh>)"更新&#xff1a; brew update 设置中科大镜像源&#xff1a;git -C "$(brew --r…

【串口通信】之TTL电平

1. 什么是串口 串口,全称为串行通信端口,是一种计算机硬件接口,用于实现数据的串行传输。与并行通信不同,串口通信一次只传输一个比特,数据通过串行线按顺序传输。串口通信在嵌入式系统、工业控制、计算机与外围设备通信等领域非常常见 2. 什么是串口通信 串口通信是指通过…

和闺蜜的泰国之旅

每当我回想起那次和闺蜜丽丽&#xff08;全名罗莉&#xff09;的泰国之旅&#xff0c;心中总是涌起复杂的情绪。那段经历仿佛一场噩梦&#xff0c;至今仍无法从脑海中挥去。 我们满怀期待地抵达曼谷&#xff0c;热带的阳光、繁忙的街道、美味的街头小吃&#xff0c;都让我们兴…

Redis 管道(Pipeline)是什么?有什么用?

目录 1. redis 客户端-服务端模型的不足之处 2. redis 管道是什么&#xff1f;有什么好处&#xff1f; 3. 管道的使用场景 4. 管道使用的注意事项 1. redis 客户端-服务端模型的不足之处 众所周知&#xff0c;redis 是一个客户端-服务端的模型设计&#xff0c;客户端向服务…

树莓派0 2W重启后突然没有声音

树莓派0 2W重启后突然没有声音。 最近在使用该板卡。重启后突然出现了显示器不能显示界面的情况&#xff0c;接着用putty的ssh方式连接该板卡&#xff0c;能连上。使用vnc方式连接该板卡&#xff0c;也能连上。后来通过修改/boot/config.txt文件&#xff0c;能在显示器上显示界…

WordPress付费进群V2主题,多种引流方法,引私域二次变现

全新前端UI界面&#xff0c;多种前端交互特效让页面不再单调&#xff0c;进群页面群成员数&#xff0c;群成员头像名称&#xff0c;每次刷新页面随机更新不重复&#xff0c;最下面评论和点赞也是如此随机刷新不重复 进群页面简介&#xff0c;群聊名称&#xff0c;群内展示&…

2024年小米SU7维修手册和电路图线路图接线图资料更新

此次更新了2024年小米SU7维修手册和电路图资料&#xff0c;覆盖市面上99%车型&#xff0c;包括维修手册、电路图、新车特征、车身钣金维修数据、全车拆装、扭力、发动机大修、发动机正时、保养、电路图、针脚定义、模块传感器、保险丝盒图解对照表位置等等&#xff01; 汽修帮…

ctfshow-web入门-命令执行(web119、web120、web121、web122)

目录 1、web119 2、web120 3、web121 4、web122 1、web119 采用 118 的 payload&#xff0c;回显 evil input&#xff0c;说明新增了过滤 单独测试一下&#xff0c;是 PATH 、BASH 被过滤了 在上一题的基础上&#xff0c;我们再介绍一个内置变量&#xff1a;$RANDOM 它会…

用Python轻松转换Markdown文件为PDF文档

Markdown&#xff0c;以其简洁的语法和易于阅读的特性&#xff0c;成为了许多作家、开发者和学生记录思想、编写教程或撰写报告的首选格式。然而&#xff0c;在分享或打印这些文档时&#xff0c;Markdown的纯文本形式可能无法满足对版式和布局的专业需求。而将Markdown转换为PD…

mac 上 Docker Desktop的免费开源的替代工具Colima

当谈到在macOS上运行容器时&#xff0c;Docker长期以来一直是首选。但是&#xff0c;必须解决使用适用于macOS的Docker Desktop时出现的一些限制&#xff0c;特别是对于大中型公司&#xff0c;最大的问题是需要购买许可证。另外&#xff0c;macOS 版Docker Desktop的性能问题也…

Go语言实现钉钉机器人接入Dify工作流

go语言实现实现钉钉机器人接入dify工作流&#xff0c;完成ai 流式问答 代码地址 有用的话点个star github地址 效果 配置使用 修改.env_template文件 为.env 设置.env文件内的环境变量 API_KEY: dify的api_keyAPI_URL: dify 的api接口CLIENT_ID : 钉钉机器人应用的idCLIENT…

护眼指南之适合学生写作业的台灯:看看学生护眼台灯哪个品牌好

随着人们健康意识的提高&#xff0c;越来越多的人开始关注眼睛的健康问题&#xff0c;照明技术的进步也为缓解眼疲劳提供了可能&#xff0c;现在的照明产品可以通过调整光线亮度、色温、频闪等参数&#xff0c;使光线更加柔和、均匀&#xff0c;减少眼睛的不适感。人们都希望通…

孕产妇健康管理信息平台,多家医院产科广泛运用,系统稳定,功能齐全 产科管理系统源码,三甲医院产科电子病历系统成品源代码

孕产妇健康管理信息平台&#xff0c;多家医院产科广泛运用&#xff0c;系统稳定&#xff0c;功能齐全 产科管理系统源码&#xff0c;三甲医院产科电子病历系统成品源代码 女性生育过程会面临许多的困难和问题&#xff0c;需要经常性地前往医院做详细的身心检查&#xff0c;在…

【python】Data Augmentation

参考学习来自&#xff1a;使用PythonOpenCV进行数据增广方法综述&#xff08;附代码演练&#xff09; 文章目录 Random CutCutoutColor JitterAdd Noisy Random Cut 随机裁剪图片中的长款缩放为 scale 倍的区域&#xff0c;resize 到原图大小&#xff0c;bounding box 的坐标也…

6域名系统DNS

《计算机网络》第7版&#xff0c;谢希仁 每次记不清楚的知识点&#xff0c;通过上网查找&#xff0c;总是只能看到很零碎的答案。最后还是最喜欢看这个版本的书&#xff0c;一看就回忆起来了&#xff0c;逻辑严谨&#xff0c;循循善诱&#xff0c;知识讲解的全面又清晰&#xf…

Elasticsearch:结合稀疏、密集和地理字段

作者&#xff1a;来自 Elastic Madhusudhan Konda 如何以自定义方式组合多个稀疏、密集和地理字段 Elasticsearch 是一款强大的工具&#xff0c;可用于近乎实时地搜索和分析数据。作为开发人员&#xff0c;我们经常会遇到包含各种不同字段的数据集。有些字段是必填字段&#x…

Cartoon UI(游戏卡通UI图标界面按钮框架)

卡通UI是一套完整的艺术UI组件&#xff0c;图标&#xff0c;按钮&#xff0c;将非常适合你的游戏项目。 所有组件都是高质量的&#xff0c;在专业水平上实现&#xff0c;并具有透明的背景&#xff0c;因此您可以将其放置在任何需要的表面上。 卡通UI包括&#xff1a; -按钮&…

VIO(Virtual_Input_Output) IP 使用笔记

VIO&#xff08;Virtual Input/Output&#xff09;IP 核&#xff0c;即虚拟输入输出 IP&#xff0c;可以通过调试界面模拟 IO 的变化&#xff0c;这可以在板子没有按键等外设、或外设不足的情况下&#xff0c;来模拟外部输入。然而网上关于 VIO 的教程都说的不是很清楚&#xf…

如何学习大型语言模型中的量化

前言 图片来自作者&#xff1a;Flow 展示了量化的必要性。&#xff08;笑脸和生气脸图片来自Yan Krukau) 在我解释上面的图表之前&#xff0c;让我先介绍一下您将在本文中学习的重点内容。 首先&#xff0c;您将了解量化是什么以及为什么量化。接下来&#xff0c;您将深入了解…

sssssssssssssssshare_ptrrrrrrrrrrrrrrrrrrrrrrrrr

智能指针——shared_ptr的原理及仿写 shared_ptr的原理及仿写 共享指针允许多个指针指向同一份数据&#xff0c;因为它使用了引用计数&#xff0c;每多一个指针指向这个数据&#xff0c;引用技术加一&#xff0c;每销毁一个指针&#xff0c;引用技术减一&#xff0c;如果引用计…