- PR -

URLConnectionのタイムアウト

1
投稿者投稿内容
フライト
ベテラン
会議室デビュー日: 2005/03/11
投稿数: 63
お住まい・勤務地: 津田沼・東京
投稿日時: 2007-01-05 16:27
JDKが1.4のURLConnectionを使用してデータを受け渡しをしているアプリケーションで、
接続毎にタイムアウト値を設定したいとの要望があり、下記のサイトを参考に実装しました。

http://www.logicamente.com/sockets.html


参考にしたクラスで、今まで普通にURLConnectionで接続を確認出来たURLに
対して接続テストを行った所、下記のExceptionになりました。

サーバー自体は、以前の状態で普通にURLConnectionを使用したクラスと
サイトを参考にして作成したクラスと同じ物を使用しています。


java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:305)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:171)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:158)
at java.net.Socket.connect(Socket.java:461)
at java.net.Socket.connect(Socket.java:411)
at sun.net.NetworkClient.doConnect(NetworkClient.java:139)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:402)
at sun.net.www.http.HttpClient$3.run(HttpClient.java:451)
at java.security.AccessController.doPrivileged(Native Method)
at sun.net.www.http.HttpClient.privilegedOpenServer(HttpClient.java:448)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:595)
at sun.net.www.http.HttpClient.<init>(HttpClient.java:306)
at sun.net.www.http.HttpClient.<init>(HttpClient.java:267)


接続が拒否されているように感じますが、理由が分かりません。
ご存知の方がいらっしゃいましたら、教えてください。
また、JDK1.4の環境でURLConnection接続毎にタイムアウト値を設定するいい方法を
ご存知の方がいらっしゃいましたら、合わせてお願いします。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-01-05 16:56
タイムアウト値はシステムプロパティで設定できます。

http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/guide/net/properties.html
でも、「接続毎に」とはいかないはずですね。
だっちょ
大ベテラン
会議室デビュー日: 2006/12/05
投稿数: 115
投稿日時: 2007-01-05 17:25
 URLConnectionはあまり使わないので、
単にソースのあるWEBを見てて気がついたことですが、

 最初の大文字でHttpURLConnectionTimeout
とあるところにHttpClientTimeoutのクラス定義があって、
2つ目の大文字でHttpURLConnectionTimeout
とあるところにHttpURLConnectionTimeoutのクラス定義があるので、
ひょっとしてHttpURLConnectionTimeoutクラス定義をHttpClientTimeout
の内容にしてませんか?

 例外の内容は
sun.net.www.http.HttpClient.<init>
になっているので、HttpURLConnectionTimeoutがsun.net.www.protocol.http.HttpURLConnection
でなく
sun.net.www.http.HttpClient
を継承しているような気がします。
フライト
ベテラン
会議室デビュー日: 2005/03/11
投稿数: 63
お住まい・勤務地: 津田沼・東京
投稿日時: 2007-01-05 18:53
nagiseさん<
そうですね。。システムプロパティは接続毎には行かないので、、、


だっちょさん<
確認しましたが、HttpURLConnectionTimeoutはHttpURLConnectionを継承していました。


追記で、いろいろ試すと参考にしたクラスでlocalhostとIPアドレスの部分を
変更した所、接続が出来ました。
(http://xxx.xxxx.xxxx.xxxx/Test.doでは動作しなかったのが、http://localhost:8080/Test.doでは動作した。)

環境はUnixでtomcatとapacheを連動させているので、その設定がおかしいのでしょうか?
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-01-05 19:21
引用:

フライトさんの書き込み (2007-01-05 18:53) より:
追記で、いろいろ試すと参考にしたクラスでlocalhostとIPアドレスの部分を
変更した所、接続が出来ました。
(http://xxx.xxxx.xxxx.xxxx/Test.doでは動作しなかったのが、http://localhost:8080/Test.doでは動作した。)

環境はUnixでtomcatとapacheを連動させているので、その設定がおかしいのでしょうか?



バーチャルホストなどの設定がされていると、そのような動きになることは多いですね。
Windowsの場合だとhostsファイルをまず疑うところですが、
Unix系のOSには明るくないので類似のネタがあるかは私にはちょっとわかりません。
フライト
ベテラン
会議室デビュー日: 2005/03/11
投稿数: 63
お住まい・勤務地: 津田沼・東京
投稿日時: 2007-01-06 15:47
追記
http://xxx.xxxx.xxxx.xxxx/Test.doでもブラウザから叩くと正常に動作します。
(もちろんhttp://localhost:8080/Test.doでも)

まとめると
タイムアウトを意識していない作りの
java.net.HttpURLConnectionでは、問題なし
タイムアウトを意識しているでは
sun.net.www.protocol.http.HttpURLConnectionでは、何故かIPで叩くと接続が拒否される。


nagiseさん<
unixでもhostsがあるので疑ってみたのですが、ちょっとサーバー設定等には疎いので
お手上げになっています。
フライト
ベテラン
会議室デビュー日: 2005/03/11
投稿数: 63
お住まい・勤務地: 津田沼・東京
投稿日時: 2007-01-09 20:01
解決しました。

参考にしたサイトのHttpClientTimeoutのコンストラクタで親クラスのHttpClientに
URLとStringとintを渡してインスタンスを生成している箇所がありますが、
その箇所のStringで空白を渡すと、渡したURLを無視してサーバーのディフォルトの
ホストへ接続していました。

nullを渡した所、正常に動作するようになりました。
1

スキルアップ/キャリアアップ(JOB@IT)