【问题标题】:java nio socketChannel.write() missing bytesjava nio socketChannel.write() 缺少字节
【发布时间】:2014-12-10 03:07:00
【问题描述】:
System.out.println(" @ bBuffer = " + bBuffer.capacity());

headerBuffer.rewind();
socketChannel.write(headerBuffer);

int writen = socketChannel.write(bBuffer);
System.out.println(" @ writen = " + writen);

bBufferByteBuffer 类型的对象,它来自FileChannel.map()(它是一个图像文件)。当我在客户端收到这个图像文件时,它不是一个完整的图像——大约一半的图像丢失了。所以我通过将一些统计信息打印到控制台来检查写入了多少字节。输出是:

 @ bBuffer = 319932
 @ writen = 131071

剩下的字节怎么了?似乎缺少 (319923 - 131071) 个字节。

有时written 等于bBuffer.capacity(),它似乎与文件大小或缓冲区容量无关。

【问题讨论】:

标签: nio socketchannel filechannel


【解决方案1】:

您的代码做出了无效的假设。 read()write() 没有义务每次调用传输超过一个字节。你必须循环。但无论如何,你做错了。应该是:

while (headerBuffer.position() > 0)
{
    headerBuffer.flip();
    socketChannel.write(headerBuffer);
    headerBuffer.compact();
}

headerBuffer.flip();
while (headerBuffer.hasRemaining())
{
    socketChannel.write(headerBuffer);
}
headerBuffer.compact();

如果SocketChannel 处于非阻塞模式,它会变得相当复杂,但您在问题中没有提到这一点。

您还需要检查您的接收代码是否有相同的假设。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多