Java NIO的DatagramChannel是一個可以傳送和接收UDP包的Channel。由於UDP是一個無連線的網路協議,所以不能像其它通道那樣讀取和寫入。它傳送和接收的是資料包。
Opening a DatagramChannel
下面是DatagramChannel的開啟方式
DatagramChannel channel = DatagramChannel.open();
channel.socket().bind(new InetSocketAddress(9999));
複製程式碼
這個例子開啟的 DatagramChannel可以在UDP埠9999上接收資料包。
Receiving Data
可以通過呼叫receive()方法從DatagramChannel中接收資料,像這樣:
ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();
channel.receive(buf);
複製程式碼
receive方法會將接收到的包資料寫入到Buffer中。如果接收到的資料大於Buffer的大小,剩下的資料將會被丟棄。
Sending Data
可以通過DatagramChannel的send()方法來傳送資料,像這樣。
String newData = "New String to write to file..."
+ System.currentTimeMillis();
ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();
buf.put(newData.getBytes());
buf.flip();
int bytesSent = channel.send(buf, new InetSocketAddress("jenkov.com", 80));
複製程式碼
這個例子向“jenkov.com”伺服器上的80埠傳送了訊息。那個埠並沒有監聽,因此,什麼事情也沒有發生。你也不會被通知訊息是否收到或沒有收到。因為DUP並不會保證訊息的可靠傳輸。
Connecting to a Specific Address
可以將DatagramChannel連線到網路中的指定地址。由於DUP是無連線的,這種方式的連線不會像TCP Channel那樣建立新的連線。它會將DatagramChannel進行鎖定,使它只能在指定的地址進行讀寫資料。
下面是一個例子:
channel.connect(new InetSocketAddress("jenkov.com",80));
複製程式碼
當連線上了以後,就可以使用read()和write()方法,就像在使用傳統的Channel一樣。這裡並不需要保證資料的傳送。下面是一些例子:
int bytesRead = channel.read(buf);
int bytesWritten = channel.write(buf);
複製程式碼