传输了多少数据?

问题描述 投票:0回答:1

在阻塞模式下通过套接字传输文件时

bytesTransferred = fileIChannel.transferTo(0, fileIChannel.size(), socketChannel);
// or using a buffer
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(1024*8);
while (fileIChannel.read(byteBuffer) != -1) {
byteBuffer.flip();
bytesTransferred += socketChannel.write(byteBuffer);
byteBuffer.clear();

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

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

java sockets tcp nio
1个回答
1
投票

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.