閱讀699 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

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);


文章轉自 並發編程網-ifeve.com

最後更新:2017-05-22 17:01:30

  上一篇:go  Java項目經驗——程序員成長的鑰匙
  下一篇:go  Java NIO係列教程(六) Selector