以阻塞模式通过套接字传输文件
Size of Integer: 4
Address: 1704004844, Value: 1025
Address: 1704004848, Value: A
Address: 1704004673, Value:
如果连接失败,我需要保留传输的字节数。 我可以通过等待服务器收到特定字节数时的响应来完成此操作。或者,当连接恢复时,我发送一个请求接收的字节数。 哪个选项会更正确?这个问题通常如何解决?
第二个问题。通过套接字发送大数据时是否保证数据完整性?
答案 0 :(得分:1)
用这段代码你无法分辨。如果您想知道对等应用程序已收到并处理了已发送的数据,则对等应用程序必须告诉您。 TCP会在两端进行缓冲,因此仅靠API无法告诉您。
注意您的复制循环错误。它应该是:
while ((fileIChannel.read(byteBuffer) != -1 && byteBuffer.position() > 0)
{
byteBuffer.flip();
bytesTransferred += socketChannel.write(byteBuffer);
byteBuffer.compact();
}
并且还应该对写入进行错误测试。目前,您假设在每次写入时都会将所有内容写入SocketChannel
,但在非阻塞模式下无法保证。
使用transferTo()
的代码也是错误的,因为transferTo()
无法保证执行整个转移:这就是它返回计数的原因。你必须循环。