2009-06-11 10 views
3

私は(Groovyで書かれた)シンプルひどく行儀サーバーのJava/Groovyのソケット書き込みタイムアウト

ServerSocket ss = new ServerSocket(8889); 
Socket s = ss.accept() 
Thread.sleep(1000000) 

そして、私は(サーバはそれの入力を消費していないので)、タイムアウトを持つようにしたいクライアントを持っている

Socket s = new Socket("192.168.0.106", 8889) 
s.setSoTimeout(100); 
s.getOutputStream.write(new byte[1000000]); 

ただし、このクライアントは永遠にブロックされます。クライアントをタイムアウトさせるにはどうすればよいですか?

THANKS !!

答えて

3

クライアントを独自のスレッドにスポーンし、返すためにロック/待機(タイムアウトが長い)することができます。可能であればFutureオブジェクトを使用して、ソケットが成功した場合に戻り値を取得します。

私は、ソケットのSO_TIMEOUT設定が書き込みではなくソケットからの読み取り(..)呼び出しにのみ影響すると信じています。

SocketChannel(Streamではなく)を試して、そのチャネルのハンドルも持つ別のスレッドを生成することがあります。他のスレッドは、そのタイムアウトがブロックされた後、そのチャネルを非同期的に閉じることができます。

1

ソケットタイムアウトは、アプリケーションレベルではなくTCPレベルです。送信元マシンTCPは送信するデータをバッファしています。ターゲットマシンのネットワークスタックは受信したデータを確認しているため、タイムアウトはありません。また、異なるTCP/IP実装は、これらのタイムアウトを異なる方法で処理します。 tcpdump(またはwiresharkの場合はワイヤで何が起こっているのか見てみましょう:)必要なのはアプリケーションレベルのACKです。つまり、クライアントとサーバーの間のプロトコルを定義する必要があります。私はJavaパッケージ(おそらくnioを見たいと思っています)にコメントすることはできませんが、ACKは通常poll/selectで処理されるというタイムアウトを受け取ります。

0

タイムアウトを取得する方法はありませんが、書き込みが完了していない場合は、接続を閉じるスレッドをいつでも生成できます。

関連する問題