私のプログラムでは、java nioを使用しているため、10 KBのメッセージを連続して書き込もうとすると、socketchannel.write()は非常に遅くなります。完全な10KBメッセージを書き込むために測定された時間は、160msと200msの間です。しかし、完全な5KBメッセージを書き込む時間はわずか0.8msかかる。メッセージサイズが大きいとsocketchannel.write()が非常に遅くなる
セレクタでは、Selection.OP_READのみを持ち、Selection.OP_WRITEは処理しません。大きな完全なメッセージが受信されると、それは別の受信機に4回書き込まれます。
誰かが同じ問題を抱えていますか? socketchannel.write()についての投稿は遅いです。私の質問は、OP_READとOP_WRITEの間で交互に変更する方法です。
たとえば、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);
}
私は多くのことを失敗した10キロバイトの1つのTCPパケットを送信するために恒久的にしようとしていると思います。 –
メッセージは連続して発行されます。トポロジは一連のノードです。メッセージの間隔は100 msです。 – susan
@MartijnCourteaux No. TCPパケット化は、より低いレベルで発生します。 IPパケット>経路MTUを送信しようとはしません。 – EJP