位置: 编程技术 - 正文

浅析nodejs实现Websocket的数据接收与发送(nodejs web3)

编辑:rootadmin

推荐整理分享浅析nodejs实现Websocket的数据接收与发送(nodejs web3),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:nodejs开发web,nodejs web项目,nodejs做网页,nodejs web3,nodejs webworker,nodejs webapi,nodejs webapi,nodejs web3,内容如对您有帮助,希望把文章链接给更多的朋友!

WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。在WebSocket API中,浏览器和服务器只需要要做一个握手(handshaking)的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

WebSocket是一个通信的协议,分为服务器和客户端。服务器放在后台,保持与客户端的长连接,完成双方通信的任务。客户端一般都是实现在支持HTML5浏览器核心中,通过提供JavascriptAPI使用网页可以建立websocket连接。

在我写这篇文章里:基于html5和nodejs相结合实现websocket即使通讯,里面主要是借助了nodejs-websocket这个插件,后来还用了socket.io做了些demo,但是,这些都是借助于别人封装好的插件做出来的,websocket到底是怎么实现的呢?之前真没想过,最近看朴灵大神的《深入浅析node.js》时候,看到了websocket那一节,看了websocket的数据帧定义,想着用nodejs实现。经过一番折腾实现了。

客户端的代码就不说了,websocket的API还是很简单的,就通过onmessage、onopen、onclose,以及send方法就可以实现了。websocket api通过onmessage、onopen、onclose以及send方法实现客户端的代码。具体详情就不多说了。

主要说服务端的代码:

