- udp简介:
UDP是无连接通信协议,即在数据传输时,数据发送端和接收端不建立逻辑连接,简单来说,当一个计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在。就会发送数据;同样接收端在收到数据时,也不会向发送端反馈是否收到数据。
特点:消耗资源小,通信效率高,常用于音频、视频和普通数据的传输,视频会议都是用UDP,因为在这种情况下丢失一两个数据包,也不会对接收结果产生太大影响,但是使用UDP传输数据时,由于其面向无连接性,不能保证数据的完整性,因此传输中药数据时不建议使用UDP协议。
2.java提供的类
DatagramPacket(集装箱):封装UDP通信中发送和接收的数据,使用时接收端可以只需要接收一个字节数组来存放收到的数据,也可以只接收指定IP和端口的数据,而发送端不但要存放发送数据的字节数组,还需要指定接收端IP地址和端口号。
构造方法:
(1)DatagramPacket(byte buf[], int length):只能用于接收端,参数为字节数组和数据大小;
(2)DatagramPacket(byte buf[], int length, InetAddress address, int port):通常用于发送端,参数为字节数组,数据大小,接收地址和端口号
(3)DatagramPacket(byte buf[], int offset, int length):用于接收端,参数多了一个offset,表示在将接收到的数据放入buff缓存数组时,从offset位开始放入
(4)DatagramPacket(byte buf[], int offset, int length, InetAddress address, int port):与(2)相似,主要在于参数新增offset, 表示在将接收到的数据放入buff缓存数组时,从offset位开始放入。
获取数据的方法:
(1) InetAddress getAddress():返回InetAddress 对象,DatagramPacket中的接收地址;
(2) getPort():返回int型数据,DatagramPacket中的端口号;
(3) getData():返回byte数组,内容为发送或接收数据;
(4) getLength():发送或接收数据长度,int型数据。
DatagramSocket(码头):发送和接收DatagramPacket数据包,两者关系如下图:码头和集装箱:
构造方法:
(1)DatagramSocket ():创建发送端DatagramSocket对象,在创建时没有指定端口号,所以系统会分配一个没有被其他网络程序所使用的端口号;
(2)DatagramSocket (int port):创建接收端DatagramSocket对象或者发送端对象,在创建接收端对象时,port代表指定监听的端口;发送端代表发送端端口。
(3)DatagramSocket (int port,InetAddress address):创建DatagramSocket对象指定端口号和相关IP地址,此情况适用于计算机上有多块网卡的情况,明确
规定数据通过哪块网卡向外发送和接收哪块网卡的数据。正常情况下,不同网卡会分配不同IP,因此在创建DatagramSocket对象时需要通过指定IP地址来
确定使用哪块网卡进行通信。
其他方法
(1) void receive (DatagramPacket p):用于将接收到的数据填充到DatagramPacket数据包中,在接收到数据返回前会一直处于阻塞状态,只有当接收到数
据包时,该方法才会返回。
(2) void send(DatagramPacket p):用于发送DatagramPacket数据;
(3) void close():关闭当前的Socket,释放资源。
3.实现例子
(1)接收端
public class Example02 { public static void main(String[] args) throws Exception { //创建一个长度为1024的字节数组,用于接收数据 byte[] buf = new byte[1024]; //定义一个DatagramSocket对象,监听端口为8954 DatagramSocket ds = new DatagramSocket(8954); //定义一个DatagramPacket对象,用于接收数据 DatagramPacket dp= new DatagramPacket(buf, 1024); System.out.println("等待接收数据"); ds.receive(dp); //等待接收数据,如果没有则会阻塞 //调用DatagramPacket的方法获得接收到的信息,包括数据内容、长度、发送的IP地址和端口号 String str= new String(dp.getData(), 0, dp.getLength())+"from "+dp.getAddress()+":"+dp.getPort(); System.out.println(str); ds.close(); }}
(2)发送端
public class Example03 { public static void main(String[] args) throws Exception { DatagramSocket ds = new DatagramSocket(3000); String ss="hello world"; //要发送的数据 DatagramPacket dp = new DatagramPacket(ss.getBytes(),ss.length(),InetAddress.getByName("localhost"),8954); System.out.println("发送信息"); ds.send(dp); ds.close(); }}
结果展示:
注意:如果希望在命令行运行成功,请保证java源码中没有头部package(包)信息!