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

BindExceptionとConnectExceptionの違いがわからず悩んでいます。

Socketを使って通信する際、すでに接続が確立しているポート番号を
使うことはできないのはわかります。
ここで、「すでに接続が確立している」とは
たとえばnetstatコマンド(netstat -n)でstatusがESTABLISHED
になっていることかなあと思っています。

ところが、同じESTABLISHEDとなっているポートでも、
ある番号ではBindExceptionが、別の番号ではConnectExceptionが出ます。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/ja …
を見てみると、
BindException:
ソケットをローカルアドレスおよびポートにバインドしようとしているときエラーが発生したことを示します。
ConnectException :
ソケットをリモートアドレスおよびポートに接続しようとしたときエラーが発生したことを示します。

のようにありますが、「バインド」と「接続」の違いがわかりません。
どなかた教えて頂ける方、いらっしゃいませんでしょうか。

A 回答 (1件)

TCP/IP の話となりますが、



TCP/IP では、ネットワーク通信の際に、クライアントとサーバ間にて、通信を
行う事になります。

クライアントとは、サーバへ接続を要求して、通信を処理する者です。

サーバとは、クライアントからの接続を受け付け、通信を処理する者です。

通信の流れとしては、
サーバが接続受付用のアドレスとポートを待ち受け用ポートとして、関連付けし、
使用します。この処理をバインドと呼んでいます。

次に、クライアントから、サーバが待ち受けしているアドレスとポートへ接続
を要求します。正しくサーバへ接続されると、クライアント/サーバ間にて、
通信が出来る事でしょう。
この接続を接続と呼んでいます。(#この説明は蛇足か。)

ですから、
> BindException:
> ソケットをローカルアドレスおよびポートにバインドしようとしているときエラーが発生したことを示します。
は、サーバ側で、待ち受け用ポートを準備している時に失敗。

ConnectException :
ソケットをリモートアドレスおよびポートに接続しようとしたときエラーが発生したことを示します。
は、クライアント側で、サーバへの接続に失敗。

と言う解釈だと思います。

TCP/IPや、クライアント/サーバに付いては、必要に応じて、別途調べてみてください。
    • good
    • 0
この回答へのお礼

ありがとうございます。とてもよくわかりました。
プログラムでも挙動確認できました。

お礼日時:2009/01/13 17:54

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