Java之UDP编程

DatagramSocket概述

上次在Java网络套接字Socket编程那篇博客里只写了Socket和ServerSocket,即TCP通信,这次来补充一下UDP通信。

和Socket类似的,Java中也存在一个DatagramSocket类,它就是面向UDP中的数据报包的概念传输,对应java.net包下面有一个类DatagramPacket就是用来描述数据报包。

因为UDP是无连接的,不分客户端和服务端,在单次通信中,只有发送端和接收端,因此也没有什么DatagramServerSocket

DatagramSocket使用

DatagramSocket():建立一个udp socket,它实际上是调用了DatagramSocket(new InetSocketAddress(0)),即指定端口号为0,0的含义是这个端口号是根据系统指定动态生成的。

其他构造函数就是和Socket类似的传一个端口号进去、传一个SocketAddress进去。

bind:绑定端口

connect:虽然udp是无连接的,但可以只与同一台机器通信,这种情况也称它为connect,connect之后所有的send和receive操作都与指定的主机通信。

send:发送一个DatagramPacket数据报包

receive:接收一个数据报包,这个方法是阻塞的。

close:释放socket

需要注意的是receive方法需要传入一个数据报包对象,这个数据报包对象由一个空的字节数组构造,而字节数组的长度值得考虑,如果过小可能会造成数据截断,所以发送方和接收方最好对数据包的大小制定约定规范。

示例:

@Test
public void testSend() throws IOException {
    DatagramSocket socket = new DatagramSocket();

    byte[] msg = "hello".getBytes();
    DatagramPacket packet = new DatagramPacket(msg, 0, msg.length, new InetSocketAddress("localhost", 12306));

    socket.send(packet);
    socket.close();
}

@Test
public void testReceive() throws IOException {
    DatagramSocket socket = new DatagramSocket(12306);
    byte[] buffer = new byte[1024];
    DatagramPacket packet = new DatagramPacket(buffer,0, buffer.length);
    socket.receive(packet);

    System.out.println(packet.getPort());
    System.out.println(new String(packet.getData(),0,packet.getLength()));
    socket.close();
}

DatagramChannel

需要了解的是,UDP本身就不存在什么阻塞,不需要连接,只在receive的时候会阻塞等待数据报。使用DatagramChannel可以设置非阻塞,则在从DatagramChannel中读数据报的时候如果没有数据报,就可以立即返回null。

相关API:public abstract SocketAddress receive(ByteBuffer dst) throws IOException;

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/java%e4%b9%8budp%e7%bc%96%e7%a8%8b/

(0)
彭晨涛彭晨涛管理者
上一篇 2020年3月11日
下一篇 2020年3月11日

相关推荐

  • 快速失败(fail-fast)和安全失败(fail-safe)

    快速失败 在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出 Concurrent Modification Exception。…

    Java 2020年2月23日
    0140
  • 谈谈Java中的Iterator

    摘要 Iterator的作用? Iterator和Enumeration的区别? Iterator和ListIterator的区别? Iterator和foreach的关联? It…

    Java 2019年12月6日
    0180
  • String s = new String("123");创建了几个String对象?

    提要 最近复习看到一道题目很有意思啊: String s = new String("123"); 问这样一行代码创建了几个String对象? 乍一看我其实以为和JDK的版本有关系…

    Java 2020年5月24日
    0580
  • 遗留线程安全类Vector和HashTable简要源码分析

    总结 总结放前面防止太长不看 Vector Vector就是使用synchronized限制线程安全的一个List实现。 Vector是基于数组实现的,默认初始容量是10,在构造的…

    Java 2020年2月15日
    0680
  • Java中的四种内部类

    我发现最近真是越来越没有东西写了。。。不可能天天学习新知识啊,最近在复习阶段了,复习的东西大多数是博客里写过的/(ㄒoㄒ)/ 复习Java基础的时候认真看了一下Java的内部类,这…

    Java 2020年5月23日
    0100
  • JDK8-Stream流库详解

    流提供了一种让我们可以在比集合更高的概念级别上指定计算的数据视图。通过使用流,我们可以说明想要完成什么任务,而不是说明如何去实现它。 流的创建 Collection.stream(…

    Java 2020年2月11日
    0150
  • NIO网络编程之Selector介绍

    Selector 要实现异步IO要通过Selector,甚至我们可以通过一个线程管理多个Channel的读写,这是NIO相较BIO的优越之处之一。 Channel可以注册到一个Se…

    Java 2020年2月7日
    0760
  • Java8避免空指针异常Optional类的使用

    最近都是一天写一篇算法题解,好久没有写过博客了,不知道写啥了而且快到期末考试了。。 今天介绍一个Java8的特性:Optional类,这个类我平时也不咋用,今天来研究一下。 Opt…

    Java 2020年6月3日
    0660
  • Java反射机制和动态代理详解

    反射 概念 反射机制: 指的是可以于运行时加载、探知、使用编译期间完全未知的类。 程序在运行状态中,可以动态加载一个只有名称的类,对于任意一个已加载的类,都能够知道这个类的所有属性…

    Java 2020年2月15日
    0570
  • Java网络套接字Socket编程

    Socket概述 Socket,译作网络套接字,是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。网络套接字与一个应用进程(ip和端口号)绑定。 Socket与Ser…

    Java 2020年2月5日
    0440

发表回复

登录后才能评论