服务器端
import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.nio.charset.StandardCharsets;/* * @author: pwt * @date: Created in 2021/4/16 9:56 * @description:接收端 * 从本机的9999端口号接本机客户端8080端口号发送的数据 * 不会发生端口号被占用的情况 * 1.服务器要一直打开才能接收到数据,不然只要服务器关闭,客户端运行,然后再打开服务器也不会接收 */public class ServiesUDP { public static void main(String[] args) throws IOException { /* 创建接收端,接收客户端发送的数据包 */ DatagramSocket receiveSocket = null; //定义从8888端口接受数据包的数据包套接字 receiveSocket = new DatagramSocket(9999); // 创建字节数组,指定接收的数据包的大小 byte b1[]=new byte[1000]; //定义一个接受数据报的接受数据报,并放到字节数组里 DatagramPacket receivePacket = new DatagramPacket(b1,b1.length); /* 创建接收数据包线程 */ new Thread(new recthread(receiveSocket,receivePacket)).start(); /* 创建发送数据包,响应客户端的数据包 在线程建立数据包,这里只用传递已接收的数据包 */ new Thread(new sendth(receiveSocket,receivePacket)).start();}}class sendth extends Thread{ DatagramSocket ds=null; DatagramPacket dp=null; public sendth(DatagramSocket ds,DatagramPacket dp){ this.ds=ds; this.dp=dp; } public void run( ){ while (true) { byte b2[]=new byte[1000]; String ss="已收到!"; b2=ss.getBytes(StandardCharsets.UTF_8); DatagramPacket sendPacket=new DatagramPacket(b2,b2.length, dp.getAddress(),dp.getPort()); try { ds.send(sendPacket); } catch (IOException e) { e.printStackTrace(); } }}}class recth extends Thread{ DatagramSocket ds=null; DatagramPacket dp=null; public recth(DatagramSocket ds,DatagramPacket dp){ this.ds=ds; this.dp=dp; } public void run(){ //从此套接字接收数据报包。并存到数据报包那里 try { while (true){ ds.receive(dp); //输出数据报包 String name = dp.getAddress().toString(); System.out.println("\n来自主机:" + name + "\n端口:" + dp.getPort()); String s = new String(dp.getData(), 0, dp.getLength()); System.out.println("接受到的数据是: " + s); } } catch (IOException e) { e.printStackTrace(); } }}
客户端
import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;/* * @author: pwt * @date: Created in 2021/4/16 9:55 * @description:发送端 * 服务器打开后才能接收数据 */public class ClientUDP { public static void main(String[] args) throws IOException{ /* 创建发送端,向服务器发送数据 */ DatagramSocket sendSocket = new DatagramSocket(8080); //构造数据报套接字并将其绑定到本地主机上的指定端口。 String ss = "hi~"; byte[] d1 = new byte[1024]; //将字符串数组转化为字节数组 d1 = ss.getBytes(); //构造用于发送长度的分组的数据报包 length指定主机上到指定的端口号。 DatagramPacket sendPacket = new DatagramPacket(d1, d1.length, InetAddress.getLocalHost(), 9999); //将数据报发送出去 sendSocket.send(sendPacket); System.out.println("发送完毕"); /* 创建接收,响应服务器端的数据 */ byte[] d2 = new byte[1024]; DatagramPacket receivePacket=new DatagramPacket(d2,d2.length); sendSocket.receive(receivePacket); //String se=receivePacket.toString(); //String se=receivePacket.getAddress().toString(); //因为receivePacket是字节类型的,必须要转化一下 //通过使用平台的默认字符集解码指定的字节子阵列来构造新的 String 。 String se = new String(receivePacket.getData(), 0, receivePacket.getLength()); System.out.println(se); }}