25.2UDP编程(了解)
UDP(User Datagrams Protocol)用户数据报协议,是一种使用数据报的机制来传递信息的协议。
数据报(Datagrams)是一种在不同机器之间传递的信息包,该信息包一旦从某一机器被发送给指定目标,那么该发送过程并不会保证数据一定到达目的地,甚至不保证目的地的存在真实性。反之,数据报被接受时,不保证数据没有受损,也不保证发送该数据报的机器仍在等待响应。
由此可见,UDP协议是一种基于数据报的快速的(因为它无需花时间去保证数据是否损坏,无需花时间确定接受方是否存在并等待响应)、无连接的、不可靠的数据报传输协议。
在java中,通过两个特定类来实现UDP协议顶层数据报,分别是DatagramPacket和DatagramSocket,其中类DatagramPacket (数据报包)是一个数据容器,是数据报包,用来保存即将要传输的数据,将地址信息和要发送的数据以字节数组的方式同时压缩入这个类创建的对象中;而类DatagramSocket表示用来发送和接收DatagramPacket的套接字,实现了数据报的通信方式。数据报套接字是包投递服务的发送或接收点。
22.2.1 DatagramSocket
DatagramSocket类常见的构造方法如下:
DatagramSocket():创建一个以当前计算机的任意可用端口为发送端口的数据报连接
DatagramSocket(int port):创建一个以当前计算机port端口为发送端口的数据报连接
DatagramScoket(int port, InetAddress address):创建一个以当前计算机的port端口为发送端口、address为IP地址的发送数据报连接
DatagramSocket类常用的几个方法如下:
void close() throws IOException:关闭数据报连接
void recieve(DatagramPacket packet):接收来自于packet数据报的信息,阻塞式方法
void send(DatagramPacket packet):发送packet数据报
void connect(InetAddress address, int port):以指定端口port为发送端口,向IP地址为address的计算机发送数据报连接
void disconnect():断开连接
DatagramChannel getChannel():和SocketChannel类似
DatagramSocket类在客户端创建自寻址套接字与服务器端进行通信连接,并发送和接受自寻址套接字。虽然有多个构造方法可供选择,但发现创建客户端自寻址套接字最便利的选择是DatagramSocket()方法,而服务器端则是DatagramSocket(int port)方法,如果未能创建自寻址套接字或绑定自寻址套接字到本地端口,那么这两个方法都将抛出一个SocketException对象,一旦程序创建了DatagramSocket对象,那么程序分别调用send(DatagramPacket dgp)和receive(DatagramPacket dgp)来发送和接收自寻址数据包。
22.2.2 DatagramPacket
DatagramPacket类常见的构造方法如下:
DatagramPacket(byte[] buff, int length);
DatagramPacket(byte[] buf, int offset, int length);
DatagramPacket(byte[] buf, int length, InetAddress address, int port);
DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port);
第一个构造方法用于创建一个指定数据缓冲区大小和信息包的容量大小的DatagramPacket,但没有数据包的地址和端口信息,这些信息可以通过调用方法setAddress(InetAddress addr)和setPort(int port)添加上。
第二个构造方法用于创建一个长度大小为length的缓冲区,并指定数据存储(读取)的偏移地址为offset的DatagramPacket。
第三个创建一个指定缓冲区大小、传送(接受)IP地址、端口号的DatagramPacket。一般情况下,发送地址是由DatagramPacket指定。
DatagramPacket类常用的几个方法如下:
byte[] getData():用于得到发送过来的DatagramPacket中的数据
void setData(byte[] buf):用于将buf中的数据写入DatagramPacket中,以备发送
InetAddress getAddress():返回目标的InetAddress
int getLength():返回将要发送或接收到的数据的长度
int getPort():返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的
SocketAddress getSocketAddress():获取要将此包发送到的或发出此数据报的远程主机的 SocketAddress(通常为IP地址+端口号)
22.2.3 简单的实现UDP的基本通讯: