- 締切済み
Socketの接続のタイムアウトを設定するには
JavaでSocket通信をしようとおもっています。 Socketはnewするときにconnectもしてしまいまうらしいので 妙なIPアドレスを指定したりして、応答がもどってこないと すべてそこで止まってしまうとおもうのですが、 Timeoutをかける方法はないのでしょうか。 setSoTimeoutというメソッドはreadのときとかStreamに関してしか かけられないということが分かりました。 Socketのコンストラクタの引数にSocketImplを指定して、 Socket.setSoTimeoutしてから SocketImpl.connectすれば大丈夫かな、とおもっていたのですが、 setSoTimeoutはreadにしか効かない、と明記してあったので、無駄ですよね。 どこかに情報がないかと検索エンジンでも探してみたのですが、 見つかりません。もしかしてタイムアウトを設定するのは 一般的な方法ではないのかとも思えてきました。 ずーーーーっと接続にしにいくのを待ちつづけるしかないのでしょうか。 どのような設計(というか使うクラス?)をするべきなのか、 思い当たるかたがいらっしゃいましたら教えていただけないでしょうか。 よろしくお願い致します(__)
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- ssr-y6
- ベストアンサー率71% (5/7)
以下は、別のスレッドでクライアントソケットを作って、それを監視/制御する一例です。 以前にそのような状況になったときがあり、そのときは以下の方法で対処できたと思います。 ありえないアドレスなどを指定して、ソケットを作るところで止まってしまったときには、 ソケットを作ろうとしたスレッドごと放棄しています。 import java.net.*; class clientthread extends Thread { private Socket Client; private ServerSocket Server; public boolean ConnectionFlag, BreakFlag; private int Port; private String HostName; public clientthread(String name, int port) throws Exception { super(); Port = port; HostName = name; ConnectionFlag = false; BreakFlag = false; }; public String GetConnectionData() { if (!ConnectionFlag) return("NotConnected"); return(Client.getRemoteSocketAddress().toString() + " : " + Integer.toString(Client.getLocalPort())); }; public void run() { try { Client = new Socket(InetAddress.getByName(HostName), Port); ConnectionFlag = true; if (BreakFlag) return; } catch(Exception ex) { System.out.println("<run>" + ex.toString()); }; }; } public class clientto { private static final int TimeoutTime = 10; public static void main(String args[]) { int i, j; clientthread ClientThread; try { for (j = 0; j < args.length; j += 2) { System.out.println(args[j]); ClientThread = new clientthread(args[j], Integer.parseInt(args[j + 1])); ClientThread.start(); for (i = 0; i < TimeoutTime; i ++) { if (ClientThread.ConnectionFlag) break; System.out.println("Connecting.." + i); try { Thread.sleep(100); } catch(Exception e) {}; }; if ((i == TimeoutTime) && (!ClientThread.ConnectionFlag)) ClientThread.BreakFlag = true; else ClientThread.join(); System.out.println(ClientThread.GetConnectionData()); }; } catch (Exception ex) { System.out.println("<main>" + ex.toString()); }; System.exit(0); }; }
- a-kuma
- ベストアンサー率50% (1122/2211)
Java は、あまり詳しくないので、考え方だけ。 ソケット通信をするクラスで、実際に connect するメソッド以外に、 タイムアウトをかけるメソッドを用意して、スレッドとして動かします。 Socket は、そのメソッドからも参照できるようにメンバーにして。 一定時間過ぎたところで、その Socket に対して close() をすると、 connect() 中でも、例外が飛んでくるはず。 正常に connect() できたのであれば、スレッドを止めるか、Socket を close() しないでちょうだいね、という情報をメンバーに設定する。 って感じではどうでしょうか? # java はあまり詳しくないですが、一応、ソフト屋さんです。 # 考え方はあっているはず。
お礼
ありがとうございます。 やはりスレッドにして自力で実装しなくてはならないのですね…。 みんなやるから既にメソッドか テクニックが公開とかされていないものかな、 とおもったのですが、見つけられなくて…。 ありがとうございます。自分で組み込んで見ます(__)