我对java SocketChannel有疑问。
假设我在阻止模式下打开了套接字通道;在调用 write(ByteBuffer)方法之后,我得到一个描述写入了多少字节的整数。 javadoc说: “返回:写入的字节数,可能为零”
但完全这是什么意思?这是否意味着字节数确实已经传递给客户端(这样发送方收到tcp ack就可以明确服务器收到了多少字节),或者这是否意味着字节数已写入tcp堆栈? (这样一些字节仍然可能正在等待,例如在网卡缓冲区中)。
答案 0 :(得分:5)
这是否意味着真正传递给客户端的字节数
没有。它只是表示传递到本地网络堆栈的字节数。
确保数据已传送到远程应用程序的唯一方法是,如果您收到数据的应用程序级别确认。
答案 1 :(得分:0)
让您感到困惑的段落是非阻塞I / O.
对于非阻止操作,您的初始呼叫可能确实在呼叫时没有写任何内容。
除非另有说明,否则写一下 操作将在之后返回 写入所有r请求的字节。 某些类型的渠道,取决于 他们的状态,可能只写一些 字节或可能根本没有。一个 套接字通道处于非阻塞模式, 例如,不能再写了 字节数比套接字中的空闲字节数多 输出缓冲区。
如您所见,阻塞I / O将发送所有字节(或在发送过程中抛出异常)
注意,无法保证接收端何时出现字节,这完全取决于低级套接字协议。