我已经使用 swift nio 开发了一个客户端和一个服务器,我发送 12 到 1000 字节之间的所有大小的包都没有问题,因为服务器发送了一个 528 字节的包,当客户端收到它时,它是 512 字节。我试图弄清楚它为什么会发生。有谁知道是否有机会设置最小 ByteBuffer 容量?或者如果我错过了什么。谢谢大家。
问问题
128 次
1 回答
1
假设您使用的是 TCP(即使用ClientBootstrap
),您不能期望服务器发送的消息的边界会反映在您的读取中。TCP 是“面向流的”:这意味着消息根本没有边界,它们的行为就像数据流一样。在 NIO 的情况下,这意味着您会期望在不久之后看到另一个包含更多数据的读取。
ByteBuffer
用于读取的初始容量RecvByteBufferAllocator
由Channel
. 这可以被覆盖:
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 回答