nodejs 有没有好用的解决粘包问题的库?

2020-10-12 14:00:00 +08:00
 cl903254852
8545 次点击
所在节点    Node.js
58 条回复
temporary
2020-10-12 14:10:11 +08:00
粘包是什么
Mohanson
2020-10-12 14:12:35 +08:00
喂,110 吗
LANB0
2020-10-12 14:15:58 +08:00
粘包是什么?
基于 TCP 的应用层协议数据,处理方法只有 2 种:
1 、逐字节从 socket 读取数据,匹配起始标识和头信息,根据头信息中的数据段长度继续读取指定长度的数据段
2 、socket 收的数据全部丢入循环缓冲区,同时运行指定的分包线程从缓冲区分包取数据包处理
mxT52CRuqR6o5
2020-10-12 14:26:38 +08:00
别用 tcp,用些上层协议(比如 websocket),解决方案也无非是自己再实现一套类似 websocket 的上层协议
stephenxiaxy
2020-10-12 14:27:57 +08:00
自己根据自定义协议处理
no1xsyzy
2020-10-12 14:28:37 +08:00
Cops In Action
joyhub2140
2020-10-12 14:59:23 +08:00
tcp 是流吧。。。粘包是个什么鬼。。。

在 tcp 流里读取数据,一定会有边界的概念的,我们一般在流里的前几个字节存放后面的 data 的长度,再根据这个长度获取数据流的 data 啊。
nutting
2020-10-12 15:02:34 +08:00
狗头伸出来
dallaslu
2020-10-12 15:03:26 +08:00
他来了他来了,他带着两个粘在一起的包来了
GM
2020-10-12 15:03:37 +08:00
@joyhub2140
大部分是初学者不理解 stream 这个概念,总以为发送方 send 了一次,接收方 read 一次就能读到完整内容(恰恰好完整,不多也不少),结果实际发现 read 出来的内容有时候多、有时候少、又有时候刚刚好相同,百思不得其解,最后有人对这种现象造出一个词:“粘包”。
noe132
2020-10-12 15:21:00 +08:00
这得看你想处理粘(nian)包还是粘(zhan)包
cl903254852
2020-10-12 15:59:08 +08:00
@noe132 是粘包(手动狗头)
cl903254852
2020-10-12 16:02:11 +08:00
@GM 正解
wysnylc
2020-10-12 16:03:11 +08:00
大胆,何人在此粘包!
cl903254852
2020-10-12 16:04:14 +08:00
@stephenxiaxy 想偷个懒 找个第三方插件用用
cl903254852
2020-10-12 16:04:38 +08:00
livepps
2020-10-12 16:04:45 +08:00
手写也是分分钟吧,消息头加上长度。
超过长度的数据切割出消息,末尾多的数据缓存等待新数据。
不够长度的直接缓存等待新数据。
opengps
2020-10-12 16:15:29 +08:00
自己重新封装下 socket 处理吧
reus
2020-10-12 16:23:23 +08:00
所有能处理流的,都能处理 tcp
例如绝大部分浏览器都自带的 Streams api
https://developer.mozilla.org/en-US/docs/Web/API/Streams_API
菜。
Chenamy2017
2020-10-12 16:50:49 +08:00
流处理处理,协议定义好,协议头+数据内容。协议头固定长度且包括数据内容长度,然后就是按需从流数据里面取数据就好了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/714154

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX