System.out.println(" @ bBuffer = " + bBuffer.capacity());
headerBuffer.rewind();
socketChannel.write(headerBuffer);
int writen = socketChannel.write(bBuffer);
System.out.println(" @ writen = " + writen);
bBuffer
是ByteBuffer
类型的对象,它来自FileChannel.map()
(它是一个图像文件)。当我在客户端收到此图像文件时,它不是一个完整的图像 - 大约一半的图像丢失了。所以我通过将一些统计信息打印到控制台来检查写入了多少字节。输出是:
@ bBuffer = 319932
@ writen = 131071
剩下的字节怎么了?似乎缺少(319923 - 131071)个字节。
有时written
等于bBuffer.capacity()
,它似乎与文件大小或缓冲容量无关。
答案 0 :(得分:0)
您的代码无效假设。 read()
和write()
没有义务每次调用转移多个字节。你必须循环。但无论如何你做错了。它应该是:
while (headerBuffer.position() > 0)
{
headerBuffer.flip();
socketChannel.write(headerBuffer);
headerBuffer.compact();
}
或
headerBuffer.flip();
while (headerBuffer.hasRemaining())
{
socketChannel.write(headerBuffer);
}
headerBuffer.compact();
如果SocketChannel
处于非阻止模式,则会变得相当复杂,但您在问题中没有提到这一点。
您还需要检查您的接收代码是否符合相同的假设。