0

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

4

1 回答 1

1

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

ByteBuffer用于读取的初始容量RecvByteBufferAllocatorChannel. 这可以被覆盖:

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

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

于 2020-11-18T11:22:37.577 回答