12 Java NIO DatagramChannel-翻译

408 阅读1分钟

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