接收端不需要明确知道数据的来源,只需要接收到数据即可
发送数据时必须指定接收端的IP地址和端口号,就好像发送货物的集装箱上面必须标明接收人的地址一样
* 发送端
* 1,创建DatagramPacket对象,封装数据,接收的地址和端口
* 2,创建DatagramSocket对象
* 3,调用DatagramSocket中的send方法,发送数据包
* 4,关闭资源DatagramSocket
package com.oracle.demo01; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.security.spec.DSAGenParameterSpec; import java.util.Scanner; public class UDPSend { public static void main(String[] args) throws IOException { Scanner sc=new Scanner(System.in); //封装ip地址 InetAddress inet=InetAddress.getByName("127.0.0.1"); //创建快递公司对象 DatagramSocket ds=new DatagramSocket(); while (true) { //创建打包对象,封装要发送的数据、接收端的ip地址极端口号 //封装数据 byte[]bytes=sc.next().getBytes(); DatagramPacket dp=new DatagramPacket(bytes,bytes.length,inet,8888); //发送数据 ds.send(dp); //释放资源 //ds.close(); } } }
UDP接收端
*
* 1,创建DatagramSocket对象,绑定端口号(要和发送端端口号一致)
* 2,创建字节数组,接收发来的数据
* 3,创建数据包对象DatagramPacket
* 4,调用DatagramSocket对象方法receive(DatagramPacket dp)接收数据,数据放在数据包中
* 5,拆包
发送的IP地址
数据包对象DatagramPacket方法getAddress()获取的是发送端的IP地址对象
返回值是InetAddress对象
接收到的字节个数
数据包对象DatagramPacket方法getLength()
发送方的端口号
数据包对象DatagramPacket方法getPort()发送端口
* 6,关闭资源
package com.oracle.demo01; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; public class UDPRecieve { // UDP接收端 public static void main(String[] args) throws IOException { // 创建快递公司,名确端口号 DatagramSocket ds = new DatagramSocket(8888); // 创建字节数组来接收数据 byte bytes[] = new byte[1024]; while (true) { // 创建打包对象,接收包 DatagramPacket dp = new DatagramPacket(bytes, bytes.length); // 接收数据包 ds.receive(dp); // 拆包 // 获取字节长度 int length = dp.getLength(); // 获取发送端ip地址 String ip = dp.getAddress().getHostAddress(); // 获取端口号 int port = dp.getPort(); System.out.println("ip地址为:" + ip + " 端口号为" + port + " 得人发送的内容为" + new String(bytes, 0, length)); // 释放资源 // ds.close(); } } }