public static class hiSocket.UDP extends DatagramSocket implements hiSocket.UdpIF, AutoCloseable
Objectをシリアライズして送受信することのできる
UDPSocket(DatagramSocket
)です。
利用者が相手アドレスを意識せず応答を返すこともできます。
バイト配列の送受信も用意してあります。
UDP通信では受信側が準備できていない場合など送信データは廃棄されるため、 TCP通信の様に通信路が詰まってしまいプログラムが固まってしまうといった ことが発生しません。
サーバ側はport番号を指定して構築し、クライアント側は 指定せず構築します。REUSE_ADDRを指定することもできます。
// 受信側 UDP _sock= hiSocket.UDP.newSocket(5963,hiU.REUSE_ADDR); Object _obj; while( (_obj=_sock.receiveObject())!=null ){ System.out.println(_obj.toString()); } _sock.close(); // 送信側 UDP _sock=new UDP(); _sock.sendObject(5963,"情報1"); _sock.sendObject(5963,"情報2"); _sock.sendObject(5963,null); _sock.close();
応答を返すメソッドも用意されています。
// 受信側 UDP _sock= hiSocket.UDP.newSocket(5963,hiU.REUSE_ADDR); Object _obj; int _n=0; while( (_obj=_sock.receiveObject())!=null ){ System.out.println(_obj.toString()); _sock.sendResponceObject("応答"+(++_n)); } _sock.close(); // 送信側 UDP _sock=new hiSocket.UDP.newSocket(); _sock.sendObject(5963,"情報1"); System.out,println(_sock.receiveObject()); _sock.sendResponceObject("情報2"); System.out,println(_sock.receiveObject()); _sock.sendResponceObject(null); _sock.close();
パケットデータ(DatagramPacket)の送受信も行えます。
// 受信側 UDP _sock= hiSocket.UDP.newSocket(5963,hiU.REUSE_ADDR); DatagramPacket _pkt; int _n=0; while( (_pkt=_sock.receivePacket())!=null ){ System.out.println(_obj.toString()); _sock.sendResponceObject("応答"+(++_n)); } _sock.close(); // 送信側 UDP _sock=new hiSocket.UDP.newSocket(); _sock.sendObject(5963,"情報1"); System.out,println(_sock.receiveObject()); _sock.sendResponceObject("情報2"); System.out,println(_sock.receiveObject()); _sock.sendResponceObject(null); _sock.close();
修飾子とタイプ | クラスと説明 |
---|---|
static class |
hiSocket.UDP.Multicast
マルチキャスト用UDPソケット(Object送受信機能を持つ).
|
修飾子とタイプ | フィールドと説明 |
---|---|
static int |
MAX_DATA_LEN_ON_PACKET
デフォルトパケット内最大データ長.
|
コンストラクタと説明 |
---|
UDP()
クライアント側UDPソケット.
|
UDP(int port_)
ポート指定で待ち受け側側UDPソケットを作る.
|
UDP(int port_,
InetAddress laddr_,
long option_)
ポート指定で待ち受け側側UDPソケットを作る.
|
UDP(int port_,
long option_)
ポート指定で待ち受け側側UDPソケット(IP4)を作る.
|
修飾子とタイプ | メソッドと説明 |
---|---|
void |
close()
closeする.
|
static byte[] |
getBytes(DatagramPacket pkt_)
DatagramPacketのデータを有効長byte配列として得る.
|
static hiSocket.UDP |
newSocket()
UDPソケットを作る.
|
static hiSocket.UDP |
newSocket(int port_)
ポート指定で待ち受け側側UDPソケットを作る.
|
static hiSocket.UDP |
newSocket(int port_,
InetAddress laddr_,
long option_)
ポート指定で待ち受け側UDPソケットを作る.
|
static hiSocket.UDP |
newSocket(int port_,
long option_)
ポート指定で待ち受け側側UDPソケットを作る.
|
void |
receive(DatagramPacket p_) |
byte[] |
receiveBytes()
バイト配列を受信する(簡易版).
|
Object |
receiveObject()
Object(シリアライズされたもの)を受信する.
|
DatagramPacket |
receivePacket()
パケットを受信する.
|
String |
receiveString()
String(シリアライズされたもの)を受信する.
|
void |
send(DatagramPacket p_) |
int |
sendBytes(int port_,
byte[] bytes_,
int len_)
バイト配列を送信する.
|
int |
sendBytes(SocketAddress addr_,
byte[] bytes_,
int len_)
バイト配列を送信する.
|
int |
sendBytes(String addrText_,
byte[] bytes_,
int len_)
バイト配列を送信する.
|
int |
sendBytes(String host_,
int port_,
byte[] bytes_,
int len_)
バイト配列を送信する.
|
int |
sendObject(int port_,
Object obj_)
Objectをシリアライズして送信する.
|
int |
sendObject(SocketAddress addr_,
Object obj_)
Objectをシリアライズして送信する.
|
int |
sendObject(String host_,
int port_,
Object obj_)
Objectをシリアライズして送信する.
|
int |
sendObject(String addrText_,
Object obj_)
Objectをシリアライズして送信する.
|
int |
sendResponceBytes(byte[] bytes_,
int len_)
応答バイト配列を返す.
|
int |
sendResponseObject(Object obj_)
応答を返す.
|
int |
sendResponseString(String text_)
応答を返す.
|
int |
sendString(int port_,
String text_)
Stringをシリアライズして送信する.
|
int |
sendString(SocketAddress addr_,
String text_)
Stringをシリアライズして送信する.
|
int |
sendString(String host_,
int port_,
String text_)
Stringをシリアライズして送信する.
|
int |
sendString(String addrText_,
String text_)
Stringをシリアライズして送信する.
|
int |
sendStringAsBytes(SocketAddress addr_,
String text_)
Stringを単純なUTF-8バイト並びとして1パケットで送信する
|
void |
setDataLenMax(int len_)
パケット内に置くデータの最大長を指定する.
|
static int |
staticSendBytes(int port_,
byte[] bytes_,
int len_)
バイト列送信のstaticメソッド.
|
static int |
staticSendBytes(SocketAddress addr_,
byte[] bytes_,
int len_)
バイト列送信のstaticメソッド.
|
static int |
staticSendBytes(String addrText_,
byte[] bytes_,
int len_)
バイト列送信のstaticメソッド.
|
static int |
staticSendBytes(String host_,
int port_,
byte[] bytes_,
int len_)
バイト列送信のstaticメソッド.
|
static int |
staticSendObject(int port_,
Object obj_)
Object送信のstaticメソッド.
|
static int |
staticSendObject(SocketAddress addr_,
Object obj_)
Object送信のstaticメソッド.
|
static int |
staticSendObject(String host_,
int port_,
Object obj_)
Object送信のstaticメソッド.
|
static int |
staticSendObject(String addrText_,
Object obj_)
Object送信のstaticメソッド.
|
static int |
staticSendString(int port_,
String text_)
文字列送信のstaticメソッド.
|
static int |
staticSendString(SocketAddress addr_,
String text_)
文字列送信のstaticメソッド.
|
static int |
staticSendString(String host_,
int port_,
String text_)
文字列送信のstaticメソッド.
|
static int |
staticSendString(String addrText_,
String text_)
文字列送信のstaticメソッド.
|
void |
use_exception(boolean use_exception_)
例外を投げる設定.
|
bind, connect, connect, disconnect, getBroadcast, getChannel, getInetAddress, getLocalAddress, getLocalPort, getLocalSocketAddress, getPort, getReceiveBufferSize, getRemoteSocketAddress, getReuseAddress, getSendBufferSize, getSoTimeout, getTrafficClass, isBound, isClosed, isConnected, setBroadcast, setDatagramSocketImplFactory, setReceiveBufferSize, setReuseAddress, setSendBufferSize, setSoTimeout, setTrafficClass
public static final int MAX_DATA_LEN_ON_PACKET
public UDP() throws SocketException
throwsメソッドです。
throws無しのnewSocket()
を用いれば例外はRuntimeExcptionmaまたはhiExceptionにラップされて投げられます
SocketException
- 構築失敗public UDP(int port_) throws SocketException
受信に用いるアドレスのバインドされたUDPソケットです。
throwsメソッドです。
throws無しのnewSocket(int)
を用いれば例外はRuntimeExcptionmaまたはhiExceptionにラップされて投げられます
port_
- ポートSocketException
- 構築失敗public UDP(int port_, long option_) throws SocketException
受信に用いるアドレスのバインドされたUDPソケットです。
throwsメソッドです。
throws無しのnewSocket(int,long)
を用いれば例外はRuntimeExcptionmaまたはhiExceptionにラップされて投げられます
port_
- ポートoption_
- オプション (hiU.REUSE_ADDR)SocketException
- 構築失敗public UDP(int port_, InetAddress laddr_, long option_) throws SocketException
受信に用いるアドレスのバインドされたUDPソケットです。
throwsメソッドです。
throws無しのnewSocket(int,InetAddress,long)
を用いれば例外はRuntimeExcptionmaまたはhiExceptionにラップされて投げられます
port_
- ポートladdr_
- ローカルアドレスoption_
- オプション (hiU.REUSE_ADDR)SocketException
- 構築失敗public void receive(DatagramPacket p_)
receive
インタフェース内 hiSocket.UdpIF
receive
クラス内 DatagramSocket
public void send(DatagramPacket p_)
send
インタフェース内 hiSocket.UdpIF
send
クラス内 DatagramSocket
public static hiSocket.UDP newSocket()
public static hiSocket.UDP newSocket(int port_)
port_
- ポートpublic static hiSocket.UDP newSocket(int port_, long option_)
受信に用いるアドレスのバインドされたUDPソケットです。
port_
- ポートoption_
- オプション (hiU.REUSE_ADDR)public static hiSocket.UDP newSocket(int port_, InetAddress laddr_, long option_)
受信に用いるアドレスのバインドされたUDPソケットです。
throwsメソッドです。
throws無しのnewSocket(int,InetAddress,long)
を用いれば例外はRuntimeExcptionmaまたはhiExceptionにラップされて投げられます
port_
- ポートladdr_
- ローカルアドレスoption_
- オプション (hiU.REUSE_ADDR)public void setDataLenMax(int len_)
UDPパケットに載せるデータの最大長を指定します。
デフォルトは65507です。
0以下は無効です。65507を超える値を指定しても
UDPパケットに乗りきらない可能性があります。
len_
- 長さpublic void use_exception(boolean use_exception_)
デフォルトでは送信時にはnullポインタや
アドレスフォーマット異常などを除いて
Exceptionを投げません。
use_exception(true)とすることによりI/O
エラーやサイズエラーの例外を投げるように
なります。
use_exception_
- true:例外を投げるpublic int sendObject(SocketAddress addr_, Object obj_)
Objectをシリアライズして送信するメソッドです。
addr_
- 相手アドレスobj_
- 送信するシリアライズ可能Object nullなら受信側もnullになるpublic int sendString(SocketAddress addr_, String text_)
Stringtをシリアライズして送信するstaticメソッドです。
sendObject()との差は、データが長すぎる場合分割送信する
機能を持つことです。
分割された場合受信側には複数の文字列として上がることに注意してください。
addr_
- 相手アドレスtext_
- 送信する文字列 空文字列なら受信側も空文字列、nullなら受信側もnullpublic int sendStringAsBytes(SocketAddress addr_, String text_)
addr_
- 相手アドレスtext_
- 送信する文字列 空文字列なら受信側も空文字列、nullなら受信側もnullpublic int sendObject(String host_, int port_, Object obj_)
Objectをシリアライズして送信するstaticメソッドです。
host_
- ホスト名port_
- ポート番号obj_
- 送信するシリアライズ可能Object nullなら受信側もnullになるpublic int sendString(String host_, int port_, String text_)
Stringをシリアライズして送信するstaticメソッドです。 sendObject()との差は、データが長すぎる場合分割送信する 機能を持つことです。 分割された場合受信側には複数の文字列として上がることに注意してください。
host_
- ホスト名port_
- ポート番号text_
- 送信する文字列 空文字列なら受信側も空文字列、nullなら受信側もnullpublic int sendObject(int port_, Object obj_)
Objectをシリアライズして送信するstaticメソッドです。
port_
- ポート番号obj_
- 送信するシリアライズ可能Object nullなら受信側もnullになるpublic int sendString(int port_, String text_)
Stringtをシリアライズして送信するstaticメソッドです。 sendObject()との差は、データが長すぎる場合分割送信する 機能を持つことです。 分割された場合受信側には複数の文字列として上がることに注意してください。
port_
- ポート番号text_
- 送信する文字列 空文字列なら受信側も空文字列、nullなら受信側もnullpublic int sendObject(String addrText_, Object obj_)
Objectをシリアライズして送信するstaticメソッドです。
addrText_
- ホスト名:ポート番号obj_
- 送信するシリアライズ可能Object nullなら受信側もnullになるpublic int sendString(String addrText_, String text_)
Stringをシリアライズして送信するstaticメソッドです。 sendObject()との差は、データが長すぎる場合分割送信する 機能を持つことです。 分割された場合受信側には複数の文字列として上がることに注意してください。
addrText_
- ホスト名:ポート番号text_
- 送信する文字列 空文字列なら受信側も空文字列、nullなら受信側もnullpublic int sendResponseObject(Object obj_)
receiveObject()で受信した後応答を返します。
obj_
- 送信するシリアライズ可能Object nullなら受信側もnullになるpublic int sendResponseString(String text_)
receiveObject()で受信した後応答を返します。 sendObject()との差は、データが長すぎる場合分割送信する 機能を持つことです。 分割された場合受信側には複数の文字列として上がることに注意してください。
text_
- 送信する文字列 空文字列なら受信側も空文字列、nullなら受信側もnullpublic int sendBytes(SocketAddress addr_, byte[] bytes_, int len_)
バイト配列を送信します。送信可能なサイズは65507バイト以下です。 指定データ長が配列より長い場合は配列サイズが採用されます。
sendBytes
インタフェース内 hiSocket.UdpIF
addr_
- 相手アドレスbytes_
- 送信するバイト配列len_
- データ長public int sendBytes(String host_, int port_, byte[] bytes_, int len_)
バイト配列を送信します。送信可能なサイズは65507バイト以下です。 指定データ長が配列より長い場合は配列サイズが採用されます。
host_
- ホスト名port_
- ポート番号bytes_
- 送信するバイト配列len_
- データ長public int sendBytes(int port_, byte[] bytes_, int len_)
バイト配列を送信します。送信可能なサイズは65507バイト以下です。 指定データ長が配列より長い場合は配列サイズが採用されます。
port_
- ポート番号bytes_
- 送信するバイト配列len_
- データ長public int sendBytes(String addrText_, byte[] bytes_, int len_)
バイト配列を送信します。送信可能なサイズは65507バイト以下です。 指定データ長が配列より長い場合は配列サイズが採用されます。
addrText_
- ホスト名:ポート番号bytes_
- 送信するバイト配列len_
- データ長public int sendResponceBytes(byte[] bytes_, int len_)
受信した後応答を返します。送信可能なサイズは65507バイト以下です。 指定データ長が配列より長い場合は配列サイズが採用されます。
bytes_
- 送信するバイト配列len_
- データ長public Object receiveObject()
Objectを受信します。
受信サイズが0の場合nullが返ります
RuntimeException
- IOException
をcauseとして持つ。public DatagramPacket receivePacket()
RuntimeException
- IOException
をcauseとして持つ。public static final byte[] getBytes(DatagramPacket pkt_)
次の操作と同じです
// DatagramPacket _pkt; byte[] _p_data= _pkt.getData(); int _p_len = _pkt.getLen(); byte[] _data = hiByte.resize(_p_data,_p_len);
pkt_
- データを取り出したいDatagramPacketpublic String receiveString()
Stringを受信します。
Objectで受けてStringにキャストしています。送信側で複数String
に分割されたものは複数Stringとして受け取ります。
受信サイズが0の場合nullが返ります
RuntimeException
- IOException
をcauseとして持つ。public byte[] receiveBytes()
バイト配列として受信します。
次の操作と同等です。
DatagramSocket ds =new DatagramSocket(ポート番号); byte buf[]=new byte[65536]; DatagramPacket dp =new DatagramPacket(buf,buf.length); ds.receive(packet); byte data[] =Arrays.copyOf(dp.getData(),dp.getLength());
制限:
・同一UDPSocketでの操作はスレッドセーフではありません。
RuntimeException
- IOException
をcauseとして持つ。public void close()
close
インタフェース内 Closeable
close
インタフェース内 AutoCloseable
close
クラス内 DatagramSocket
public static int staticSendObject(SocketAddress addr_, Object obj_)
単純に送信するだけで、かつパケット内データ最大長がデフォルト(65507バイト) でよいなら、UDPインスタンスを作成せず、このstaticメソッドで 送信できます。
addr_
- アドレスobj_
- 送信するObjectsendObject(SocketAddress,Object)
public static int staticSendObject(String host_, int port_, Object obj_)
単純に送信するだけで、かつパケット内データ最大長がデフォルト(65507バイト) でよいなら、UDPインスタンスを作成せず、このstaticメソッドで 送信できます。
host_
- ホストport_
- ポートobj_
- 送信するObjectsendObject(String,int,Object)
public static int staticSendObject(int port_, Object obj_)
単純に送信するだけで、かつパケット内データ最大長がデフォルト(65507バイト) でよいなら、UDPインスタンスを作成せず、このstaticメソッドで 送信できます。
port_
- ポートobj_
- 送信するObjectsendObject(int,Object)
public static int staticSendObject(String addrText_, Object obj_)
単純に送信するだけで、かつパケット内データ最大長がデフォルト(65507バイト) でよいなら、UDPインスタンスを作成せず、このstaticメソッドで 送信できます。
addrText_
- アドレス文字列 (ホスト:ポート)obj_
- 送信するObjectsendObject(String,Object)
public static int staticSendString(SocketAddress addr_, String text_)
単純に送信するだけで、かつパケット内データ最大長がデフォルト(65507バイト) でよいなら、UDPインスタンスを作成せず、このstaticメソッドで 送信できます。
addr_
- アドレスtext_
- 文字列sendString(SocketAddress,String)
public static int staticSendString(String host_, int port_, String text_)
単純に送信するだけで、かつパケット内データ最大長がデフォルト(65507バイト) でよいなら、UDPインスタンスを作成せず、このstaticメソッドで 送信できます。
host_
- ホストport_
- ポートtext_
- 文字列sendString(String,int,String)
public static int staticSendString(int port_, String text_)
単純に送信するだけで、かつパケット内データ最大長がデフォルト(65507バイト) でよいなら、UDPインスタンスを作成せず、このstaticメソッドで 送信できます。
port_
- ポートtext_
- 文字列public static int staticSendString(String addrText_, String text_)
単純に送信するだけで、かつパケット内データ最大長がデフォルト(65507バイト) でよいなら、UDPインスタンスを作成せず、このstaticメソッドで 送信できます。
addrText_
- アドレス文字列text_
- 文字列sendString(String,String)
public static int staticSendBytes(SocketAddress addr_, byte[] bytes_, int len_)
単純に送信するだけで、かつパケット内データ最大長がデフォルト(65507バイト) でよいなら、UDPインスタンスを作成せず、このstaticメソッドで 送信できます。
addr_
- アドレスbytes_
- バイト配列len_
- バイト長sendBytes(SocketAddress,byte[],int)
public static int staticSendBytes(int port_, byte[] bytes_, int len_)
単純に送信するだけで、かつパケット内データ最大長がデフォルト(65507バイト) でよいなら、UDPインスタンスを作成せず、このstaticメソッドで 送信できます。
port_
- ポートbytes_
- バイト配列len_
- バイト長sendBytes(int,byte[],int)
public static int staticSendBytes(String host_, int port_, byte[] bytes_, int len_)
単純に送信するだけで、かつパケット内データ最大長がデフォルト(65507バイト) でよいなら、UDPインスタンスを作成せず、このstaticメソッドで 送信できます。
host_
- ホストport_
- ポートbytes_
- バイト配列len_
- バイト長sendBytes(String,int,byte[],int)
public static int staticSendBytes(String addrText_, byte[] bytes_, int len_)
単純に送信するだけで、かつパケット内データ最大長がデフォルト(65507バイト) でよいなら、UDPインスタンスを作成せず、このstaticメソッドで 送信できます。
addrText_
- アドレス文字列bytes_
- バイト配列len_
- バイト長sendBytes(String,byte[],int)