Java NIO系列教程(十) Java NIO DatagramChannel
阿新 • • 發佈:2018-12-22
原文連結 作者: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);