可靠地写入Java SocketChannel

时间:2010-09-13 12:02:39

标签: java sockets socketchannel

我对java SocketChannel有疑问。

假设我在阻止模式下打开了套接字通道;在调用 write(ByteBuffer)方法之后,我得到一个描述写入了多少字节的整数。 javadoc说: “返回:写入的字节数,可能为零”

完全这是什么意思?这是否意味着字节数确实已经传递给客户端(这样发送方收到tcp ack就可以明确服务器收到了多少字节),或者这是否意味着字节数已写入tcp堆栈? (这样一些字节仍然可能正在等待,例如在网卡缓冲区中)。

2 个答案:

答案 0 :(得分:5)

  

这是否意味着真正传递给客户端的字节数

没有。它只是表示传递到本地网络堆栈的字节数。

确保数据已传送到远程应用程序的唯一方法是,如果您收到数据的应用程序级别确认。

答案 1 :(得分:0)

让您感到困惑的段落是非阻塞I / O.

对于非阻止操作,您的初始呼叫可能确实在呼叫时没有写任何内容。

  

除非另有说明,否则写一下   操作将在之后返回   写入所有r请求的字节。   某些类型的渠道,取决于   他们的状态,可能只写一些   字节或可能根本没有。一个   套接字通道处于非阻塞模式,   例如,不能再写了   字节数比套接字中的空闲字节数多   输出缓冲区。

如您所见,阻塞I / O将发送所有字节(或在发送过程中抛出异常)

注意,无法保证接收端何时出现字节,这完全取决于低级套接字协议。