传输了多少数据?

时间:2017-12-25 07:43:05

标签: java sockets tcp nio

以阻塞模式通过套接字传输文件

Size of Integer: 4
Address: 1704004844, Value: 1025
Address: 1704004848, Value: A
Address: 1704004673, Value: 

如果连接失败,我需要保留传输的字节数。 我可以通过等待服务器收到特定字节数时的响应来完成此操作。或者,当连接恢复时,我发送一个请求接收的字节数。 哪个选项会更正确?这个问题通常如何解决?

第二个问题。通过套接字发送大数据时是否保证数据完整性?

1 个答案:

答案 0 :(得分:1)

用这段代码你无法分辨。如果您想知道对等应用程序已收到并处理了已发送的数据,则对等应用程序必须告诉您。 TCP会在两端进行缓冲,因此仅靠API无法告诉您。

注意您的复制循环错误。它应该是:

while ((fileIChannel.read(byteBuffer) != -1 && byteBuffer.position() > 0)
{
    byteBuffer.flip();
    bytesTransferred += socketChannel.write(byteBuffer);
    byteBuffer.compact();
}

并且还应该对写入进行错误测试。目前,您假设在每次写入时都会将所有内容写入SocketChannel,但在非阻塞模式下无法保证。

使用transferTo()的代码也是错误的,因为transferTo()无法保证执行整个转移:这就是它返回计数的原因。你必须循环。