位置: IT常识 - 正文

【WebSocket 协议】Web 通信的下一步进化(websocket tcpsocket)

编辑:rootadmin
【WebSocket 协议】Web 通信的下一步进化

推荐整理分享【WebSocket 协议】Web 通信的下一步进化(websocket tcpsocket),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:websocket的协议,websocket的协议,websocket协议端口,websocket wss协议,websocket协议详解,websocketd,抖音websocket协议,websocket wss协议,内容如对您有帮助,希望把文章链接给更多的朋友!

标题【手动狗头🐶】,大佬轻饶

目录一、什么是 WebSocket ?二、WebSocket 应用场景?三、代码中的 WebSocket四、一个完美的案例:在线聊天程序实现服务器chat/index.js实现客户端chat/index.htmlchat/style.css最终效果

WebSocket 是基于单个 TCP 的双向计算机通信协议。

你可以在简单的谷歌、百度搜索中找到许多类似的定义,但是我想通过一些简单和明显的例子来说明这这些。

一、什么是 WebSocket ?

作为 HTML5 计划的一部分,开发的 WebSocket 规范引入了 WebSocket JavaScript 接口,该接口定义了一个全双工单套接字连接,通过该连接可以在客户端和服务器之间发送消息。

WebSocket 标准简化了双向 Web 通信和连接管理的大部分复杂性。

与 Comet 和 Ajax 相比,WebSocket 代表了 Web 通信的下一个进化步骤。当然每种技术都有其独特的功能。

WebSocket 从 ws:// 或 wss:// 开始。它是一个有状态的协议,这意味着客户端和服务器之间的连接将保持活动状态,直到它被任何一方(客户端或服务器)终止。客户端和服务器中的任何一个关闭连接后,连接都会从两端终止。

让我们举一个客户端与服务器通信的例子,客户端是一个网络浏览器,每当我们启动客户端和服务器之间的连接时,客户端与服务器进行握手并决定创建一个新的连接和这个连接将保持活动状态,直到被其中任何一个终止。当连接建立并处于活动状态时,通信将使用相同的连接通道进行,直到终止。

以下就是 WebSocket 连接所涉及的步骤。

客户端(浏览器)向服务器发送 HTTP 请求。通过 HTTP 协议建立连接。如果服务器支持 WebSocket 协议,则同意升级连接。(握手)现在握手已经完成,初始 HTTP 连接被使用相同底层 TCP/IP 协议的 WebSocket 连接替换。此时,数据可以在 Client 和 Server 之间自由来回流动。二、WebSocket 应用场景?

首先,在不使用 WebSocket 的情况下访问网站。 网页通常通过 HTTP 连接在 Internet 上传输。为此客户端会为您执行的每个操作向服务器发出请求。使用 HTTP 访问网站时,客户端必须先向服务器提交请求。然后服务器通过发送请求的连接来响应。换句话说,HTTP 在基本的请求和响应架构上运行,会导致大量延迟。

我举一个实在点的例子:

我们平时点外卖

0秒:食物到了吗?(客户) 0秒:正在配送。(外卖小哥) 1秒:食物到了吗?(客户) 1秒:正在配送。(外卖小哥) 2秒:食物到了吗?(客户) 2秒:正在配送。(外卖小哥) 3秒:食物到了吗?(客户) 3秒:是的,先生,这是您的外卖。(外卖小哥)

这就是我们常见的所说的 HTTP 轮询。

客户端向服务器重复请求并检查是否有任何消息要接收。

如您所见,这不是很有效。我们正在使用不必要的资源,失败的请求数量也很麻烦。

有没有办法克服这个问题?

是的,有一种轮询技术可以用来克服这个缺陷,它被称为 长轮询。即:长轮询基本上涉及向服务器发出 HTTP 请求,然后保持连接打开以允许服务器稍后响应(由服务器确定)。

长轮询版本:

0秒:食物到了吗?(客户) 3秒:是的,先生,这是您的外卖。(外卖小哥)

【WebSocket 协议】Web 通信的下一步进化(websocket tcpsocket)

尽管长轮询有效,但它在 CPU、内存和带宽方面消耗的非常高(因为我们在保持连接打开时阻塞了资源)。

那么我们的救星就是:WebSocket。

WebSocket 协议的情况有所不同,可以使用动态调用方法实时调用。客户端所要做的就是通过传输 WebSocket 协议的握手来与服务器建立连接。这种握手提供了数据传输所需的所有识别信息。

