-PR-
締切済み

Socketの接続のタイムアウトを設定するには

  • すぐに回答を!
  • 質問No.97288
  • 閲覧数5175
  • ありがとう数5
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 86% (13/15)

JavaでSocket通信をしようとおもっています。
Socketはnewするときにconnectもしてしまいまうらしいので
妙なIPアドレスを指定したりして、応答がもどってこないと
すべてそこで止まってしまうとおもうのですが、
Timeoutをかける方法はないのでしょうか。
setSoTimeoutというメソッドはreadのときとかStreamに関してしか
かけられないということが分かりました。

Socketのコンストラクタの引数にSocketImplを指定して、
Socket.setSoTimeoutしてから
SocketImpl.connectすれば大丈夫かな、とおもっていたのですが、
setSoTimeoutはreadにしか効かない、と明記してあったので、無駄ですよね。

どこかに情報がないかと検索エンジンでも探してみたのですが、
見つかりません。もしかしてタイムアウトを設定するのは
一般的な方法ではないのかとも思えてきました。
ずーーーーっと接続にしにいくのを待ちつづけるしかないのでしょうか。

どのような設計(というか使うクラス?)をするべきなのか、
思い当たるかたがいらっしゃいましたら教えていただけないでしょうか。

よろしくお願い致します(__)
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

回答 (全2件)

  • 回答No.1
レベル14

ベストアンサー率 50% (1122/2211)

Java は、あまり詳しくないので、考え方だけ。

ソケット通信をするクラスで、実際に connect するメソッド以外に、
タイムアウトをかけるメソッドを用意して、スレッドとして動かします。

Socket は、そのメソッドからも参照できるようにメンバーにして。

一定時間過ぎたところで、その Socket に対して close() をすると、
connect() 中でも、例外が飛んでくるはず。

正常に connect() できたのであれば、スレッドを止めるか、Socket を
close() しないでちょうだいね、という情報をメンバーに設定する。


って感じではどうでしょうか?

# java はあまり詳しくないですが、一応、ソフト屋さんです。
# 考え方はあっているはず。
お礼コメント
tontoto

お礼率 86% (13/15)

ありがとうございます。
やはりスレッドにして自力で実装しなくてはならないのですね…。
みんなやるから既にメソッドか
テクニックが公開とかされていないものかな、
とおもったのですが、見つけられなくて…。
ありがとうございます。自分で組み込んで見ます(__)
投稿日時 - 2001-07-07 11:04:16


  • 回答No.2
レベル7

ベストアンサー率 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);

};

}
このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


専門家があなたの悩みに回答!

-PR-

ピックアップ

-PR-
ページ先頭へ