Java Nio 十二、Java NIO DatagramChannel(数据报通道)

最后更新时间:2014-06-23

一个Java NIO数据报通道是一个可以发送和接收UDP包的通道。因为UDP是一个无连接的网络协议,你不能像其他的通道那样只是默认的读和写。代替的你发送和接收数据包。

打开一个DatagramChannel

这里是如何打开一个DatagramChannel:

DatagramChannel channel = DatagramChannel.open();
channel.socket().bind(new InetSocketAddress(9999));

这个例子打开一个DatagramChannel,它可以接收到一个UDP端口为9999的数据包。

接收数据

你可以通过调用DatagramChannel的receive()方法的接收数据,像这样:

ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();

channel.receive(buf);

这个receive()方法将会拷贝一个接收到的数据包的内容进入到给予的Buffer。如果这个接收到的包超过了Buffer可以接收的数据,那个剩下的数据将会被安静的放弃。

发送数据

你可以通过调用send()方法通过一个DatagramChannel发送数据,像下面这样:

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"的服务器接通UDP的80端口。不过没有东西在那个端口上正在监听,以至于什么都不会发生。你将不会被通知这个发送的包是否被接收到,因为UDP对于数据的传递不会做任何的保证。

连接到一个特殊的地址

在网络上连接一个特殊地址的DatagramChannel是可能的。因为UDP是一个无连接的协议,这个连接到一个地址的方式不会创建一个真的连接,就像一个TCP通道。然而,它将会锁住你的DatagramChannel,以至于只能从一个特殊的地址中发送和接收数据包。

这里有一个例子:

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

当连接上的时候,你也可以使用read()和write()方法,同样的如果你正在使用一个传统的通道。你只是不会有任何的保证关于发送数据的传送。这里有几个例子:

int bytesRead = channel.read(buf); 

int bytesWritten = channel.write(buf);


翻译地址:http://tutorials.jenkov.com/java-nio/datagram-channel.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java NIO(New IO)是在 Java 1.4 中引入的,提供了一种新的 IO API,可以优化 IO 操作的速度和效率。以下是 Java NIO 中用到的一些类和接口: 1. java.nio.Buffer:这是所有缓冲区类的基类,定义了缓冲区的四个属性:容量、位置、限制和标记。 2. java.nio.ByteBuffer:这是字节缓冲区类,用于读写字节数据。 3. java.nio.CharBuffer:这是字符缓冲区类,用于读写字符数据。 4. java.nio.ShortBuffer、java.nio.IntBuffer、java.nio.LongBuffer、java.nio.FloatBuffer、java.nio.DoubleBuffer:这些都是基本类型的缓冲区类,用于读写不同类型的数据。 5. java.nio.channels.Channel:这是通道接口,表示一个可以进行 IO 操作的实体,例如文件或网络连接。 6. java.nio.channels.FileChannel:这是文件通道类,用于对文件进行读写操作。 7. java.nio.channels.SocketChannel:这是网络套接字通道类,用于对 TCP 连接进行读写操作。 8. java.nio.channels.ServerSocketChannel:这是网络服务器套接字通道类,用于监听客户端连接请求。 9. java.nio.channels.Selector:这是选择器类,用于监听多个通道的 IO 事件,避免使用多线程进行 IO 操作。 10. java.nio.charset.Charset:这是字符集类,用于进行字符编码和解码操作。 除了以上提到的类和接口,Java NIO 还有许多其他的类和接口,例如:java.nio.channels.Pipe、java.nio.channels.DatagramChanneljava.nio.channels.AsynchronousChannelGroup、java.nio.channels.AsynchronousServerSocketChanneljava.nio.channels.AsynchronousSocketChannel 等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值