UDP:用户数据报协议(User Datagram Protocol)。UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。
由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输例如视频会议都使用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。
但是在使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议。UDP的交换过程如下图所示。
特点:数据被限制在64kb以内,超出这个范围就不能发送了。
UDP接收发送消息程序
发送端通过键盘输入消息,接收端实时接收消息
此程序需要用到的类:
DatagramPacket 用于创建数据包对象,封装要发送的数据、接收端ip、端口
DatagramPacket构造方法:
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
DatagramSocket 用于数据包的发送和接收对象
DatagramSocket构造方法:
DatagramSocket()空参数
方法: send(DatagramPacket d)
接收端实现:
- 创建DatagramSocket对象,绑定端口号,要和发送端端口号一致
- 创建字节数组,接收发来的数据
- 创建数据包对象DatagramPacket
- 调用DatagramSocket对象方法
receive(DatagramPacket dp)接收数据,数据放在数据包中 - 拆包
- 发送的IP地址
数据包对象DatagramPacket方法getAddress()获取的是发送端的IP地址对象
返回值是InetAddress对象
- 接收到的字节个数
数据包对象DatagramPacket方法 getLength()
- 发送方的端口号
数据包对象DatagramPacket方法 getPort()发送端口
关闭资源 ```java //实现UDP接收端 public class UDPReceive { public static void main(String[] args) throws IOException {
//创建数据包传输对象 绑定端口号
DatagramSocket datagramSocket = new DatagramSocket(7000);
//创建字节数组
byte[] b = new byte[1024 * 64];
//通过无限循环来实现实时通信的接收
while (true) {
//创建数据包对象,传递字节数组
DatagramPacket datagramPacket = new DatagramPacket(b, b.length);
//调用datagramPacket对象的方法receive接收
datagramSocket.receive(datagramPacket);
//获取接收到的字节个数
int length = datagramPacket.getLength();
//获取发送端的ip地址
String address = datagramPacket.getAddress().getHostAddress();
//获取发送端的端口号
int port = datagramPacket.getPort();
//打印接收的数据
System.out.println("ip:\t" + address + "\n端口:\t" + port + "\n消息:\t" +
new String(b, 0, length) + "\n");
}
// datagramSocket.close(); }
}
<a name="cbpdh"></a>
#### 发送端实现:
```java
//实现UDP发送端
public class UDPSend {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
//创建InetAddress对象,封装要发送信息的ip
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
//创建DatagramSocket对象,数据包的发送和接收对象
DatagramSocket datagramSocket = new DatagramSocket();
//通过无限循环来实现实时通信的发送
while (true) {
String s = sc.nextLine();
//创建数据包对象,封装要发送的数据、接收端ip、端口
byte[] b = s.getBytes();
DatagramPacket datagramPacket = new DatagramPacket(b, b.length, inetAddress, 7000);
//调用datagramSocket的方法send
datagramSocket.send(datagramPacket);
}
//关闭资源
// datagramSocket.close();
}
}