Lostbit
V2EX  ›  Node.js

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

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

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

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