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