首先是协议的升级,这个比较简单,就简述一下:当在客户端执行new Websocket("

上面的图中,每一列就是一个字节,一个字节总共是8位,每一位就是一个二进制数,不同位的值会对应不同的意义。

fin:指示这个是消息的最后片段。第一个片段可能也是最后的片段。如果为1即为最后片段,(其实这个位的用途我个人有点疑惑,按照书上以及网上查的资料,当数据被分片的时候,不同片应该都会有fin位,会根据fin为是不是0来判断是否为最后一帧,但是实际实现中却发现,当数据比较大需要分片时,服务端收到的数据就只有第一帧是有fin位为1,其他帧则整个帧都是数据段,也就是说,感觉这个fin位似乎用不上,至少我自己写的demo中是通过数据长度来判断是否到了最后一帧,完全没用到这个fin位是否为1来判断)

rsv1、rsv2、rsv3:各占一个位,用于扩展协商,基本上不怎么需要理,一般都是0

opcode:占四个位,可以表示0~的十进制,0表示为附加数据帧,1表示为文本数据帧,2表示二进制数据帧,8表示发送一个连接关闭的数据帧,9表示ping,表示pong,ping和pong都是用于心跳检测,当一端发送ping时,另一端必须响应pong表示自己仍处于响应状态。

浅析nodejs实现Websocket的数据接收与发送(nodejs web3)

masked:占一个位,表示是否进行掩码处理,客户端发送给服务端时为1,服务端发送给客户端时为0

payload length:占7位,或者7+位、或者7+位。如果第二个字节的后面七个位的十进制值小于或等于,则直接用这七个位表示数据长度;如果该值为,说明 <数据长度<(个位能描述的最大值,也就是个1的时候),就用第三个字节及第四个字节即个位来表示;如果该值为,则说明数据长度已经大于,个位也已经不足以描述数据长度了,就用第三到第十个字节这八个字节来描述数据长度。

masking key:当masked为1的时候才存在,用于对我们需要的数据进行解密。

payload data:我们需要的数据,如果masked为1,该数据会被加密,要通过masking key进行异或运算解密才能获取到真实数据。

帧定义解释完了,就可以根据数据来进行解析了,当有data过来的时候,先获取需要的数据信息,下面这段代码将获取到数据在data里的位置,以及数据长度,masking key以及opcode:

代码中均有注释,理解起来应该不难,直接看下一步,获取到数据信息后,就要对数据进行实际解析了:

经过上面handleDataStat方法的处理,stat中已经有了data的相关数据,先判断opcode,如果为9说明是客户端发起的ping心跳检测,直接返回pong响应,如果为则为服务端发起的心跳检测。如果有masking key,则遍历数据段,对每个字节都与masking key的字节进行异或运算(网上看到一个说法很形象:就是轮流发生X关系),^符号就是进行异或运算啦。如果没有masking key则直接通过slice方法把数据截取下来。

获取到数据后,放进datas里保存,因为有可能数据被分片了,所以再将stat里的长度减去当前数据长度,只有当stat里的长度为0的时候,说明当前帧为最后一帧,然后通过Buffer.concat将所有数据合并,此时再判断一下opcode,如果opcode为8,则说明客户端发起了一个关闭请求,而我们获取到的数据则是关闭原因。如果不为8,则这数据就是我们需要的数据。然后再将stat重置为null,datas数组置空即可。至此,我们的数据解析就完成了。

完成了客户端发来的数据解析,还需要一个服务端发数据至客户端的方法,也就是按照上面所说的帧定义来组装数据并且发送出去。下面的代码中基本上每一行都有注释,应该还是比较容易理解的。

最后还要实现一个功能,就是心跳检测:防止服务端长时间不与客户端交互而导致客户端关闭连接,所以每隔十秒都会发送一次ping进行心跳检测

至此,整个websocket的实现就完成了,此demo只是大概实现了一下websocket而已,在安全之类方面肯定还是有很多问题,若是真正生产环境中还是用socket.io这类成熟的插件比较好。不过这还是很值得一学的。

以上内容就是小编给大家分享的浅析nodejs实现Websocket的数据接收与发送的全部内容,希望大家喜欢。

基于html5和nodejs相结合实现websocket即使通讯 最近都在学习HTML5,做canvas游戏之类的,发现HTML5中除了canvas这个强大的工具外,还有WebSocket也很值得注意。可以用来做双屏互动游戏,何为双屏互动游

Nodejs初级阶段之express 上一篇《node.js初体验》写的也不错,感兴趣的朋友可以了解下。Node和NPM的安装够便捷了,不细说...有几点基础顺手提一下:1.安装命令中的-g表示全局(g

nodejs初步体验篇 前言:写这篇文章的由来:1.前段时间单位有新项目启动,服务端要做的工作不多也不算麻烦,就是处理一些中间层的服务,而且我们团队里面个个都会

标签: nodejs web3

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

上一篇:Node.js中使用socket创建私聊和公聊聊天室(nodejs的socket)

下一篇:基于html5和nodejs相结合实现websocket即使通讯(基于HTML5和CSS3的响应式Web的设计与实现)

  • 消费税是指什么税
  • 个人报销电话费怎么做分录
  • 个人所得税汇缴报告
  • 小微企业免税销售额和其他免税销售额
  • 注册资本低于实际投资
  • 不含税价怎么转化为含税价
  • 有留抵税额可以享受加计抵减吗
  • 低值易耗品按三年摊销吗
  • 进项税转出的附加税怎么做
  • 集团内关联企业有哪些
  • 废旧物资回收需要什么手续
  • 合伙企业如何计算缴纳个人所得税
  • 累计已确认收入极可能不会发生重大转回
  • 商贸企业仓储服务有哪些
  • 如何按增值税计税
  • 设置戴尔笔记本锁屏时间
  • 劳务报酬已经缴税怎么办
  • 白醋洗脸有什么好处
  • win10纯净版下载联想驱动
  • 贷款钱到账又被转出去
  • 收到发票未抵扣需要做账吗
  • 小规模纳税人没有进项发票怎么办
  • 财务费用利息收入怎么结转
  • win7系统禁用u盘
  • postman汉化包
  • Chat GPT实用案例——VUE+Chat GPT实现聊天功能教程
  • 不属于工资薪金所得的是
  • 混合销售行为的税务处理
  • 金融商品转让业务包括
  • 结转本月完工产品成本120000元
  • 工商年报纳税总额包括滞纳金吗
  • 个税申报中是否婚前各自首套贷款
  • 物资销售收入
  • php socket_create
  • php引用文件的方法
  • 共享主机和vps
  • 反射机制python
  • 所得税预缴申报表怎么填
  • 公司买办公用品是谁的工作
  • 厂房和设备折旧年限
  • 典当公司收到房款怎么办
  • 消费税增值税和个人所得税是什么意思
  • 承债式股权转让
  • 生产辅助
  • 将一个表中的字段更新到另一个表
  • 入库单入账税务会查吗
  • 增值税专用发票丢了怎么补救
  • 暂估入账的固定资产
  • 付了电费当月没有收到发票
  • 企业网银代发工资明细打印
  • 清理固定资产是什么意思
  • 银行代扣水电费发票到哪里打
  • 小企业会计准则和企业会计准则的区别
  • 建账时应取得哪些资料
  • SQLServer:探讨EXEC与sp_executesql的区别详解
  • 详解MySQL中ALTER命令的使用
  • ubuntu磁盘空间突然满了
  • win7系统弹出cd
  • 苹果今日报价
  • csrss.exe是什么进程 2个
  • 操作系统安全配置一般包括哪些内容
  • Ubuntu 14.10 “Utopic Unicorn”正式发布(附下载)
  • 虚拟光驱uiso
  • 如何把win7系统复制到u盘里
  • win7系统修改mac地址
  • Win10 Mobile 10586.71或时最适合WP8.1升级的Win10的版本
  • cocos2d怎么用
  • opengl mesa
  • Node.js中的全局对象有
  • python网络爬虫总结
  • python基础教程入门
  • 国税总局201439号公告
  • 税控设备可以在电子税务局上买吗
  • 稽查局是税务局的派出机构还是内设机构
  • 票据贴现的票据是什么
  • 纳税人办理汇算清缴
  • 沥青进口需要配额吗
  • 杭州市电子税务局官网登录
  • 广东广州税务局电话
  • 自来水公司服务热线电话
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设