客户端(Web 浏览器)初始化连接,并定期发送“心跳”以告诉服务器连接始终处于活动状态,一旦建立连接,客户端和服务器(与 http 规范相反)可以向对方发送信息(也称为服务器推送)。

这也与客户端驱动的 xmlhttprequest (ajax) 不同:客户端询问服务器它的状态是否是最新的,如果不是则更新,握手后通道保持打开状态,以实现近乎恒定的通信。

这意味着服务器可以自行传递数据,而无需客户端请求。因此,如果服务器接收到新数据,它会将其传递给客户端,而无需客户端发出特殊请求。

是不是特别好?所以应用场景也就很明显了

聊天程序社交平台网络游戏… 所有凡是需要客户端与服务端实时通信的场景都可以使用三、代码中的 WebSocket

对于 WebSocket 代码的实现,我们只需要 (编程语言或者框架名 + WebSocket) 关键词搜索引擎检索一下 就可以实现

以下为不完整统计!仅供参考~

WebSocket 目前支持以下浏览器:

Internet Explorer:版本 10 或更高版本Firefox:版本 6 或更高版本Chrome:版本 14 或更高版本Opera:版本 12.10 或更高版本Safari:版本 6 或更高版本

在服务器端,WebSocket 可以与以下编程语言和框架一起使用:

Node.jsSocket.IOWebSocket-NodewsJavaJettyPythonpyWebSocketTornadoC++Libwebsockets四、一个完美的案例:在线聊天程序

服务端: node.js 前端: html+css+javascript

实现服务器

让我们开始写服务器代码 首先,创建一个名为chat的文件夹。进入此文件夹并通过在终端中输入 npm init 初始化项目,或者 yarn init 。 现在我们已经初始化了我们的应用程序。

我们需要准备两个包

npm install ws serve-handler

这里的 ws 它是 Node.js 的纯 WebSocket 实现。

根目录的 package.json 中记得加入 "type": "module"

chat/index.jsimport {createServer} from 'http';import staticHandler from 'serve-handler';import ws, {WebSocketServer} from 'ws';// 创建服务const server = createServer((req, res) => { return staticHandler(req, res, {public: 'public'})});// 创建一个WebSocket服务器const wss = new WebSocketServer({server})// 当有新的连接时wss.on('connection', (client) => { // 客户端连接 console.log('Client connected !') client.on('message', (msg) => { // 客户端发送消息 console.log(`Message:${msg}`); broadcast(msg) })})// 发送消息function broadcast(msg) { for (const client of wss.clients) { if (client.readyState === ws.OPEN) { client.send(msg) } }}server.listen(process.argv[2] || 8080, () => { console.log(`server listening...`);})实现客户端

接下来,是时候实现我们的聊天应用程序的客户端了。本质上是一个带有一些基本 JavaScript 代码的最小 HTML 页面。

chat/index.html<!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="style.css"> <title>聊天室</title> </head> <body> <div class="container"> <p class="msg">消息:</p> <div id="messages" class="messages"></div> <form id="msgForm" class="msgForm"> <input type="text" placeholder="Send message" class="input" id="inputBox"/> <input type="submit" class="btn" value="发送"> </form> </div> <script type="text/javascript"> // 初始化 const ws = new WebSocket(`ws://localhost:8000`); ws.binaryType = "blob"; // 连接成功 ws.addEventListener("open", event => { console.log("Websocket 连接打开"); }); // 关闭连接 ws.addEventListener("close", event => { console.log("Websocket 连接关闭"); }); // 消息事件 ws.onmessage = function (message) { const msgDiv = document.createElement('div'); msgDiv.classList.add('msgCtn'); // 获取消息 if (message.data instanceof Blob) { reader = new FileReader(); // 接收到消息时触发 reader.onload = () => { msgDiv.innerHTML = reader.result; document.getElementById('messages').appendChild(msgDiv); }; // 读取消息 reader.readAsText(message.data); } else { // 显示消息 console.log("Result2: " + message.data); msgDiv.innerHTML = message.data; document.getElementById('messages').appendChild(msgDiv); } } // 发送消息 const form = document.getElementById('msgForm'); form.addEventListener('submit', (event) => { event.preventDefault(); const message = document.getElementById('inputBox').value; // 发送 ws.send(message); document.getElementById('inputBox').value = '' }) </script> </body></html>

