12 Java NIO DatagramChannel-翻譯

王金龍發表於2017-12-06

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);
複製程式碼

相關文章