public class DatagramSocket extends Object implements Closeable
データグラムソケットは、パケット配信サービスの送信点または受信点です。データグラムソケット上で送信または受信する各パケットは、それぞれ異なるアドレスで経路を指定されます。あるマシンから別のマシンに複数のパケットを送信する場合、各パケットは異なる経路で送信される可能性があり、宛先には任意の順序で到達する可能性があります。
可能な場合、新しく構築された DatagramSocket
は、ブロードキャストデータグラムの転送を許可するために SO_BROADCAST
ソケットオプションを有効にします。ブロードキャストパケットを受信するときは、DatagramSocket をワイルドカードアドレスにバインドするようにしてください。実装によっては、DatagramSocket が特定のアドレスにバインドされていてもブロードキャストパケットを受信する場合もあります。
例: DatagramSocket s = new DatagramSocket(null); s.bind(new InetSocketAddress(8888));
は、 DatagramSocket s = new DatagramSocket(8888);
と同等です。どちらのクラスも、UDP ポート 8888 でブロードキャストを受信できる DatagramSocket を作成します。
DatagramPacket
, DatagramChannel
修飾子 | コンストラクタと説明 |
---|---|
|
DatagramSocket()
データグラムソケットを構築し、ローカルホストマシン上の使用可能なポートにバインドします。
|
protected |
DatagramSocket(DatagramSocketImpl impl)
指定された DatagramSocketImpl を使用してバインドされていないデータグラムソケットを作成します。
|
|
DatagramSocket(int port)
データグラムソケットを構築し、ローカルホストマシン上の指定されたポートにバインドします。
|
|
DatagramSocket(int port, InetAddress laddr)
指定されたローカルアドレスにバインドされたデータグラムソケットを作成します。
|
|
DatagramSocket(SocketAddress bindaddr)
指定されたローカルソケットアドレスにバインドされたデータグラムソケットを作成します。
|
修飾子と型 | メソッドと説明 |
---|---|
void |
bind(SocketAddress addr)
この DatagramSocket を特定のアドレスおよびポートにバインドします。
|
void |
close()
このデータグラムソケットを閉じます。
|
void |
connect(InetAddress address, int port)
ソケットをこのソケットのリモートアドレスに接続します。
|
void |
connect(SocketAddress addr)
このソケットをリモートソケットアドレス (IP アドレス + ポート番号) に接続します。
|
void |
disconnect()
ソケットを切断します。
|
boolean |
getBroadcast()
SO_BROADCAST が有効かどうかを調べます。
|
DatagramChannel |
getChannel()
このデータグラムソケットに付けられた一意の
DatagramChannel オブジェクトを返します (存在する場合)。 |
InetAddress |
getInetAddress()
このソケットの接続先のアドレスを返します。
|
InetAddress |
getLocalAddress()
ソケットのバインド先のローカルアドレスを取得します。
|
int |
getLocalPort()
このソケットのバインド先となる、ローカルホスト上のポート番号を返します。
|
SocketAddress |
getLocalSocketAddress()
このソケットのバインド先の端点のアドレスを返します。
|
int |
getPort()
このソケットの接続先のポート番号を返します。
|
int |
getReceiveBufferSize()
この DatagramSocket で使われる SO_RCVBUF オプションの値を取得します。これは、この DatagramSocket で入力用としてプラットフォームが使うバッファーのサイズです。
|
SocketAddress |
getRemoteSocketAddress()
このソケットが接続されている端点のアドレスを返します。ソケットが接続されていない場合は
null を返します。 |
boolean |
getReuseAddress()
SO_REUSEADDR が有効かどうかを調べます。
|
int |
getSendBufferSize()
この DatagramSocket で使われる SO_SNDBUF オプションの値を取得します。これは、この DatagramSocket で出力用としてプラットフォームが使うバッファーのサイズです。
|
int |
getSoTimeout()
SO_TIMEOUT の設定を取得します。
|
int |
getTrafficClass()
この DatagramSocket から送信されるパケットの IP データグラムヘッダーのトラフィッククラスまたはサービス型を取得します。
|
boolean |
isBound()
ソケットのバインディング状態を返します。
|
boolean |
isClosed()
ソケットが閉じたかどうかを返します。
|
boolean |
isConnected()
ソケットの接続状態を返します。
|
void |
receive(DatagramPacket p)
このソケットからのデータグラムパケットを受信します。
|
void |
send(DatagramPacket p)
このソケットからデータグラムパケットを送信します。
|
void |
setBroadcast(boolean on)
SO_BROADCAST を有効または無効にします。
|
static void |
setDatagramSocketImplFactory(DatagramSocketImplFactory fac)
アプリケーションのデータグラムソケット実装ファクトリを設定します。
|
void |
setReceiveBufferSize(int size)
SO_RCVBUF オプションを、この DatagramSocket に指定された値に設定します。
|
void |
setReuseAddress(boolean on)
SO_REUSEADDR ソケットオプションを有効または無効にします。
|
void |
setSendBufferSize(int size)
SO_SNDBUF オプションを、この DatagramSocket に指定された値に設定します。
|
void |
setSoTimeout(int timeout)
指定されたタイムアウト (ミリ秒) を使って SO_TIMEOUT を有効または無効にします。
|
void |
setTrafficClass(int tc)
この DatagramSocket から送信されるデータグラムの IP データグラムヘッダーのトラフィッククラスまたはサービス型 octet を設定します。
|
public DatagramSocket() throws SocketException
wildcard
アドレス (カーネルによって選択された IP アドレス) にバインドされます。
セキュリティーマネージャーが存在する場合、この操作が許可されるように、最初にその checkListen
メソッドが 0 を引数に指定して呼び出されます。この結果、SecurityException がスローされることがあります。
SocketException
- ソケットを開くことができなかった場合、または指定されたローカルポートにソケットをバインドできなかった場合。SecurityException
- セキュリティーマネージャーが存在し、その checkListen
メソッドでこの操作が許可されていない場合。SecurityManager.checkListen(int)
protected DatagramSocket(DatagramSocketImpl impl)
impl
- サブクラスが DatagramSocket 上で使用する DatagramSocketImpl のインスタンス。public DatagramSocket(SocketAddress bindaddr) throws SocketException
アドレスが null
の場合は、バインドされていないソケットを作成します。
セキュリティーマネージャーが存在する場合は、まずセキュリティーマネージャーの checkListen
メソッドがソケットアドレスのポートを引数として呼び出され、操作が許可されるかどうかが確認されます。この結果、SecurityException がスローされることがあります。
bindaddr
- バインドするローカルソケットアドレス。バインドされていないソケットの場合は null
。SocketException
- ソケットを開くことができなかった場合、または指定されたローカルポートにソケットをバインドできなかった場合。SecurityException
- セキュリティーマネージャーが存在し、その checkListen
メソッドでこの操作が許可されていない場合。SecurityManager.checkListen(int)
public DatagramSocket(int port) throws SocketException
wildcard
アドレス (カーネルによって選択された IP アドレス) にバインドされます。
セキュリティーマネージャーが存在する場合、この操作が許可されるように、最初にその checkListen
メソッドが port
引数をその引数として指定して呼び出されます。この結果、SecurityException がスローされることがあります。
port
- 使用するポート。SocketException
- ソケットを開くことができなかった場合、または指定されたローカルポートにソケットをバインドできなかった場合。SecurityException
- セキュリティーマネージャーが存在し、その checkListen
メソッドでこの操作が許可されていない場合。SecurityManager.checkListen(int)
public DatagramSocket(int port, InetAddress laddr) throws SocketException
ワイルドカード
アドレス (カーネルによって選択された任意の IP アドレス) にバインドされます。
セキュリティーマネージャーが存在する場合、この操作が許可されるように、最初にその checkListen
メソッドが port
引数をその引数として指定して呼び出されます。この結果、SecurityException がスローされることがあります。
port
- 使用するローカルポートladdr
- バインド先のローカルアドレスSocketException
- ソケットを開くことができなかった場合、または指定されたローカルポートにソケットをバインドできなかった場合。SecurityException
- セキュリティーマネージャーが存在し、その checkListen
メソッドでこの操作が許可されていない場合。SecurityManager.checkListen(int)
public void bind(SocketAddress addr) throws SocketException
アドレスが null
の場合は、システムにより一時的なポートと有効なローカルアドレスが選択されてソケットがバインドされます。
addr
- バインド先のアドレスおよびポート。SocketException
- バインド時にエラーが発生した場合、またはソケットがすでにバインドされている場合。SecurityException
- セキュリティーマネージャーが存在し、その checkListen
メソッドでこの操作が許可されていない場合。IllegalArgumentException
- addr がこのソケットでサポートされていない SocketAddress サブクラスである場合。public void connect(InetAddress address, int port)
ソケットを接続するリモート接続先が存在しないか到達不可能の場合、およびそのアドレスに対する ICMP 転送先到達不能パケットを受信した場合は、以降の送信または受信呼び出しで PortUnreachableException がスローされることがあります。例外が必ずスローされるとは限らないことに注意。
セキュリティーマネージャーがインストールされている場合、リモートアドレスへのアクセスをチェックするためにそれが呼び出されます。具体的には、指定した address
が マルチキャストアドレス
である場合、指定した address
を使ってセキュリティマネージャーの checkMulticast
メソッドが呼び出されます。その他の場合、指定した address
と port
を使って、セキュリティマネージャーの checkConnect
メソッドと checkAccept
メソッドが呼び出され、それぞれ、データグラムの送信と受信が許可されていることを確認します。
ソケットが接続されたとき、送信
と受信
ではパケットの受信および送信に対するセキュリティーチェックを行いません。ただし、パケットとソケットのアドレスおよびポートが一致するかどうかの確認は行います。送信の処理では、パケットのアドレスが設定されている場合に、パケットのアドレスとソケットのアドレスが一致しないときは、IllegalArgumentException
がスローされます。マルチキャストアドレスに接続されているソケットは、送信パケットだけに使用できます。
address
- ソケットが使うリモートアドレスport
- ソケットが使うリモートポート。IllegalArgumentException
- アドレスが null である場合、またはポートが範囲外の場合。SecurityException
- セキュリティーマネージャーがインストールされていて、指定されたリモートアドレスへのアクセスが許可されていない場合disconnect()
public void connect(SocketAddress addr) throws SocketException
InetSocketAddress
が指定された場合、このメソッドは、指定したソケットアドレスの IP アドレスとポート番号を使用して connect(InetAddress,int)
を呼び出すかのように動作します。
addr
- リモートアドレス。SocketException
- 接続に失敗した場合IllegalArgumentException
- addr
が null
であるか、addr
がこのソケットによってサポートされていない SocketAddress サブクラスである場合SecurityException
- セキュリティーマネージャーがインストールされていて、指定されたリモートアドレスへのアクセスが許可されていない場合public void disconnect()
public boolean isBound()
ソケットが closed
となる前にバインドされていた場合、このメソッドはソケットが閉じられた後も引き続き true
を返します。
public boolean isConnected()
ソケットが closed
となる前に接続されていた場合、このメソッドはソケットが閉じられた後も引き続き true
を返します。
public InetAddress getInetAddress()
null
を返します。
ソケットが closed
前に接続されていた場合は、このメソッドはソケットが閉じられたあとも引き続き接続先アドレスを返します。
public int getPort()
-1
を返します。
ソケットが closed
前に接続されていた場合は、このメソッドはソケットが閉じられたあとも引き続き接続先ポート番号を返します。
public SocketAddress getRemoteSocketAddress()
null
を返します。
ソケットが closed
前に接続されていた場合は、このメソッドはソケットが閉じられたあとも引き続き接続先アドレスを返します。
SocketAddress
。ソケットがまだ接続されていない場合は null
。getInetAddress()
, getPort()
, connect(SocketAddress)
public SocketAddress getLocalSocketAddress()
SocketAddress
。ソケットが閉じられているか、まだバインドされていない場合は null
。getLocalAddress()
, getLocalPort()
, bind(SocketAddress)
public void send(DatagramPacket p) throws IOException
DatagramPacket
には、送信するデータ、データの長さ、リモートホストの IP アドレス、およびリモートホスト上のポート番号などの情報が格納されています。
セキュリティーマネージャーが存在し、ソケットが現在リモートアドレスに接続されていない場合、このメソッドは最初にいくつかのセキュリティーチェックを行います。最初に、p.getAddress().isMulticastAddress()
が true の場合、このメソッドは引数として p.getAddress()
を使い、セキュリティマネージャーの checkMulticast
メソッドを呼び出します。その式の評価が false の場合、このメソッドは代わりに、セキュリティーマネージャーの checkConnect
メソッドを、引数 p.getAddress().getHostAddress()
と p.getPort()
を指定して呼び出します。それぞれのセキュリティーマネージャーメソッド呼び出しの結果、操作が許可されない場合は SecurityException がスローされます。
p
- 送信される DatagramPacket
。IOException
- 入出力エラーが発生した場合。SecurityException
- セキュリティーマネージャーが存在し、その checkMulticast
または checkConnect
メソッドが送信を許可しない場合。PortUnreachableException
- 現在到達不可能になっている宛先にソケットが接続されている場合にスローされる可能性があります。例外が必ずスローされるとは限らないことに注意。IllegalBlockingModeException
- このソケットに関連するチャネルが存在し、そのチャネルが非ブロックモードである場合。IllegalArgumentException
- ソケットが接続されていて、接続したアドレスとパケットのアドレスが異なっている場合。DatagramPacket
, SecurityManager.checkMulticast(InetAddress)
, SecurityManager.checkConnect(java.lang.String, int)
public void receive(DatagramPacket p) throws IOException
DatagramPacket
のバッファーには受信したデータが格納されます。データグラムパケットには、送信者の IP アドレスと、送信者のマシンのポート番号も格納されています。
このメソッドはデータグラムが受信されるまでブロックされます。データグラムパケットオブジェクトの length
フィールドには、受信されるメッセージの長さの情報が格納されています。メッセージがパケットよりも長い場合、メッセージは切り詰められます。
セキュリティーマネージャーが存在する場合、セキュリティーマネージャーの checkAccept
メソッドがパケットの受信を許可しないときは、パケットの受信は行われません。
p
- 受信したデータを保存する DatagramPacket
。IOException
- 入出力エラーが発生した場合。SocketTimeoutException
- setSoTimeout が以前に呼び出されて、タイムアウトが過ぎた場合。PortUnreachableException
- 現在到達不可能になっている宛先にソケットが接続されている場合にスローされる可能性があります。例外が必ずスローされるとは限らないことに注意。IllegalBlockingModeException
- このソケットに関連するチャネルが存在し、そのチャネルが非ブロックモードである場合。DatagramPacket
、DatagramSocket
public InetAddress getLocalAddress()
セキュリティーマネージャーが存在する場合は、まずセキュリティーマネージャーの checkConnect
メソッドがホストアドレスおよび -1
を引数として呼び出され、操作が許可されるかどうかが確認されます。
null
。または、ソケットがバインドされていないか、セキュリティマネージャーの checkConnect
メソッドがこの操作を許可しない場合は、ワイルドカード
アドレスを表す InetAddress
SecurityManager.checkConnect(java.lang.String, int)
public int getLocalPort()
-1
、まだバインドされていない場合は 0
。public void setSoTimeout(int timeout) throws SocketException
timeout
- ミリ秒で表される、指定されたタイムアウト。SocketException
- 基本となるプロトコルで UDP エラーなどのエラーが発生した場合。getSoTimeout()
public int getSoTimeout() throws SocketException
SocketException
- 基本となるプロトコルで UDP エラーなどのエラーが発生した場合。setSoTimeout(int)
public void setSendBufferSize(int size) throws SocketException
SO_SNDBUF はヒントなので、アプリケーションでバッファーのサイズを調べる必要がある場合は、getSendBufferSize()
を呼び出すようにしてください。
バッファーサイズを大きくすると、送信速度が高い場合にネットワーク実装により複数の送信パケットをキューに入れることが可能になります。
注: send(DatagramPacket)
を使用して SO_SNDBUF の設定より大きい DatagramPacket
を送信する場合、パケットが送信されるか破棄されるかは実装によって異なります。
size
- 送信バッファーサイズの設定サイズ。この値は 0 より大きくなければならない。SocketException
- 基本となるプロトコルで UDP エラーなどのエラーが発生した場合。IllegalArgumentException
- 値が 0 または負の値である場合。getSendBufferSize()
public int getSendBufferSize() throws SocketException
SocketException
- 基本となるプロトコルで UDP エラーなどのエラーが発生した場合。setSendBufferSize(int)
public void setReceiveBufferSize(int size) throws SocketException
SO_RCVBUF はヒントなので、アプリケーションでバッファーのサイズ設定を調べる必要がある場合は、getReceiveBufferSize()
を呼び出してください。
SO_RCVBUF の値を大きくすると、receive(DatagramPacket)
を使用した受信より速くパケットが到達する場合に、ネットワーク実装による複数のパケットのバッファリングが可能になる場合があります。
注:SO_RCVBUF より大きいパケットを受信できるかどうかは実装によって異なります。
size
- 受信バッファーサイズの設定サイズ。この値は 0 より大きくなければならない。SocketException
- 基本となるプロトコルで UDP エラーなどのエラーが発生した場合。IllegalArgumentException
- 値が 0 または負の値である場合。getReceiveBufferSize()
public int getReceiveBufferSize() throws SocketException
SocketException
- 基本となるプロトコルで UDP エラーなどのエラーが発生した場合。setReceiveBufferSize(int)
public void setReuseAddress(boolean on) throws SocketException
UDP ソケットの場合、複数のソケットを同じソケットアドレスにバインドすることが必要になることがあります。マルチキャストパケットを受信するためには通常このようにします (MulticastSocket
を参照)。bind(SocketAddress)
を使用してソケットをバインドする前に SO_REUSEADDR ソケットオプションが有効になっていれば、SO_REUSEADDR ソケットオプションを使って複数のソケットを同一のソケットアドレスにバインドすることができます。
注:この機能は、既存のすべてのプラットフォームでサポートされているわけではありません。したがって、このオプションが無視されるかどうかは実装によって異なります。ただし、この機能がサポートされていない場合、getReuseAddress()
は常に false
を返します。
DatagramSocket が作成されると、SO_REUSEADDR の初期設定は無効になります。
ソケットがバインドされた (isBound()
を参照) あとで SO_REUSEADDR を有効または無効にする場合の動作は定義されていません。
on
- 有効にするか無効にするかを指定SocketException
- SO_RESUEADDR ソケットオプションの有効化または無効化時にエラーが発生した場合、またはソケットがクローズされている場合。getReuseAddress()
, bind(SocketAddress)
, isBound()
, isClosed()
public boolean getReuseAddress() throws SocketException
boolean
値。SocketException
- 基本となるプロトコルで UDP エラーなどのエラーが発生した場合。setReuseAddress(boolean)
public void setBroadcast(boolean on) throws SocketException
一部のオペレーティングシステムでは、このオプションを有効するため、つまりブロードキャストデータグラムを送信するために、実装固有の特権で Java 仮想マシンを起動する必要があります。
on
- ブロードキャストをオンにするかどうかを指定。SocketException
- 基本となるプロトコルで UDP エラーなどのエラーが発生した場合。getBroadcast()
public boolean getBroadcast() throws SocketException
boolean
値。SocketException
- 基本となるプロトコルで UDP エラーなどのエラーが発生した場合。setBroadcast(boolean)
public void setTrafficClass(int tc) throws SocketException
tc の範囲は 0 <= tc <= 255
でなければいけません。そうでない場合は、IllegalArgumentException がスローされます。
注:
IP (Internet Protocol) バージョン 4 の場合、この値は integer
で構成され、最下位 8 ビットが、ソケットによって送信された IP パケットの TOS オクテットの値を表します。RFC 1349 では TOS の値は次のように定義されています。
IPTOS_LOWCOST (0x02)
IPTOS_RELIABILITY (0x04)
IPTOS_THROUGHPUT (0x08)
IPTOS_LOWDELAY (0x10)
優先フィールドにビットを設定すると、操作が許可されないことを示す SocketException になることがあります。
IP (Internet Protocol) Version 6 の場合、tc
は IP ヘッダーの sin6_flowinfo フィールドに格納される値です。
tc
- ビットセットの int
値。SocketException
- トラフィッククラスまたはサービスタイプの設定時にエラーが発生した場合getTrafficClass()
public int getTrafficClass() throws SocketException
使用するネットワーク実装が、setTrafficClass(int)
を使用して設定されたトラフィッククラスまたはサービス型を無視することがあるので、この DatagramSocket で setTrafficClass(int)
メソッドを使用して以前に設定された値とは異なる値がこのメソッドから返されることがあります。
SocketException
- トラフィッククラスまたはサービスタイプの値を取得する際にエラーが発生した場合。setTrafficClass(int)
public void close()
このソケットの receive(java.net.DatagramPacket)
で現在ブロックされているすべてのスレッドが SocketException
をスローします。
このソケットに関連するチャネルが存在する場合は、そのチャネルも閉じられます。
close
、インタフェース: Closeable
close
、インタフェース: AutoCloseable
public boolean isClosed()
public DatagramChannel getChannel()
DatagramChannel
オブジェクトを返します (存在する場合)。
チャネル自体が DatagramChannel.open
メソッドを使用して作成された場合にだけ、データグラムソケットにチャネルが存在します。
public static void setDatagramSocketImplFactory(DatagramSocketImplFactory fac) throws IOException
アプリケーションで新しいデータグラムソケットを作成すると、ソケット実装ファクトリの createDatagramSocketImpl
メソッドが呼び出され、実際のデータグラムソケット実装が作成されます。
このメソッドに null
を渡しても、ファクトリがすでに設定されていないかぎり、それは無操作になります。
セキュリティーマネージャーが存在する場合、この操作が許可されるように、このメソッドは最初にセキュリティーマネージャーの checkSetFactory
メソッドを呼び出します。この結果、SecurityException がスローされることがあります。
fac
- 目的のファクトリ。IOException
− データグラムソケットファクトリの設定中に入出力エラーが発生した場合。SocketException
- ファクトリがすでに定義されている場合。SecurityException
- セキュリティーマネージャーが存在し、その checkSetFactory
メソッドでこの操作が許可されていない場合。DatagramSocketImplFactory.createDatagramSocketImpl()
, SecurityManager.checkSetFactory()
バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.