V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
Lostbit
V2EX  ›  Node.js

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

  •  
  •   Lostbit · Oct 12, 2020 · 9591 views
    This topic created in 2024 days ago, the information mentioned may be changed or developed.
    58 replies    2020-10-30 20:05:41 +08:00
    temporary
        1
    temporary  
       Oct 12, 2020
    粘包是什么
    Mohanson
        2
    Mohanson  
       Oct 12, 2020 via Android   ❤️ 29
    喂,110 吗
    LANB0
        3
    LANB0  
       Oct 12, 2020
    粘包是什么?
    基于 TCP 的应用层协议数据,处理方法只有 2 种:
    1 、逐字节从 socket 读取数据,匹配起始标识和头信息,根据头信息中的数据段长度继续读取指定长度的数据段
    2 、socket 收的数据全部丢入循环缓冲区,同时运行指定的分包线程从缓冲区分包取数据包处理
    mxT52CRuqR6o5
        4
    mxT52CRuqR6o5  
       Oct 12, 2020 via Android   ❤️ 1
    别用 tcp,用些上层协议(比如 websocket),解决方案也无非是自己再实现一套类似 websocket 的上层协议
    stephenxiaxy
        5
    stephenxiaxy  
       Oct 12, 2020
    自己根据自定义协议处理
    no1xsyzy
        6
    no1xsyzy  
       Oct 12, 2020
    Cops In Action
    nxforce
        7
    nxforce  
       Oct 12, 2020
    tcp 是流吧。。。粘包是个什么鬼。。。

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

    发现这个网站论坛,吹水的人比较多,务实的少。。。
    而且看到想回复你总是,连个注册登录都要 VPS 跑到 google 上去。。。
    Lostbit
        56
    Lostbit  
    OP
       Oct 14, 2020
    @samzhou 没办法,我对这方面也是懵懂,所以“挨喷”也正常。感谢提供的库,我去研究研究
    Lostbit
        57
    Lostbit  
    OP
       Oct 14, 2020
    @Chenamy2017 如果在协议头添加一个请求 ID 作为唯一标识,比如整个标识从 0 自增,问题是这段代码可以说是高频的,而协议头是固定大小的,请求 ID 早晚会溢出,这个有好的方法吗?
    aaronlam
        58
    aaronlam  
       Oct 30, 2020
    [为什么 TCP 要粘我的数据包]( https://www.aaronlam.xyz/2019/04/04/why-tcp-sticky-my-packet/) 可以了解一下。。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   981 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 184ms · UTC 19:26 · PVG 03:26 · LAX 12:26 · JFK 15:26
    ♥ Do have faith in what you're doing.