案例需求:发送端发出“886”后,需收到并显示接收端回复的一个“886”,然后两边都结束通信;
分析:
本案例在于提高对于UDP发送和就收数据的方法使用的熟练度和逻辑分析能力;
①发送端:在发送端代码中加入判断,如果发送的是886,就在对方回复886后结束程序;
②接收端:判断接收到的数据,如果是886,就回复一个886并结束程序
③端口号已绑定:在发送端接收反馈时,接收用的端口不能和发送端口相同;同理,接收端反馈用的端口和接收端口不能相同;
①发送端代码:
package Anli.UDP;
import java.io.*;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
/*
UDP发送端
*/
public class case02send {
public static void main(String[] args) throws IOException {
//创建套接字对象Socket
DatagramSocket ds;
DatagramPacket dp;
while (true) {
//自己封装键盘录入数据
BufferedReader bis = new BufferedReader(new InputStreamReader(System.in));
System.out.print("在此输入:");
String s = bis.readLine();
//将键盘录入的数据封装到一个字节数组中
byte[] bys = s.getBytes();
//创建Packet对象
dp = new DatagramPacket(bys, bys.length, InetAddress.getByName("192.168.1.11"),10086);
//发送数据
new DatagramSocket().send(dp);
System.out.println("发送成功");
//判断:输入的是886,就接收对方的反馈,结束程序
if ("886".equals(s)) {
ds = new DatagramSocket(10096);
bys = new byte[1024];
dp = new DatagramPacket(bys, bys.length);
ds.receive(dp);
String ss = new String(dp.getData(), 0, dp.getLength());
System.out.println(ss);
System.exit(0);
}
}
}
}
②接收端代码:
package Anli.UDP;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/*
UDP接收端
*/
public class case02receive {
public static void main(String[] args) throws IOException {
//创建Socket对象
DatagramSocket ds = new DatagramSocket(10086);
//创建数据包用于保存接收到的数据
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length);
while (true) {
ds.receive(dp);
String s = new String(dp.getData(), 0, dp.getLength());
//判断:对方如果发送886,就回一个886并结束程序
if ("886".equals(s)) {
byte[] by = "886".getBytes();
dp = new DatagramPacket(by, by.length, InetAddress.getByName("192.168.1.11"), 10096);
ds.send(dp);
System.exit(0);
}
System.out.println(InetAddress.getByName("192.168.1.11").getHostName() + ":" + s);
}
}
}
结果显示:
发送端:接收端:
欢迎大佬们前来指教,不胜感激!