概念:用户数据报传输协议
特点:传输数据量小(64K),不一定传输成功,没有明确的客户端与服务端的概念,数据不会通过输入输出流传输,而是会通过打包成数据报,,再传输入通道
UDP 传输用到两个重要的类:DatagramSocket、DatagramPacket
构造方法
1.DatagramSocket (端口号) //DatagramSocket 构造方法
2.1 DatagramPacket(字节数组,数组长度) //构造一个空的数据报
2.2 DatagramPacket( 字节数组,长度,IP,端口号 )//将要传输的数据包装成一个数据报DatagramSocke
DatagramSocket的重要方法
1.send(Datagrampacket) //将数据报发送到通道
2.receive( DatagramPacket) //从通道中获取数据报,数据会注入传入的空数据报中,如果没有,程序就会停滞
DatagramPacket的重要方法
1.getlength() //获取数据报中字节数组的真实长度
2.getData() //从数据包中获取数据,是一个字节数组
下面是接收端代码(这个接收端,发送端是主观上认为的):
package udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
//UDP接收端
public class UDPreceiveA {
public static void main(String[] args) throws IOException {
//1.创建一个DatagramSocket对象,准备在9999端口接收数据
DatagramSocket Socket = new DatagramSocket(9999);
//2.构建一个DategramPacket准备接收数据
byte[] buf = new byte[64 * 1024];
DatagramPacket Packet = new DatagramPacket(buf, buf.length);
//3.调用接受方法,将网络传输的DatagramPacket对象填充到packet对象//如果没有就会阻塞
System.out.println("接收端在等待接收数据");
Socket.receive(Packet);
//4.可以将Packet进行拆包
int length = Packet.getLength();//实际接受到数据字节长度
byte[] data = Packet.getData();//接受数据
String s = new String(data, 0, length);
System.out.println(s);
byte[] bytes = "嘉然,今天吃火锅".getBytes();
DatagramPacket datagramPacket = new DatagramPacket(bytes,bytes.length, InetAddress.getLocalHost(),9998);
Socket.send(datagramPacket);
Socket.close();
System.out.println("B端关闭");
}
}
下面是发送端代码:
package udp;
import java.io.IOException;
import java.net.*;
public class UDPSenderB {
public static void main(String[] args) throws IOException {
//创建DatagramSocket ,进行发送数据
DatagramSocket datagramSocket = new DatagramSocket(9998);
//2:将要返送的数据封装到一个Datagrampacket中
byte[] bytes = "hello,嘉然今天吃什么".getBytes();
//封装的DatagranPacket:字节数组,长度,主机(IP),端口
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, InetAddress.getLocalHost(), 9999);
datagramSocket.send(datagramPacket);
byte[] buf = new byte[64 * 1024];
DatagramPacket datagramPacket1 = new DatagramPacket(buf,buf.length);
datagramSocket.receive(datagramPacket1);
int length=datagramPacket1.getLength();
byte[] data = datagramPacket1.getData();
String s = new String(data, 0, length);
System.out.println(s);
datagramSocket.close();
System.out.println("A端关闭");
}



