美文网首页
DatagramChannel

DatagramChannel

作者: JiinYuu | 来源:发表于2018-12-27 15:37 被阅读0次

    Java NIO DatagramChannel是一种可以发送和接收UDP数据包的Channel。因为UDP是一个无连接的协议,所以默认情况下你不能像其他Channel一样对DatagramChannel读写数据。而是发送和接收数据包。

    Opening a DatagramChannel

    以下是如何打开一个DatagramChannel的例子:

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

    上述例子演示了如何打开一个可以接收9999端口来的UDP数据包的DatagramChannel

    Receiving Data

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

    ByteBuffer buffer = ByteBuffer.allocate(48);
    buffer.clear();
    
    channel.receive(buffer);
    

    receive()方法会将接收到数据包的数据拷贝到Buffer中。如果数据包中的数据超过了Buffer的容量,则多余的数据会被默默的丢掉。

    Sending Data

    你还可以通过调用DatagramChannelsend()方法来发送数据,就像这样:

    String newData = "New String to write to file..." +  System.currentTimeMillis();
    ByteBuffer buffer = ByteBuffer.allocate(48);
    buffer.clear();
    buffer.put(newData.getBytes());
    buffer.flip();
    
    int bytesSent = channel.send(buffer, new InetAddress("jenkov.com", 80));
    

    本例将字符串数据发送到了“jenkov.com”服务器的UDP端口80上。但并没有任何程序在监听这个端口,所以什么也不会发生。你不会收到关于你发送的数据是否已被接收的通知,因为UDP对于数据的交付不做任何的保证。

    Connecting to a Specific Address

    DatagramChannel是可以“连接”到网络上特定地址的。因为UDP是无连接的,所以这种“连接”不是真正像TCP那样的和远程地址建立了一个连接。不如说是它将锁定你的DatagramChannel,以便你只能向一个特定的地址发送和接收数据包。

    下面是个例子:

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

    当“连接”建立后,你可以像使用传统的Channel一样调用read()write()方法。只是对于发送的数据,你不会得到任何关于交付的保证。下面是一些例子:

    int bytesRead = channel.read(buffer);
    
    int bytesWrite = channel.write(buffer);
    

    发现貌似有人在看这个系列文章了,有必要说明下,这个Java NIO系列来源于jenkov.com,本文只是翻译,希望大家千万不要误会,本文不是原创。原文地址:Java NIO

    相关文章

      网友评论

          本文标题:DatagramChannel

          本文链接:https://www.haomeiwen.com/subject/zobrlqtx.html