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