- PR -

URL openConnection()で止まってしまう。

投稿者投稿内容
おばけ
ぬし
会議室デビュー日: 2002/11/14
投稿数: 609
お住まい・勤務地: 東京都江東区
投稿日時: 2004-10-08 01:32
引用:

そもそも、このURL.openConnection()メソッドを呼び出した段階では、接続はどう
なっているのでしょう。このとき接続できるかどうか試みているのでしょうか。


netstatコマンドで接続が確立しているかどうか見てみたらいかがでしょう?
Windows 2000/XPやLinux、UNIXでは、"netstat -a"で見られます。
komey
ベテラン
会議室デビュー日: 2003/11/27
投稿数: 76
投稿日時: 2004-10-08 16:32
すみません、どうも私自身よくわからなかったのでちょっと試してみたところ、実際にパケットが送られるのはopenConnection()ではなく、connect()のところのようです。
つまり、実際に相手サーバと接続できる/できないとはあまり関係ないような気がします。
上記はWindowsのJ2SE5.0で試しました。実装が違うようであれば意味ないですが・・・・・・。

というわけで、別のところに原因があるかもしれないのですが、前後のソースを出してもらうことはできないですか?
また、「止まってしまう」というのは、openConnection()を実行したら戻り値が返ってこず、例外も投げられていない、ということでいいんですよね?


あと、質問には全く関係がなく揚げ足を取るようで申し訳ないのですが、POSTでデータを送りたいのであれば、
> URL u = new URL("https://IP Address/xxx/xxx?xxx=xxx");
のように、URLの後ろにパラメータを付けるのはあまり正しいお作法とは言えず、メッセージボディに書くのが正しいやりかただと思います。
アプリケーションサーバによっては、この書き方ではPOSTでデータを送っても認識してくれないサーバがいます。
# たしかWebLogicは認識せず、Tomcatは認識してくれたと思います。

トラジャ
ベテラン
会議室デビュー日: 2002/12/05
投稿数: 75
投稿日時: 2004-10-10 10:39
引用:

komeyさんの書き込み (2004-10-08 16:32) より:
すみません、どうも私自身よくわからなかったのでちょっと試してみたところ、実際にパケットが送られるのはopenConnection()ではなく、connect()のところのようです。
つまり、実際に相手サーバと接続できる/できないとはあまり関係ないような気がします。
上記はWindowsのJ2SE5.0で試しました。実装が違うようであれば意味ないですが・・・・・・。

というわけで、別のところに原因があるかもしれないのですが、前後のソースを出してもらうことはできないですか?
また、「止まってしまう」というのは、openConnection()を実行したら戻り値が返ってこず、例外も投げられていない、ということでいいんですよね?



komeyさん、いろいろとありがとうございます。

プログラムの中では、接続ためのメソッドを呼び出すと以下のように始まっているの
ですが。

try{
URL u = new URL("https://IP Address/xxx/xxx?xxx=xxx");
System.out.println("Try openConnection");
HttpURLConnection hCon = (HttpURLConnection)u.openConnection();
System.out.println("success openConnection");

以下、認証処理と入出力ストリーム取得
return true;
}
catch(Exception e){
return false;
}

何らかの例外がスローされれば捕まえるようにしています。また、どこまで処理が進
んだかを知るために、Tomcatのcatalina.outに"System.out"で出力させています。

そうすると、最初に書き込んだようにFreeBSD4.9の運用サーバーだけ"Try openConnection"とログに記録されているのですが、次の"success openConnection"
が記録されていないので、
HttpURLConnection hCon = (HttpURLConnection)u.openConnection();
の行で止まっていると思われます。

引用:


あと、質問には全く関係がなく揚げ足を取るようで申し訳ないのですが、POSTでデータを送りたいのであれば、
> URL u = new URL("https://IP Address/xxx/xxx?xxx=xxx");
のように、URLの後ろにパラメータを付けるのはあまり正しいお作法とは言えず、メッセージボディに書くのが正しいやりかただと思います。
アプリケーションサーバによっては、この書き方ではPOSTでデータを送っても認識してくれないサーバがいます。
# たしかWebLogicは認識せず、Tomcatは認識してくれたと思います。




はい。ただ、受け取る側のASPがこのURLでないと処理できないみたいで、最初
"https://IP Address/xxx/xxx.ASP?xxx=xxx"の"?xxx=xxx"を外してPOSTするときに
その部分を一緒に送ったら認識してもらえませんでした。

