在我的使用java nio的程序中,当它试图连续写入10 KB消息时,socketchannel.write()变得非常慢。测量写完整10 KB消息的时间在160 ms和200 ms之间。但编写完整的5 KB消息的时间仅需要0.8 ms。当消息大小很大时,socketchannel.write()变得非常慢
在选择器中,我只有Selection.OP_READ并且不处理Selection.OP_WRITE。当收到一个大的完整消息时,它将被写入另一个接收器4次。
有人遇到同样的问题吗?有一个关于socketchannel.write()缓慢的文章。我的问题是如何替换OP_READ和OP_WRITE之间的变化?
如果我添加一个inerval,例如150毫秒,响应时间会缩短。有什么办法可以找到缓冲区已满的时间,这样我可以让程序等待。我的操作系统是Windows XP。
谢谢。
我按照EPJ建议通过检查写入的字节数。但是响应时间依然很高。我在这里发布我的部分代码,并希望检查我的代码是否有问题。
//这是使用NIO的写数据()部分:
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);
}
我想它正试图永久发送10KB的一个单一的TCP数据包,它失败了很多。 –
消息连续发布。拓扑结构是一系列节点。消息间隔为100毫秒 – susan
@MartijnCourteaux号TCP分组发生在较低级别。它不会尝试发送IP包>路径MTU。 – EJP