粘包是什么
喂,110 吗
粘包是什么?
基于 TCP 的应用层协议数据,处理方法只有 2 种:
1 、逐字节从 socket 读取数据,匹配起始标识和头信息,根据头信息中的数据段长度继续读取指定长度的数据段
2 、socket 收的数据全部丢入循环缓冲区,同时运行指定的分包线程从缓冲区分包取数据包处理
别用 tcp,用些上层协议(比如 websocket),解决方案也无非是自己再实现一套类似 websocket 的上层协议
自己根据自定义协议处理
Cops In Action
tcp 是流吧。。。粘包是个什么鬼。。。
在 tcp 流里读取数据,一定会有边界的概念的,我们一般在流里的前几个字节存放后面的 data 的长度,再根据这个长度获取数据流的 data 啊。
狗头伸出来
他来了他来了,他带着两个粘在一起的包来了
这得看你想处理粘(nian)包还是粘(zhan)包
是粘包(手动狗头)
正解
大胆,何人在此粘包!
想偷个懒 找个第三方插件用用
666
手写也是分分钟吧,消息头加上长度。
超过长度的数据切割出消息,末尾多的数据缓存等待新数据。
不够长度的直接缓存等待新数据。
自己重新封装下 socket 处理吧
所有能处理流的,都能处理 tcp
例如绝大部分浏览器都自带的 Streams api
https://developer.mozilla.org/en-US/docs/Web/API/Streams_API
菜。
流处理处理,协议定义好,协议头+数据内容。协议头固定长度且包括数据内容长度,然后就是按需从流数据里面取数据就好了。
月经问题,认为“粘包”是个问题,都是对“数据流“概念理解错误。
粘包警察不请自来
果然,我就知道会是这样的评论🐶
别想着直接用 socket 传数据,应用层协议不好给你吃掉的啊,楼主。
粘包警察出动
用个 rpc 吧 别手撸 tcp 了 大家都不知道怎么回答你
粘包听起来感觉就像是 一个包数据流在光纤中传输被后面一个包追上了 两人打了一架 XD
粘包警察不请自来。tcp 就是数据流协议,不存在“粘包”一说。
正确的发帖法:nodejs 有没有好用的解决粘流问题的库
有,不用 nodejs,推荐 netty
这不是一个“问题”
参考 http 协议
正解。
基于 tcp 自定义的应用层协议,自己按约定好的协议拆包即可,想找现成的工具库不现实
先看看脑子
日常粘包
看到标题就猜到下面回复是个什么样子了🤣
你又要基于 TCP 进行网络编程,你又不要定义协议的解析方式。那为什么要用 TCP 呢?你基于 http 不就可以了?
钓鱼一时爽,全家***
流就更没有粘流了,不如直接说有没有网络编程方式不用自己解析协议好了。
我是不明白既然都不愿意定义协议了,为什么还要基于 TCP 进行编程。
看到标题就知道评论区盛况了,用上层协议吧,http,websocket 都行,非要用 TCP 那就自己定义下结构,最简单的定义一个起始标志位后面有多少个字节的数据,往后逐字节读到 buffer 里。
TCP 没有粘包这个说法哈,下次注意点
正确的发帖法:nodejs 有没有好用的解决粘流问题的库
不样钓鱼
哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
你都用 nodejs 了,为啥不用 websock ? websock 读一次是一个完整的包。
粘包警察可真优越啊
还是叫乱流吧
谁钓鱼?不想回答就不回答,不要说这种“脏话”,我没惹着你
是需要定义协议的,header 固定,加个 body 长度,然后封装一下就行了,我是想如果有比较好用的库能帮我解决,我就不用自己写了
粘包这个说法从开始就是个误导加错误的概念,不知道是哪个 TCP 没学好的沙雕造出来的说法……
那你直接问有没有封装协议的库不好吗?跟谁学的“粘包”?
固定长度消息头里写消息体的长度,读取的时候不够就缓存下来不处理,等下一个包拼起来完整了再处理
netty
我也是在网上的文档中看到的粘包这个词
这两个库配合使用很好
ByteBuffer
ExBuffer
发现这个网站论坛,吹水的人比较多,务实的少。。。
而且看到想回复你总是,连个注册登录都要 VPS 跑到 google 上去。。。
没办法,我对这方面也是懵懂,所以“挨喷”也正常。感谢提供的库,我去研究研究
如果在协议头添加一个请求 ID 作为唯一标识,比如整个标识从 0 自增,问题是这段代码可以说是高频的,而协议头是固定大小的,请求 ID 早晚会溢出,这个有好的方法吗?
[为什么 TCP 要粘我的数据包]( https://www.aaronlam.xyz/2019/04/04/why-tcp-sticky-my-packet/) 可以了解一下。。
针对Node.js中TCP粘包问题,确实存在好用的库可以帮助解决,其中StickPackage是一个非常受欢迎的选择。
StickPackage是一个专门为解决TCP粘包与分包问题设计的Node.js库。它通过智能地管理数据包的边界,确保数据的准确传输。以下是一个简单的使用示例:
// 安装StickPackage
// npm install stickpackage --save
const StickPackage = require('stickpackage');
const stick = new StickPackage({
bufferSize: 512, // 设置缓冲区大小
port: 3000, // 监听端口号
timeout: 5000 // 连接超时时间(毫秒)
});
// 处理接收到的完整数据包
stick.onData(function(data) {
console.log('Received data:', data.toString());
// 在这里处理你的业务逻辑
});
// 向StickPackage中推送需要处理的数据
const data = Buffer.from([/* 你的数据 */]);
stick.putData(data);
StickPackage的核心优势在于其灵活的缓冲区管理机制,能够自动按需扩展缓冲区,避免数据丢失或损坏。此外,它还支持自定义配置,允许开发者根据具体应用场景调整缓冲策略。
通过使用StickPackage,你可以轻松解决Node.js中的TCP粘包问题,确保数据传输的准确性和可靠性。如果你正在寻找一个解决TCP粘包问题的库,StickPackage无疑是一个值得尝试的选择。