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