アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

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

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

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

よろしくお願い致します(__)

A 回答 (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);

};

}
    • good
    • 1

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



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

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

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

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


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

# java はあまり詳しくないですが、一応、ソフト屋さんです。
# 考え方はあっているはず。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/07/07 11:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!