【发布时间】:2021-02-28 03:15:55
【问题描述】:
我已经使用 swift nio 开发了一个客户端和一个服务器,我发送 12 到 1000 字节之间的所有大小的包都没有问题,因为服务器发送了一个 528 字节的包,当客户端收到它时,它是 512 字节。我试图弄清楚它为什么会发生。有谁知道是否有机会设置最小 ByteBuffer 容量?或者如果我错过了什么。 谢谢大家。
【问题讨论】:
标签: swift bytebuffer swift-nio
我已经使用 swift nio 开发了一个客户端和一个服务器,我发送 12 到 1000 字节之间的所有大小的包都没有问题,因为服务器发送了一个 528 字节的包,当客户端收到它时,它是 512 字节。我试图弄清楚它为什么会发生。有谁知道是否有机会设置最小 ByteBuffer 容量?或者如果我错过了什么。 谢谢大家。
【问题讨论】:
标签: swift bytebuffer swift-nio
假设您使用 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 将确保缓冲区大小适合我们看到的读取。
【讨论】: