UDP编程通信
基本介绍
- 类DatagramSocket和DatagramPacket【数据包/数据报】实现了基于UDP协议网络程序。
- UDP数据报通过数据报套接字DatagramSocket发送和接收,系统不保证UDP数据报一定能安全送到目的地,也不确信什么时候可以抵达。
- DatagramPacket对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号。
- UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方的连接。
基本流程
- 核心的两个类/对象DatagramSocket域DatagramPacket
- 建立发送端,接收端。
- 建立数据包
- 调用DatagramSocket的发送、接收方法
- 关闭DatagramSocket。
UDP网络编程原理示意图
UDP说明:
- 没有明确的服务端和客户端,演变成数据的发送端和接收端。
- 接收数据和发生数据是通过DatagramSocket对象完成。
- 将数据封装到DatagramPacket对象/装包。
- 当接收到DatagramPacket对象,需要进行拆包,取出数据
- DatagramSocket可以指定在哪个端口接收数据。
package com.study.srv.demo18;
import java.io.IOException;
import java.net.*;
/**
* @author Wen先森
* @version 1.0
* @date 2022/7/18 14:03
* UDP发送端
*/
public class Demo11 {
public static void main(String[] args) throws IOException {
//1.创建DatagramSocket对象,准备发送和接收数据,在9998端口接收
DatagramSocket datagramSocket = new DatagramSocket(9998);
//2.将需要发送的数据,封装到DatagramPacket对象
String s="发送的数据";
byte[] buf=s.getBytes();
InetAddress ip = InetAddress.getByName("192.168.0.18");
//说明:封装的DatagramPacket对象
//buf 内容字节数组
//buf.length 数据长度
//ip 主机(ip)
//9999 端口
DatagramPacket packet = new DatagramPacket(buf, buf.length, ip, 9999);
//发送数据
datagramSocket.send(packet);
//关闭资源
// datagramSocket.close();
System.out.println("发送完毕");
//发送端变为接收端接收数据
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
datagramSocket.receive(datagramPacket);
int length = datagramPacket.getLength();
byte[] data = datagramPacket.getData();
String string = new String(data, 0, length);
System.out.println(string);
datagramSocket.close();
System.out.println("接受结束");
}
}
package com.study.srv.demo18;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/**
* @author Wen先森
* @version 1.0
* @date 2022/7/18 14:03
*UDP接收端
*/
public class Demo10 {
public static void main(String[] args) throws IOException {
//1.创建一个 DatagramSocket对象,准备在9999接收数据
DatagramSocket datagramSocket = new DatagramSocket(9999);
//2.构建一个DatagramPacket 对象,准备接收数据
//在UDP协议,一个数据包最大64k
byte[] buf=new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
//3.接收方法 将通过网络传输的DatagramPacket对象填充到packet里去。
System.out.println("接收端等待接收");
datagramSocket.receive(packet);
//4.可以对packet进行拆包,取出数据,并显示
//实际接收到的数据字节长度
int length = packet.getLength();
//实际接收到的数据
byte[] data = packet.getData();
String string = new String(data, 0, length);
System.out.println(string);
//5.关闭资源
// datagramSocket.close();
System.out.println("接收结束");
//接收端变为发送端,发送数据
String s="接收端变为发送端,发送数据";
byte[] bytes=s.getBytes();
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("192.168.0.18"), 9998);
datagramSocket.send(datagramPacket);
datagramSocket.close();
System.out.println("发送完毕");
}
}