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
メソッドが呼び出され、それぞれ、データグラムの送信と受信が許可されていることを確認します。
ソケットが接続されたとき、receive
とsend
ではパケットの受信および送信に対するセキュリティ・チェックを行いません。ただし、パケットとソケットのアドレスおよびポートが一致するかどうかの確認は行います。送信の処理では、パケットのアドレスが設定されている場合に、パケットのアドレスとソケットのアドレスが一致しないときは、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
0
より大きい値を指定します。タイム・アウト0は無限のタイム・アウトとして解釈されます。timeout
- ミリ秒で表される、指定されたタイム・アウト。SocketException
- 基本となるプロトコルでUDPエラーなどのエラーが発生した場合。getSoTimeout()
public int getSoTimeout() throws SocketException
SocketException
- 基本となるプロトコルでUDPエラーなどのエラーが発生した場合。setSoTimeout(int)
public void setSendBufferSize(int size) throws SocketException
DatagramSocket
に指定された値に設定します。SO_SNDBUFオプションは、使用するネットワーク入出力バッファのサイズを設定するヒントとして、ネットワーク実装が使います。また、ネットワーク実装は、このソケットで送信できるパケットの最大サイズを判定するためにもSO_SNDBUF設定を使います。
SO_SNDBUFはヒントなので、アプリケーションでバッファのサイズを調べる必要がある場合は、getSendBufferSize()
を呼び出すようにしてください。
バッファ・サイズを大きくすると、送信速度が高い場合にネットワーク実装により複数の送信パケットをキューに入れることが可能になります。
注: send(DatagramPacket)
を使用してSO_SNDBUFの設定より大きいDatagramPacket
を送信する場合、パケットが送信されるか破棄されるかは実装によって異なります。
size
- 送信バッファ・サイズの設定サイズ。この値は0より大きくなければならない。SocketException
- 基本となるプロトコルでUDPエラーなどのエラーが発生した場合。IllegalArgumentException
- 値が0または負の値である場合。getSendBufferSize()
public int getSendBufferSize() throws SocketException
DatagramSocket
で使われるSO_SNDBUFオプションの値を取得します。これは、このDatagramSocket
で出力用としてプラットフォームが使うバッファのサイズです。DatagramSocket
のSO_SNDBUFオプションの値SocketException
- 基本となるプロトコルでUDPエラーなどのエラーが発生した場合。setSendBufferSize(int)
public void setReceiveBufferSize(int size) throws SocketException
DatagramSocket
に指定された値に設定します。SO_RCVBUFオプションは、使用するネットワーク入出力バッファのサイズを設定するヒントとして、ネットワーク実装が使います。また、ネットワーク実装は、このソケットで受信できるパケットの最大サイズを判定するためにもSO_RCVBUF設定を使います。
SO_RCVBUFはヒントなので、アプリケーションでバッファのサイズ設定を調べる必要がある場合は、getReceiveBufferSize()
を呼び出してください。
SO_RCVBUFの値を大きくすると、receive(DatagramPacket)
を使用した受信より速くパケットが到達する場合に、ネットワーク実装による複数のパケットのバッファリングが可能になる場合があります。
注: SO_RCVBUFより大きいパケットを受信できるかどうかは実装によって異なります。
size
- 受信バッファ・サイズの設定サイズ。この値は0より大きくなければならない。SocketException
- 基本となるプロトコルでUDPエラーなどのエラーが発生した場合。IllegalArgumentException
- 値が0または負の値である場合。getReceiveBufferSize()
public int getReceiveBufferSize() throws SocketException
DatagramSocket
で使われるSO_RCVBUFオプションの値を取得します。これは、このDatagramSocket
で入力用としてプラットフォームが使うバッファのサイズです。DatagramSocket
のSO_RCVBUFオプションの値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
メソッドを使用して作成された場合にだけ、データグラム・ソケットにチャネルが存在します。
null
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, 2014, Oracle and/or its affiliates. All rights reserved.