【问题标题】:SwiftNIO: Sent package partially receivedSwiftNIO:发送的包裹部分收到
【发布时间】:2021-02-28 03:15:55
【问题描述】:

我已经使用 swift nio 开发了一个客户端和一个服务器,我发送 12 到 1000 字节之间的所有大小的包都没有问题,因为服务器发送了一个 528 字节的包,当客户端收到它时,它是 512 字节。我试图弄清楚它为什么会发生。有谁知道是否有机会设置最小 ByteBuffer 容量?或者如果我错过了什么。 谢谢大家。

【问题讨论】:

    标签: swift bytebuffer swift-nio


    【解决方案1】:

    假设您使用 TCP(即使用ClientBootstrap),您不能期望服务器发送的消息的边界会反映在您的读取中。 TCP 是“面向流的”:这意味着消息根本没有边界,它们的行为就像数据流一样。在 NIO 的情况下,这意味着您会期望看到 another 在不久之后读取包含更多数据。

    用于读取的初始ByteBuffer 容量由Channel 使用的RecvByteBufferAllocator 控制。这可以被覆盖:

    ClientBootstrap(group: group)
        .channelOption(ChannelOptions.recvAllocator, 
                       AdaptiveRecvByteBufferAllocator(minimum: 1024, initial: 1024, maximum: 65536))
    

    NIO 2.23.0 中AdaptiveRecvByteBufferAllocator 的标准默认值是最小大小为 64 字节,初始大小为 1024 字节,最大大小为 65536 字节。一般来说,我们不建议覆盖这些默认值,除非您需要:因为 TCP NIO 将确保缓冲区大小适合我们看到的读取。

    【讨论】:

    猜你喜欢
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    • 2014-09-13
    相关资源
    最近更新 更多