それで、"?xxx=xxx"はURLにくっつけています。ASPはJavaのサーブレットのように
"GET"と"POST"をどちらで送信されてきてもいいような処理ができるようになっていな
いのでしょうか。

いずれにしても、このURLでもテスト環境のWinとLinuxでは問題なく接続できているので、運用環境のFreeBSD4.9サーバーでなぜできないのか、というのが謎です。

おばけさんの、netstatはいま運用サーバーに少しの期間アクセスできないので、でき
るようになったらすぐに試してみたいと思います。

他にも、なんでもいいので原因究明につながりそうなことがあれば、ご指摘いただけ
れば助かります。
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2004-10-10 12:38
トラジャさん、こんにちは。

当会議室にて比較的最近、類似の質問がありましたが、
もしかして原因がそれと同じではないかと思われます。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=14504&forum=12

Javaの APIドキュメントで、java.net.HttpURLConnection
とあわせてスーパクラスである java.net.URLConnection
の一読をお勧めします。
トラジャ
ベテラン
会議室デビュー日: 2002/12/05
投稿数: 75
投稿日時: 2004-10-13 22:04
引用:


当会議室にて比較的最近、類似の質問がありましたが、
もしかして原因がそれと同じではないかと思われます。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=14504&forum=12

Javaの APIドキュメントで、java.net.HttpURLConnection
とあわせてスーパクラスである java.net.URLConnection
の一読をお勧めします。




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

教えてくださった質問では、入出力ストリームの順番が関係しているようなのですが、
私の問題は、それ以前に"url.openConnection()"メソッドを呼び出して、
URLConnectionのインスタンスを取得する際に、インスタンスが作成されず、しかも
Exceptionもスローされず、そこから先の処理に移らないということなんです。

もしかして、FreeBSD版のJDKのバグかなんかがあるのでしょうか?

トラジャ
ベテラン
会議室デビュー日: 2002/12/05
投稿数: 75
投稿日時: 2004-10-13 23:19
引用:

netstatコマンドで接続が確立しているかどうか見てみたらいかがでしょう?
Windows 2000/XPやLinux、UNIXでは、"netstat -a"で見られます。



おばけさん、お世話になります。

netstat -aで接続状態を表示してみたところ、
一覧の中に、相手のサーバーと接続している"ESTABLISHED"なコネクションは表示
されていませんでした。

やはり、コネクションができていないのでしょうか。
いっきゅう
大ベテラン
会議室デビュー日: 2004/04/04
投稿数: 153
お住まい・勤務地: 兵庫
投稿日時: 2004-10-14 10:05
トラジャさん、こんにちは

根本的なこと確認したいのですが
運用環境で用いられているJavaのバージョンは何でしょうか?
その上でFreeBSDのJavaのそのリリースでそういったバグは無いのか
調べておいた方がいいのではないでしょうか。
後、BsdでJavaを動かす場合のパッチもちゃんと当てているのか
確認してみてはどうでしょうか?


後、次は確認したのでしょうか?
・運用サーバと決済サーバ間にFirewallはあるのか。
 あるならproxyの設定はしているのか。
(次は今まで確認しているのはTomcatから呼び出していると判断した上で)
・スタンドアローンでHttpURLConnectionで接続した場合。
・スタンドアローンでSocketで接続した場合。
・TomcatでSocketで接続した場合。
これにそれぞれ接続先をHttpとHttpsの両方確認。

以上のような事を私なら最低限確認しようと思います。

[ メッセージ編集済み 編集者: いっきゅう 編集日時 2004-10-14 10:21 ]
おばけ
ぬし
会議室デビュー日: 2002/11/14
投稿数: 609
お住まい・勤務地: 東京都江東区
投稿日時: 2004-10-14 18:48
引用:

netstat -aで接続状態を表示してみたところ、一覧の中に、
相手のサーバーと接続している"ESTABLISHED"なコネクションは
表示されていませんでした。


なるほど。だとすると接続されていないと思われます。

ちょっと思ったんですが、Javaプログラム経由だと名前解決できないとか、そういう
事象も考えられるかも知れません。ホスト名でpingできるということは、基本的には
名前解決できているはずです。この場合、Javaプログラムからだと名前解決が出来ず、
タイムアウト待ちになる、とかいった現象かもしれません。

あてずっぽうですが、一応ご参考までに。

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