nodejs 有没有好用的解决粘包问题的库? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cl903254852
V2EX    Node.js

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

  •  
  •   cl903254852 2020-10-12 14:00:00 +08:00 9180 次点击
    这是一个创建于 1825 天前的主题,其中的信息可能已经有所发展或是发生改变。
    58 条回复    2020-10-30 20:05:41 +08:00
    temporary
        1
    temporary  
       2020-10-12 14:10:11 +08:00
    粘包是什么
    Mohanson
        2
    Mohanson  
       2020-10-12 14:12:35 +08:00 via Android   29
    喂,110 吗
    LANB0
        3
    LANB0  
       2020-10-12 14:15:58 +08:00
    粘包是什么?
    基于 TCP 的应用层协议数据,处理方法只有 2 种:
    1 、逐字节从 socket 读取数据,匹配起始标识和头信息,根据头信息中的数据段长度继续读取指定长度的数据段
    2 、socket 收的数据全部丢入循环缓冲区,同时运行指定的分包线程从缓冲区分包取数据包处理
    mxT52CRuqR6o5
        4
    mxT52CRuqR6o5  
       2020-10-12 14:26:38 +08:00 via Android   1
    别用 tcp,用些上层协议(比如 websocket),解决方案也无非是自己再实现一套类似 websocket 的上层协议
    stephenxiaxy
        5
    stephenxiaxy  
       2020-10-12 14:27:57 +08:00
    自己根据自定义协议处理
    no1xsyzy
        6
    no1xsyzy  
       2020-10-12 14:28:37 +08:00
    Cops In Action
    nxforce
        7
    nxforce  
       2020-10-12 14:59:23 +08:00
    tcp 是流吧。。。粘包是个什么鬼。。。

    在 tcp 流里读取数据,一定会有边界的概念的,我们一般在流里的前几个字节存放后面的 data 的长度,再根据这个长度获取数据流的 data 啊。
    nutting
        8
    nutting  
       2020-10-12 15:02:34 +08:00
    狗头伸出来
    dallaslu
        9
    dallaslu  
       2020-10-12 15:03:26 +08:00   3
    他来了他来了,他带着两个粘在一起的包来了
    GM
        10
    GM  
       2020-10-12 15:03:37 +08:00
    @joyhub2140
    大部分是初学者不理解 stream 这个概念,总以为发送方 send 了一次,接收方 read 一次就能读到完整内容(恰恰好完整,不多也不少),结果实际发现 read 出来的内容有时候多、有时候少、又有时候刚刚好相同,百思不得其解,最后有人对这种现象造出一个词:“粘包”。
    noe132
        11
    noe132  
       2020-10-12 15:21:00 +08:00 via Android
    这得看你想处理粘(nian)包还是粘(zhan)包
    cl903254852
        12
    cl903254852  
    OP
       2020-10-12 15:59:08 +08:00
    @noe132 是粘包(手动狗头)
    cl903254852
        13
    cl903254852  
    OP
       2020-10-12 16:02:11 +08:00
    @GM 正解
    wysnylc
        14
    wysnylc  
       2020-10-12 16:03:11 +08:00   9
    大胆,何人在此粘包!
    cl903254852
        15
    cl903254852  
    OP
       2020-10-12 16:04:14 +08:00
    @stephenxiaxy 想偷个懒 找个第三方插件用用
    cl903254852
        16
    cl903254852  
    OP
       2020-10-12 16:04:38 +08:00
    livepps
        17
    livepps  
       2020-10-12 16:04:45 +08:00
    手写也是分分钟吧,消息头加上长度。
    超过长度的数据切割出消息,末尾多的数据缓存等待新数据。
    不够长度的直接缓存等待新数据。
    opengps
        18
    opengps  
       2020-10-12 16:15:29 +08:00 via Android
    自己重新封装下 socket 处理吧
    reus
        19
    reus  
       2020-10-12 16:23:23 +08:00
    所有能处理流的,都能处理 tcp
    例如绝大部分浏览器都自带的 Streams api
    https://developer.mozilla.org/en-US/docs/Web/API/Streams_API
    菜。
    Chenamy2017
        20
    Chenamy2017  
       2020-10-12 16:50:49 +08:00
    流处理处理,协议定义好,协议头+数据内容。协头固定长度且包括数据内容长度,然后就是按需从流数据里面取数据就好了。
    muzuiget
        21
    muzuiget  
       2020-10-12 16:54:39 +08:00
    月经问题,认为“粘包”是个问题,都是对“数据流“概念理解错误。
    back0893
        22
    back0893  
       2020-10-12 16:55:37 +08:00 via Android   2
    粘包警察不请自来
    imherer
        23
    imherer  
       2020-10-12 17:05:44 +08:00
    果然,我就知道会是这样的评论
    xuanbg
        24
    xuanbg  
       2020-10-12 17:19:39 +08:00
    别想着直接用 socket 传数据,应用层协议不好给你吃掉的啊,楼主。
    ochatokori
        25
    ochatokori  
       2020-10-12 17:23:36 +08:00 via Android
    粘包警察出动
    zunceng
        26
    zunceng  
       2020-10-12 17:24:30 +08:00
    用个 rpc 吧 别手撸 tcp 了 大家都不知道怎么回答你
    PepperEgg
        27
    PepperEgg  
       2020-10-12 17:25:00 +08:00
    粘包听起来感觉就像是 一个包数据流在光纤中传输被后面一个包追上了 两人打了一架 XD
    boris93
        28
    boris93  
       2020-10-12 17:27:13 +08:00 via Android
    @PepperEgg 是追尾 /滑稽
    yolee599
        29
    yolee599  
       2020-10-12 17:36:29 +08:00
    粘包警察不请自来。tcp 就是数据流协议,不存在“粘包”一说。
    zsdroid
        30
    zsdroid  
       2020-10-12 17:41:30 +08:00
    正确的发帖法:nodejs 有没有好用的解决粘流问题的库
    shyling
        31
    shyling  
       2020-10-12 17:43:16 +08:00
    有,不用 nodejs,推荐 netty
    lingxi27
        32
    lingxi27  
       2020-10-12 17:44:39 +08:00
    这不是一个“问题”
    bleepbloop
        33
    bleepbloop  
       2020-10-12 17:47:36 +08:00
    参考 http 协议
    BreadBig
        34
    BreadBig  
       2020-10-12 18:53:55 +08:00
    @Chenamy2017 正解。
    基于 tcp 自定义的应用层协议,自己按约定好的协议拆包即可,想找现成的工具库不现实
    leafdream
        35
    leafdream  
       2020-10-12 19:13:34 +08:00
    先看看脑子
    monkeyWie
        36
    monkeyWie  
       2020-10-12 19:40:48 +08:00 via Android
    日常粘包
    icyalala
        37
    icyalala  
       2020-10-12 19:48:23 +08:00   2
    看到标题就猜到下面回复是个什么样子了
    neoblackcap
        38
    neoblackcap  
       2020-10-12 19:53:20 +08:00
    @cl903254852 你又要基于 TCP 进行网络编程,你又不要定义协议的解析方式。那为什么要用 TCP 呢?你基于 http 不就可以了?
    masker
        39
    masker  
       2020-10-12 19:54:33 +08:00 via Android
    钓鱼一时爽,全家***
    neoblackcap
        40
    neoblackcap  
       2020-10-12 19:55:32 +08:00
    @zsdroid 流就更没有粘流了,不如直接说有没有网络编程方式不用自己解析协议好了。
    我是不明白既然都不愿意定义协议了,为什么还要基于 TCP 进行编程。
    springz
        41
    springz  
       2020-10-12 20:02:00 +08:00
    看到标题就知道评论区盛况了,用上层协议吧,http,websocket 都行,非要用 TCP 那就自己定义下结构,最简单的定义一个起始标志位后面有多少个字节的数据,往后逐字节读到 buffer 里。
    AmosAlbert
        42
    AmosAlbert  
       2020-10-12 20:14:29 +08:00
    TCP 没有粘包这个说法哈,下次注意点
    正确的发帖法:nodejs 有没有好用的解决粘流问题的库
    ZRS
        43
    ZRS  
       2020-10-12 20:15:11 +08:00 via iPhone
    不样钓鱼
    pabupa
        44
    pabupa  
       2020-10-12 20:18:59 +08:00
    哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
    djoiwhud
        45
    djoiwhud  
       2020-10-12 20:33:04 +08:00
    你都用 nodejs 了,为啥不用 websock ? websock 读一次是一个完整的包。
    lewinlan
        46
    lewinlan  
       2020-10-12 20:47:17 +08:00 via Android
    粘包警察可真优越啊
    lxilu
        47
    lxilu  
       2020-10-13 00:54:23 +08:00 via iPhone
    还是叫乱流吧
    cl903254852
        48
    cl903254852  
    OP
       2020-10-13 09:37:58 +08:00
    @masker 谁钓鱼?不想回答就不回答,不要说这种“脏话”,我没惹着你
    cl903254852
        49
    cl903254852  
    OP
       2020-10-13 09:40:29 +08:00
    @neoblackcap 是需要定义协议的,header 固定,加个 body 长度,然后封装一下就行了,我是想如果有比较好用的库能帮我解决,我就不用自己写了
    raptor
        50
    raptor  
       2020-10-13 10:15:16 +08:00
    粘包这个说法从开始就是个误导加错误的概念,不知道是哪个 TCP 没学好的沙雕造出来的说法……
    letking
        51
    letking  
       2020-10-13 10:48:07 +08:00
    @cl903254852 那你直接问有没有封装协议的库不好吗?跟谁学的“粘包”?
    baxtergu
        52
    baxtergu  
       2020-10-13 11:04:26 +08:00
    固定长度消息头里写消息体的长度,读取的时候不够就缓存下来不处理,等下一个包拼起来完整了再处理
    oneoyn
        53
    oneoyn  
       2020-10-13 11:28:35 +08:00
    netty
    cl903254852
        54
    cl903254852  
    OP
       2020-10-13 15:02:26 +08:00
    @letking 我也是在网上的文档中看到的粘包这个词
    samzhou
        55
    samzhou  
       2020-10-13 21:35:12 +08:00
    这两个库配合使用很好
    ByteBuffer
    ExBuffer

    发现这个网站论坛,吹水的人比较多,务实的少。。。
    而且看到想回复你总是,连个注册登录都要 VPS 跑到 google 上去。。。
    cl903254852
        56
    cl903254852  
    OP
       2020-10-14 16:51:03 +08:00
    @samzhou 没办法,我对这方面也是懵懂,所以“挨喷”也正常。感谢提供的库,我去研究研究
    cl903254852
        57
    cl903254852  
    OP
       2020-10-14 16:59:36 +08:00
    @Chenamy2017 如果在协议头添加一个请求 ID 作为唯一标识,比如整个标识从 0 自增,问题是这段代码可以说是高频的,而协议头是固定大小的,请求 ID 早晚会溢出,这个有好的方法吗?
    aaronlam
        58
    aaronlam  
       2020-10-30 20:05:41 +08:00
    [为什么 TCP 要粘我的数据包]( https://www.aaronlam.xyz/2019/04/04/why-tcp-sticky-my-packet/) 可以了解一下。。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4937 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 09:43 PVG 17:43 LAX 02:43 JFK 05:43
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86