Java NIO DatagramChannel
A Java NIO DatagramChannel is a channel that can send and receive UDP packets. Since UDP is a connection-less network protocol, you cannot just by default read and write to a DatagramChannel
like you do from other channels. Instead you send and receive packets(数据包) of data.
Opening a DatagramChannel
Here is how you open a DatagramChannel
:
DatagramChannel channel = DatagramChannel.open();
channel.socket().bind(new InetSocketAddress(9999)); // 绑定端口,在receive的时候从9999端口接收数据包
This example opens a DatagramChannel
which can receive packets on UDP port 9999.
Receiving Data(从udpChannel中读取数据)
You receive data from a DatagramChannel
by calling its receive()
method, like this:
ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();
channel.receive(buf);
The receive()
method will copy the content of a received packet of data into the given Buffer
. If the received packet contains more data than the Buffer
can contain, the remaining data is discarded silently.
如果没有数据进来,receive会block
Sending Data
You can send data via a DatagramChannel
by calling its send()
method, like this:
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));
This example sends the string to the "jenkov.com" server on UDP port 80. Nothing is listening on that port though, so nothing will happen. You will not be notified of whether the send packet was received or not, since UDP does not make any guarantees about delivery of data.(UDP不做任何保证)
Connecting to a Specific Address
It is possible to "connect" a DatagramChannel
to a specific address on the network. Since UDP is connection-less, this way of connecting to an address does not create a real connection, like with a TCP channel. Rather, it locks your DatagramChannel
so you can only send and receive data packets from one specific address.这里的连接并不是以个实际的url connection,而是对一个channel加锁,只允许这个udpchannel操作一个指定的地址,而不是随用随发,发到各种地址上。
Here is an example:
channel.connect(new InetSocketAddress("jenkov.com", 80));
When connected you can also use the read()
and write()
method, as if you were using a traditional channel. You just don't have any guarantees about delivery of the sent data. Here are a few examples:
int bytesRead = channel.read(buf);
int bytesWritten = channel.write(buf);
网友评论