上一小节讲到 DatagramPacket 数据包的作用就是如同是“集装箱”,可以将发送端或者接收端的数据封装起来。然而运输货物只有“集装箱”是不够的,还需要有“码头”。同理,在程序中,要实现通信,只有 DatagramPacket 数据包也是不行的,它也需要一个“码头”。为此,JDK 提供了一个 DatagramSocket 类,该类的作用就类似于“码头”,使用这个类的实例对象就可以发送和接收 DatagramPacket 数据包。发送数据的过程如下所示:
在创建发送端和接收端的 DatagramSocket 对象时,使用的构造方法也有所不同,下面对 DatagramSocket 类中常用的构造方法进行讲解。
- DatagramSocket()
该构造方法用于创建发送端的 DatagramSocket()对象,在创建 DatagramSocket 对象时,并没有指定端口号,此时系统会分配一个没有被其他网络程序使用的端口号。
- DatagramSocket(int port)
该构造方法既可用于创建接收端的 DatagramSocket 对象,又可以创建发送端的 DatagramSocket 对象,在创建接收端的 DatagramSocket 对象时,必须要指定一个端口号,这样就可以监听指定的端口。
- DatagramSocket(int port, InetAddress addr)
使用该构造方法在创建 DatagramSocket 对象时,不仅指定了端口号,还指定了相关的 IP 地址。该对象的使用适用于计算机上有多块网卡的情况,在使用时可以明确规定数据通过哪块网卡向外发送和接收哪块网卡的数据。由于计算机中针对不同的网卡会分配不同的 IP,因此在创建 DatagramSocket 对象时需要指定 IP 地址来确定使用哪块网卡进行通信。
讲解了 DatagramSocket 的构造方法后,接下来对 DatagramSocket 类中的常用方法进行详细的讲解,如下表所示:
方法声明 | 功能描述 |
---|---|
void receive(DatagramSocket p) | 该方法用于将接收到的数据填充到 DatagramPacket 数据包中,在接收到数据之前会一直处于阻塞状态,只有当接收到数据包时,该方法才会返回 |
void send(DatagramSocket p) | 该方法用于发送 DatagramPacket 数据包,发送的数据包中包含将要发送的数据、数据的长度、远程主机的 IP 地址和端口号 |
void close() | 关闭当前的 Socket,通知驱动程序释放为这个 Socket 保留的资源 |
上表中针对 DatagramSocket 类中常用方法及其功能进行了介绍。其中,前两个方法可以完成数据的发送或者接收的功能。