
JavaでSocket通信をしようとおもっています。
Socketはnewするときにconnectもしてしまいまうらしいので
妙なIPアドレスを指定したりして、応答がもどってこないと
すべてそこで止まってしまうとおもうのですが、
Timeoutをかける方法はないのでしょうか。
setSoTimeoutというメソッドはreadのときとかStreamに関してしか
かけられないということが分かりました。
Socketのコンストラクタの引数にSocketImplを指定して、
Socket.setSoTimeoutしてから
SocketImpl.connectすれば大丈夫かな、とおもっていたのですが、
setSoTimeoutはreadにしか効かない、と明記してあったので、無駄ですよね。
どこかに情報がないかと検索エンジンでも探してみたのですが、
見つかりません。もしかしてタイムアウトを設定するのは
一般的な方法ではないのかとも思えてきました。
ずーーーーっと接続にしにいくのを待ちつづけるしかないのでしょうか。
どのような設計(というか使うクラス?)をするべきなのか、
思い当たるかたがいらっしゃいましたら教えていただけないでしょうか。
よろしくお願い致します(__)
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
以下は、別のスレッドでクライアントソケットを作って、それを監視/制御する一例です。
以前にそのような状況になったときがあり、そのときは以下の方法で対処できたと思います。
ありえないアドレスなどを指定して、ソケットを作るところで止まってしまったときには、
ソケットを作ろうとしたスレッドごと放棄しています。
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);
};
}
No.1
- 回答日時:
Java は、あまり詳しくないので、考え方だけ。
ソケット通信をするクラスで、実際に connect するメソッド以外に、
タイムアウトをかけるメソッドを用意して、スレッドとして動かします。
Socket は、そのメソッドからも参照できるようにメンバーにして。
一定時間過ぎたところで、その Socket に対して close() をすると、
connect() 中でも、例外が飛んでくるはず。
正常に connect() できたのであれば、スレッドを止めるか、Socket を
close() しないでちょうだいね、という情報をメンバーに設定する。
って感じではどうでしょうか?
# java はあまり詳しくないですが、一応、ソフト屋さんです。
# 考え方はあっているはず。
ありがとうございます。
やはりスレッドにして自力で実装しなくてはならないのですね…。
みんなやるから既にメソッドか
テクニックが公開とかされていないものかな、
とおもったのですが、見つけられなくて…。
ありがとうございます。自分で組み込んで見ます(__)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラミングの問題です。大...
-
変数を動的に利用するには?
-
中カッコ{}だけの記述について
-
Socketの接続のタイムアウトを...
-
コンストラクタの引数の中のnew?
-
インタフェイス実装と抽象クラ...
-
Javaでlog4jを使ってログ出力を...
-
JSP/Servletのパラメータの受け...
-
初心者なので教えてほしいです。
-
IF関数でEmpty値を設定する方法。
-
オブジェクトの中のプロパティ...
-
動的配列が存在(要素が有る)か...
-
System.err. printlnとSystem.o...
-
C言語のポインターに関する警告
-
JSPやサーブレットでSystem.out...
-
javaです。 途中まで出来ている...
-
flush()とclose()について
-
ループ処理の際、最後だけ","を...
-
java キーボード入力された値の...
-
この警告はどうすれば?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラミングの問題です。大...
-
変数を動的に利用するには?
-
コンストラクタの引数の中のnew?
-
System.exit()の値を取得したい
-
インタフェイス実装と抽象クラ...
-
JSP/Servletのパラメータの受け...
-
GetterとSetterをやったのに。
-
中カッコ{}だけの記述について
-
【java】同ディレクトリ別ファ...
-
NoSuchMethodErrorが解決できま...
-
Javaでlog4jを使ってログ出力を...
-
getActualMaximum(Calendar.DAY...
-
javaのprivate finalメンバにつ...
-
コンストラクタについて
-
オーバーライド
-
継承プログラムについて
-
javaのプログラミングで作るRPG...
-
Vectorを用いた問題
-
javaのコンパイルエラーについ...
-
考えてもちっともいい案が出て...
おすすめ情報