
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で質問しましょう!
似たような質問が見つかりました
- Bluetooth・テザリング PRIME Z390-PでWIFI&Bluetooth 2 2022/04/01 19:25
- CPU・メモリ・マザーボード Socket AM4マザーに、レガシーなインタフェースが多数あるのはなぜ? 3 2023/02/17 10:47
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- 固定IP 楽天光が繋がらないまたは接続に時間が掛かる IPv4が邪魔してるので削除したい 2 2022/08/15 11:58
- ドライブ・ストレージ B550M Pro4マザーにM.2_SSD取付に関して 2 2023/04/15 02:07
- CPU・メモリ・マザーボード BIOSTAR B660GTAのストレージ(M2、SATA)について 1 2023/02/17 20:11
- CPU・メモリ・マザーボード DELL Vostro 3268に付けられるCPUを教えてください。以下にspecを載せてます。 4 2022/10/24 11:19
- Wi-Fi・無線LAN ローソンで wi-fi 接続できませんでした スマホは OPPO A 73です 何がいけなかったか 4 2022/05/31 03:53
- 固定IP iPhoneでのIPv4切り替え方法 3 2022/11/24 22:26
- VPN 無料のwifiはなぜ危険性高い? VPN プライベートDNSモードにすれば安全? 2 2022/06/04 18:23
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Javaでlog4jを使ってログ出力を...
-
中カッコ{}だけの記述について
-
Socketの接続のタイムアウトを...
-
変数を動的に利用するには?
-
NoSuchMethodErrorが解決できま...
-
【初心者です】javaで平均値を...
-
元旦からの経過日数を求めたい
-
Javaの問題について
-
processingである処理をした画...
-
コンストラクタの引数の中のnew?
-
void setup() { // put your se...
-
カプセル化の利点
-
System.exit()の値を取得したい
-
(1)を表示するには
-
HashMapについて
-
コンストラクタの動作について
-
インタフェイス実装と抽象クラ...
-
オブジェクトの中のプロパティ...
-
eclipseに記述したjavaファイル...
-
動的配列が存在(要素が有る)か...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
変数を動的に利用するには?
-
Javaでlog4jを使ってログ出力を...
-
プログラミングの問題です。大...
-
中カッコ{}だけの記述について
-
System.exit()の値を取得したい
-
Java プログラム public class ...
-
JSP/Servletのパラメータの受け...
-
C# DatagridviewにExcelシート...
-
Javaで日本語の出力が文字化けする
-
コンストラクタの引数の中のnew?
-
javaで特定の文字列から特定の...
-
Socketの接続のタイムアウトを...
-
NoSuchMethodErrorが解決できま...
-
ArrayList でスタックを
-
他ファイルで定義された自作例...
-
日本語が出力できない
-
日本語が文字コードによっては...
-
randomで
-
インタフェイス実装と抽象クラ...
-
じゃんけん プログラミング
おすすめ情報