Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

ソケットのコネクションタイムアウトが設定できません

はじめまして。
java開発を始めたばかりでどう調べてもわからないことがあります。
Socketのconnectで相手が存在しないorダウンしている場合に指定した時間(m)でタイムアウトになって欲しいのですがなりません。大体、15〜17秒くらいでタイムアウト。

JDK5で開発しており、JDK1.4から実装されたconnect(接続先,タイムアウト値)で簡単に実現できると思ったんですが、だめなのでしょうか?それとも、他のやり方で
しないといけないのでしょうか?

どなたか教えて頂きたいのですが。。。
よろしくお願いします。

15

回答

21032

閲覧

15件の回答

評価

0

>>java開発を始めたばかりでどう調べてもわからないことがあります。

どう調べたか書かないと丸投げに思われます。どういうふーに調べて、どの部分がわからないかかきましょう。

評価

0

すみません。どう調べたかといわれると、ネットでタイムアウトの設定などを調べて、設定可能とわかり実装したのですが、できないといった状況です。

評価

0

質問文とその補足の文章を、(技術的なことでなく)
他人が理解できるかどうか、まず周りの人の反応をみたほうが良いですよ。

評価

0

すみません。わたし、文章力がなく、教えていただきたい気持ちはあるのですが。。伝えることができないようです。あきらめます。すみませんでした。

評価

0

実装したのかどうかが文章ではわかりませんし、もししたならコードを掲載する事をおすすめします。してないならまずは試してみましょう。

評価

0

すみません。そういう意味だったんですね。どうも文章力、理解力がなく。。。なさけないです。

Socketでのコネクションタイムアウトの設定についていろいろとネットで調べたところ、以下のコーディングではないかと思い実装しました。
接続先へ1分で接続できなければSocketTimeoutExceptionへいって欲しいのですが、15秒くらいでIOExceptionへいってしまいます。

Socket sok = new Socket();

InetSoketAddress address 
 = new InetSocketAddress("接続先アドレス","接続先ポートNo");

try {
  //タイムアウト値は1分です。
  sok.connect(address,60000);
} catch (IOException ie) {
  //エラー処理
} catch (SocketTimeoutException ste) {
  //エラー処理
}




評価

0

まぁ文章力とか理解力の前に「ガイドライン」を読んでたらもっと聞き方が変わってたんだろうね。。。

評価

0

IOExceptionの内容を出力して原因を探っては?
 System.out.println(ie);
また、それでも原因がわからない場合、例えばもう1階層、タイムアウトを計測するロジックを用意しては?
以下、ロジックイメージ

1. 開始時刻取得
2. 繰り返し処理
2.1. ソケット接続メソッドCALL(現行のロジック)
2.2. if ソケット接続失敗
2.2.1. 現在時刻取得し、開始時刻からの経過時刻を算出
2.2.2. 1分経過していれば、タイムアウト処理(BREAK等)

評価

0

umakkoさんありがとうございます。

IOExceptionの内容を見てみました。内容は
"Connection timed out:connect [errno=10060,syscall=select]"で、内容としてはコネクションタイムアウトのようですが、パラメタの値は使われていないような。。。java標準関数というのはこういったこと(パラメタでは提供しているが動作はしない)というのは当たり前のようにあるんですかね?

だめなら、アドバイス通り実装するしかないんですね。

評価

0

SocketTimeoutExceptionはIOExceptionの派生クラスなんで、

try {
    ...
} catch (SocketTimeoutException e) {
   ...
} catch (IOException e) {
   ...
}

とする必要があります。

評価

0

試してないし、同じような気はしますが、setSoTimeout(()ではどうでしょうか。

評価

0

適当さんありがとうございます。

catchするExceptionの順があるなんて知りませんでした。まだまだ、勉強不足です。

mioさんありがとうございます。

setSoTimeout()なんですが、これはconnectには関係ないようで、stream系でデータを受信する際につかう値みたいで応答タイムアウトで使用しています。

評価

0

>IOExceptionの内容を見てみました。内容は
>"Connection timed out:connect [errno=10060,syscall=select]"で、内容としてはコネクションタイムアウトのようですが、パラメタの値は使われていないような。。。

なぜ、『コネクションタイムアウトのよう』、『パラメタの値は使われていない』という判断をしたのでしょう。
よしさんの文章は、その思考の経緯がすっぽり抜け落ちています。これでネット越しの他人に理解しろというのは無理です。

また、"あ"さんが仰っていますが、「ガイドライン」は読みましたか?

>java標準関数というのはこういったこと(パラメタでは提供しているが動作はしない)というのは当たり前のようにあるんですかね?

クラスの実装が分離されていれば、JAVAに限らず、他の言語でも起こり得ることです。
例えば、仮にタイムアウトをサポートしないSocketの実装(委譲クラス)ならば、どう振舞えば良いと思いますか?

この辺を理解したければ、デザインパターンを勉強すると良いでしょう。

また、『動作はしない』かどうかは、どう判断したのですか?
他者を疑うより、まず自分を疑ったほうが良いです。
これでは、自分がAPIを誤使用していながら、すぐにバグと決め付けるプログラミング初心者にありがちな態度と変わりません。

>setSoTimeout()なんですが、これはconnectには関係ないようで、stream系でデータを受信する際につかう値みたいで応答タイムアウトで使用しています。

『connectには関係ない』は、どのように判断しましたか?
実装がこのパラメータを使用するのであれば、関係あります。つまり、実装依存です。

よしさんの回答から、自分の書いたコードが何を呼び出し、どのように動作しているか理解していないように見受けますが。理解していますか?
理解していないならば、javadocとjava.net.Socketのデフォルトコンストラクタ->java.net.Socket#connect()のソースを読んでください。


評価

60

横からすみません。
fooさん、わからなくて困っている人の気持ちを考えて発言してください。
なぜそんなにトゲのある態度を取っているのですか?

評価

0

半年以上前のコメントに反応してもねー。
本人もういないかもしれないし。

ここはOKWave(だっけ?)なんかのように、「なんにも分からない。だから細かく教えて」というところじゃない、ということですよ。
この掲示板に限ったことではないけど、回答内容は質問者の努力次第ってとこは多いです。

これへのレスには多分反応しないので、あしからず。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。