Java NIO中的DatagramChannel是一個能收發UDP包的通道。因爲UDP是無連接的網絡協議,所以不能像其它通道那樣讀取和寫入。它發送和接收的是數據包。
打開 DatagramChannel
下面是 DatagramChannel 的打開方式:
1 |
DatagramChannel
channel = DatagramChannel.open(); |
2 |
channel.socket().bind( new InetSocketAddress( 9999 )); |
這個例子打開的 DatagramChannel可以在UDP端口9999上接收數據包。
接收數據
通過receive()方法從DatagramChannel接收數據,如:
1 |
ByteBuffer
buf = ByteBuffer.allocate( 48 ); |
receive()方法會將接收到的數據包內容複製到指定的Buffer. 如果Buffer容不下收到的數據,多出的數據將被丟棄。
發送數據
通過send()方法從DatagramChannel發送數據,如:
1 |
String
newData = "New
String to write to file..." +
System.currentTimeMillis(); |
3 |
ByteBuffer
buf = ByteBuffer.allocate( 48 ); |
5 |
buf.put(newData.getBytes()); |
8 |
int bytesSent
= channel.send(buf, new InetSocketAddress( "jenkov.com" , 80 )); |
這個例子發送一串字符到”jenkov.com”服務器的UDP端口80。 因爲服務端並沒有監控這個端口,所以什麼也不會發生。也不會通知你發出的數據包是否已收到,因爲UDP在數據傳送方面沒有任何保證。
連接到特定的地址
可以將DatagramChannel“連接”到網絡中的特定地址的。由於UDP是無連接的,連接到特定地址並不會像TCP通道那樣創建一個真正的連接。而是鎖住DatagramChannel ,讓其只能從特定地址收發數據。
這裏有個例子:
1 |
channel.connect( new InetSocketAddress( "jenkov.com" , 80 )); |
當連接後,也可以使用read()和write()方法,就像在用傳統的通道一樣。只是在數據傳送方面沒有任何保證。這裏有幾個例子:
1 |
int bytesRead
= channel.read(buf); |
2 |
int bytesWritten
= channel.write(but); |