chat/style.css

接下来我们让页面变的好看一点

html { font-size: 62%;}body { margin: 0; padding: 0; display: flex; justify-content: center;}.container { margin-top: 5rem; display: flex; flex-direction: column; width: 30%; height: 70vh;}.msg { color: blueviolet; font-size: 2rem;}.msgCtn { margin: 1rem 0; color: white; padding: 1rem 1rem; background-color: blueviolet; border-radius: 6px; font-size: 2rem}.msgForm { display: flex; flex-direction: row;}.input { height: 100%; flex: 4; margin-right: 2rem; border: none; border-radius: .5rem; padding: 2px 1rem; font-size: 1.5rem; background-color: aliceblue;}.input:focus { background-color: white;}.btn { height: 5rem; flex: 1; display: flex; justify-content: center; align-items: center; border-radius: .5rem; background-color: blueviolet; color: whitesmoke; border: none; font-size: 1.6rem;}最终效果

让我们运行

node index.js 8000

然后运行 index.html 这个就不多描述了

打开两个窗口,效果如下:

本文链接地址:https://www.jiuchutong.com/zhishi/298821.html 转载请保留说明!

上一篇:JavaScript之Ajax-axios表单提交

下一篇:【愚公系列】华为云系列之基于ModelBox搭建的AI寻车系统(愚公全名)

  • QQ空间推广你真的会用吗(qq空间推广你真实吗)

    QQ空间推广你真的会用吗(qq空间推广你真实吗)

  • 荣耀60支持鸿蒙系统吗(荣耀70pro升级鸿蒙系统)

    荣耀60支持鸿蒙系统吗(荣耀70pro升级鸿蒙系统)

  • 快手怎么搜索内容视频(快手搜索东西怎么搜索)

    快手怎么搜索内容视频(快手搜索东西怎么搜索)

  • 苹果降低白点值多少合适(苹果降低白点值调多少合适)

    苹果降低白点值多少合适(苹果降低白点值调多少合适)

  • 微信小程序定位不了位置怎么办(微信小程序定位权限怎么打开)

    微信小程序定位不了位置怎么办(微信小程序定位权限怎么打开)

  • 百家号只发视频能转正吗(百家号只要发视频就有收益吗)

    百家号只发视频能转正吗(百家号只要发视频就有收益吗)

  • 微博被屏蔽的人知道自己被屏蔽了吗(微博被屏蔽的人还能在我的发表的评论下评论我吗)

    微博被屏蔽的人知道自己被屏蔽了吗(微博被屏蔽的人还能在我的发表的评论下评论我吗)

  • 腾讯只看ta没有了吗(腾讯只看她)

    腾讯只看ta没有了吗(腾讯只看她)

  • 一体机的麦克风在哪里(一体机的麦克风能直接使用吗)

    一体机的麦克风在哪里(一体机的麦克风能直接使用吗)

  • 华为手机有红外线吗(华为手机有红外功能吗?当遥控器用)

    华为手机有红外线吗(华为手机有红外功能吗?当遥控器用)

  • picaloo华为什么型号(pic-tloo华为什么型号)

    picaloo华为什么型号(pic-tloo华为什么型号)

  • 第二代计算机用什么作为外存储器(第二代计算机用磁盘和什么作为外存储器)

    第二代计算机用什么作为外存储器(第二代计算机用磁盘和什么作为外存储器)

  • 喜马拉雅一个账号可以同时登几个(喜马拉雅可以申请几个账号)

    喜马拉雅一个账号可以同时登几个(喜马拉雅可以申请几个账号)

  • 电脑连不上网黄叹号无internet访问(电脑连不上网黄叹号)

    电脑连不上网黄叹号无internet访问(电脑连不上网黄叹号)

  • 小米手机需要贴膜吗(小米手机需要贴镜头膜吗)

    小米手机需要贴膜吗(小米手机需要贴镜头膜吗)

  • 朋友圈置顶视频怎么发(怎么用视频号发长视频到朋友圈)

    朋友圈置顶视频怎么发(怎么用视频号发长视频到朋友圈)

  • windows中回收站是指(Windows中回收站实际上是一个特殊的文件夹)

    windows中回收站是指(Windows中回收站实际上是一个特殊的文件夹)

  • ps怎么做出磨砂质感(ps怎么做出磨砂玻璃效果)

    ps怎么做出磨砂质感(ps怎么做出磨砂玻璃效果)

  • win100x80070002无法上网(win100x80070002无法开机)

    win100x80070002无法上网(win100x80070002无法开机)

  • 手机如何查询wifi密码(手机如何查询wifi密码忘记了怎么办)

    手机如何查询wifi密码(手机如何查询wifi密码忘记了怎么办)

  • 天猫的直通车在哪里找(天猫直通车页面)

    天猫的直通车在哪里找(天猫直通车页面)

  • ppt里面表格过长怎么办(ppt表格超出范围怎么办)

    ppt里面表格过长怎么办(ppt表格超出范围怎么办)

  • 抖音上怎么卖自己的商品(抖音上怎么卖自己家的脐橙)

    抖音上怎么卖自己的商品(抖音上怎么卖自己家的脐橙)

  • 三星i9600蓝牙耳机和华为手机怎样连接成功(三星charger蓝牙耳机)

    三星i9600蓝牙耳机和华为手机怎样连接成功(三星charger蓝牙耳机)

  • 功能最强大的屏幕录像工具,全面支持生成多种格式支持WIN7/WIN10/WIN11 32/64位等操作系统(目前功能最强大的手机)

    功能最强大的屏幕录像工具,全面支持生成多种格式支持WIN7/WIN10/WIN11 32/64位等操作系统(目前功能最强大的手机)

  • 个人独资企业可以核定征收吗
  • 跨月专用发票怎么冲销
  • 建筑工人的工资应该怎样支付
  • 发生福利费的会计分录
  • 境外公司委托境内公司付款
  • 会计凭证填制要求有哪些
  • 机械租赁有哪些岗位
  • 保障房异地建设费缴纳契税吗?
  • 公司注销时认缴不到位怎么办
  • 怎么填报清算所得税申报表?
  • 17%增值税发票怎么计算成13%
  • 新成立的公司银行存款如何入账
  • 个人安装设备属于劳务吗
  • 个体工商户税收优惠政策2023年最新
  • 企业所得税审计的内容包括哪四个方面
  • 水电费没有发票怎么报销
  • 耕地占用税与土地出让金
  • 外贸企业进项税额
  • 跨年度多计提的印花税怎么冲回
  • 计提附加税的会计分录怎么写
  • 质保金怎么挂账
  • 模具费用如何平摊到产品上
  • win11安卓子系统教程
  • 360压缩怎么压缩到指定大小
  • 公司财务账目不符怎么办
  • 向境外股东分配利润怎么交税
  • 土地增值税清算全流程实战案例
  • 职工福利费会计账务处理
  • PHP:imagepsloadfont()的用法_GD库图像处理函数
  • 解决问题
  • 应付职工薪酬的明细科目有哪些
  • 固定资产转让税金怎么算
  • 保洁费入账
  • 公允价值变动损益在利润表哪里
  • 递延收益与递延所得税资产的区别
  • phpemail正则
  • gridview怎么连接数据库
  • 小规模纳税人什么意思
  • 小企业的准备阶段是创办企业吗
  • 员工差旅费报销会计分录
  • 付款后发票的扩张怎么开
  • 劳务分包的三种形式
  • 工程项目该如何分类
  • 设备维修会计分录如何写
  • 员工持股平台合伙企业
  • 没有发票如何做会计分录
  • 转出未交增值税最终怎么转平
  • 土地使用税如何计算公式
  • 出口免税项目
  • 金蝶迷你版为什么打不开
  • 小规模公司购买汽车如何抵税
  • 商贸企业固定资产可以一次性扣除吗?
  • 投入产出比的计算依据
  • 设置行政机构的主要依据是
  • sql事务的例子
  • mysql定义语句
  • ubuntu安装软件教程
  • xp剪贴板怎么打开
  • windows vista server
  • 宏基笔记本一键恢复系统
  • win10 win7兼容模式
  • windows如何关闭
  • 在linux系统中
  • win7怎么设置鼠标双击打开
  • wp8.1升级10
  • unity项目资源
  • 批处理统计文件夹内文件大小
  • css使用教程
  • python网络爬虫程序
  • 如何大小写字母转换
  • ssh,scp自动登陆的实现方法
  • js实现表单提交
  • unity 3d ui
  • 手游 unity
  • js function函数
  • jquery遍历div子元素
  • javascript定义数组的方法
  • js正则regexp
  • 成都市老年公交卡年审地点
  • 法人变更税务登记表怎么填
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设