HTTPクライアントが接続タイムアウトにどのように反応するか、つまりポート上でリッスンしているサーバーがどこにあるのかを確認したいのですが、接続を設定するプロセスは非常に遅く、クライアントはあきらめて接続タイムアウトを返します。接続は拒否されるべきではなく、受け入れられずにソケットのタイムアウトが続くべきです。ローカルポートのネットワーク遅延をシミュレートする方法は?
これまでのところ、私はこのような何かを書くことができるだろうと想像し、ServerSocket
をオーバーライドすることによって、ネットワークの遅延を導入しようとしてきました
...
public SlowServerSocket extends ServerSocket {
// (This method doesn't actually exist).
@Override
public void processBytesPassedOnByOperatingSystem(byte[] bytes) {
Thread.sleep(delay);
// Client has already returned a connection timeout.
super.processBytesPassedOnByOperatingSystem(bytes);
}
}
...しかし、私は行き止まりにぶつかります私が抽象化のレベルに達すると(それはネイティブメソッドで隠されているようです)。私の偽のサーバーは接続を受け入れてから何もせず、ソケットのタイムアウトを引き起こします。
私はまた解決策をオンラインで探しましたが、私はSlowSocket
をJMeterライブラリから見つけましたが、クライアント側で使用されているようです(クライアントを無効にすることはできませんその結果、SlowSocket
が使用されます)。
提案がありますか?
ノートの著者です:私は、この答えを見つけましたhttps://stackoverflow.com/questions/100841/artificially-create-a-connection-timeout- 「10.255.255.1」などのルーティング不可能なアドレスに接続することを示唆しています。しかし、私はそれが最も信頼できる/ポータブルな解決策であるとは確信していません。 – Pig
'SecurityManager'をサブクラス化し、' checkAccept() 'メソッドをオーバーライドしてスリープ状態にしてから、System.setSecurityManager(overridenSecurityManager)を呼び出すこともできます。ここからアイデアが得られます:https://stackoverflow.com/questions/7800960/java-socket-listen-before-accept?rq=1 – Pig