Java NIO DatagramChannel

Java NIO DatagramChannel是可以发送和接收UDP数据包的通道,由于UDP是无连接的网络协议,因此默认情况下,不能像从其他通道一样对DatagramChannel进行读写,但可以发送和接收数据包。


1.打开DatagramChannel

DatagramChannel channel = DatagramChannel.open();

channel.socket().bind(new InetSocketAddress(9999));


本示例打开一个DatagramChannel,它可以在端口9999上接收数据包。


2.接收数据

可以通过调用DatagramChannel的receive()方法从DatagramChannel接收数据:

ByteBuffer buf = ByteBuffer.allocate(48);

buf.clear();



channel.receive(buf);


receive()方法会将接收到的数据包内容复制到给定的Buffer中,如果接收到的数据包包含的数据量超过缓冲区可以容纳的数据量,则其余数据将被丢弃。


3.发送数据

可以通过调用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("baidu.com", 80));


4.连接到指定的地址

可以将DatagramChannel“连接”到网络上的特定地址。由于UDP是无连接的,因此这种连接地址的方法不会像TCP通道那样建立真正的连接,而是它锁定了DatagramChannel,因此只能从一个特定地址发送和接收数据包。

这是一个例子:

channel.connect(new InetSocketAddress("baidu.com", 80));    


连接后,也可以使用read()和write()方法,就像使用传统通道一样,只是不能保证数据的发送:

int bytesRead = channel.read(buf);    

int bytesWritten = channel.write(buf);



 

展开阅读全文