1. 程式人生 > >Java NIO系列教程(十) Java NIO DatagramChannel

Java NIO系列教程(十) Java NIO DatagramChannel

原文連結    作者:Jakob Jenkov    譯者:鄭玉婷     校對:丁一

Java NIO中的DatagramChannel是一個能收發UDP包的通道。因為UDP是無連線的網路協議,所以不能像其它通道那樣讀取和寫入。它傳送和接收的是資料包。

開啟 DatagramChannel

下面是 DatagramChannel 的開啟方式:

DatagramChannel channel = DatagramChannel.open();
channel.socket().bind(new InetSocketAddress(9999));

這個例子開啟的 DatagramChannel可以在UDP埠9999上接收資料包。

接收資料

通過receive()方法從DatagramChannel接收資料,如:

ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();
channel.receive(buf);

receive()方法會將接收到的資料包內容複製到指定的Buffer. 如果Buffer容不下收到的資料,多出的資料將被丟棄。

傳送資料

通過send()方法從DatagramChannel傳送資料,如:

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”伺服器的UDP埠80。 因為服務端並沒有監控這個埠,所以什麼也不會發生。也不會通知你發出的資料包是否已收到,因為UDP在資料傳送方面沒有任何保證。

連線到特定的地址

可以將DatagramChannel“連線”到網路中的特定地址的。由於UDP是無連線的,連線到特定地址並不會像TCP通道那樣建立一個真正的連線。而是鎖住DatagramChannel ,讓其只能從特定地址收發資料。

這裡有個例子:

channel.connect(new InetSocketAddress("jenkov.com", 80));

當連線後,也可以使用read()和write()方法,就像在用傳統的通道一樣。只是在資料傳送方面沒有任何保證。這裡有幾個例子:

int bytesRead = channel.read(buf);
int bytesWritten = channel.write(but);