在我使用 java nio 的程序中,socketchannel.write() 在尝试连续写入 10 KB 消息时变得非常慢。写一个完整的 10 KB 消息的测量时间在 160 毫秒到 200 毫秒之间。但是写一个完整的 5 KB 消息的时间只需要 0.8 毫秒。
在选择器中,我只有Selection.OP_READ,不处理Selection.OP_WRITE。当接收到一个大的完整消息时,它会被写入另一个接收器 4 次。
有没有会计同样的问题?有一篇关于 socketchannel.write() 慢的帖子。我的问题是如何在 OP_READ 和 OP_WRITE 之间交替更改?
如果我添加一个 inerval,例如 150 毫秒,则响应时间会减少。有什么方法可以找到缓冲区何时已满,这样我就可以让程序等待。我的操作系统是windows xp。
谢谢。
我通过检查写入字节数来遵循 EPJ 的建议。但是响应时间仍然很长。我在这里发布了我的部分代码,并想检查我的代码是否有问题。
// 这是使用 nio 的 writeData() 部分:
while (buffer.hasRemaining()) {
try {
buffer.flip();
n = socket.write(buffer);
if(n == 0) {
key.interestOps(SelectionKey.OP_WRITE);
key.attach(buffer);
break;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
buffer.compact();
}
}
if(buffer.position()==0) {
key.interestOps(SelectionKey.OP_READ);
}