服务器端
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);
}
}