DatagramSocket
切断されたときにバインドされたままのAは、バインドを解除するclose()
メソッドです。UDP(データグラム)ソケットの場合、およびのセマンティクスはTCP(または他のコネクション型)ソケットconnect()
とは異なることに注意してください。disconnect()
UDPはコネクションレス型プロトコルであり、バウンドDatagramSocket
は「接続」されていなくてもパケットを送受信できます。このconnect()
方法は、ソケットが特定のホスト/ポートに対してのみパケットを送受信できるようにする、つまりフィルターとして機能するという点で、純粋にローカルな効果があります。マルチキャストまたはブロードキャストアドレスに接続されているDatagramSocket
場合、パケットを送信することはできますが、受信することはできません。
bind(SocketAddress)
ソケットをローカルアドレス/ポートの組み合わせに接続するために使用されます。ソケットがバインドされる前は、パケットを送受信できません。コンストラクターのデフォルトの動作は、ソケットをすぐにバインドすることです。バインドされていない'DatagramSocket'を作成するには、引数としてDatagramSocket(SocketAddress)
渡すコンストラクターを使用します。null
次に、でバインドする前に、任意のカスタム構成をソケットに適用できますbind()
。
スコープ外のオープンがリソースリークを引き起こすことがわかっている限りDatagramSocket
、オブジェクトはガベージコレクションされる可能性がありますが、JVMプロセスが終了するまで、基盤となるUDPソケットはOSによって割り当てられたままになると確信しています。
ソケットがバインドされる前にアドレスが指定されていない場合、バインドされるとワイルドカードアドレス(INADDR_ANY
)に接続され、使用可能なローカルアドレスからパケットを送受信できるようになります(後で何らかのホストに「接続」されている場合を除く)。ポートが指定されていない(または0として指定されている)場合、ソケットはOSによって選択された使用可能なポート(エフェメラルポート)にバインドされます。
編集:例
// bind to INADDR_ANY, allowing packets on all IP addresses of host:
DatagramSocket dsock = new DatagramSocket(55555);
DatagramPacket packet = new DatagramPacket(new byte[8192]);
//next packet can be from anywhere including local host (127.0.0.0/8)
dsock.receive(packet);
// restrict communication to a single host/port:
dsock.connect(new InetSocketAddress("somehost.net", 99));
// next packet can only be from somehost.net on port 99:
dsock.receive(packet);