实现客户端向服务器的一问一答,udp和tcp相比,就显得不可靠,demo中体现在先启客户端访问,再启服务器不会报错,客户端就不知道服务器到底收没收到请求。
服务端代码
package udp_demo;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Date;
public class UDPServer {
public static void main(String[] args) throws Exception {
// 为UDP服务器指定端口
DatagramSocket ds = new DatagramSocket(10086);
// 声明一个接收数据包的byte数组
byte[] b = new byte[1024];
// 设置数据包,参数为:byte数组,读取数据的起始位,读取数据的终止位
DatagramPacket dp = new DatagramPacket(b, 0, b.length);
// 服务器接收数据包
ds.receive(dp);
// 解析数据包,参数为:dp中收到的byte数组,读取数据的起始位,读取数据的终止位,以utf-8编码转化成byte
String msg = new String(dp.getData(), 0, dp.getData().length, "utf-8");
System.out.println(new Date() + "服务器收到消息,内容:" + msg.trim());
if ("你好".equals(msg.trim())) {
msg = "哦";
} else {
msg = "滚啊";
}
// 设置数据包,参数为字符串以utf-8转换后的byte数组,读取数据的起始位,读取数据的终止位,客户端的ip地址,客户端端口
dp = new DatagramPacket(msg.getBytes("utf-8"), 0, msg.getBytes().length, InetAddress.getByName("127.0.0.1"),
10000);
// 发送数据包
ds.send(dp);
System.out.println(new Date() + "服务器回复完毕,内容:" + msg);
ds.close();
ds = null;
}
}
客户端代码:
package udp_demo;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Date;
public class UDPClient {
public static void main(String[] args) throws Exception {
// 设置客户端端口
DatagramSocket ds = new DatagramSocket(10000);
// msg
String msg = "你好啊";
// 设置数据包,参数为字符串以utf-8转换后的byte数组,读取数据的起始位,读取数据的终止位,服务器的ip地址,服务器端口
DatagramPacket dp = new DatagramPacket(msg.getBytes("utf-8"), 0, msg.getBytes().length,
InetAddress.getByName("127.0.0.1"), 10086);
// 发送数据
ds.send(dp);
System.out.println(new Date() + "客户端发送成功,内容:" + msg);
// 声明一个接收数据包的byte数组
byte[] b = new byte[1024];
// 设置数据包,参数为:byte数组,读取数据的起始位,读取数据的终止位
dp = new DatagramPacket(b, 0, b.length);
// 接收数据包
ds.receive(dp);
// 解析数据包,参数为:dp中收到的byte数组,读取数据的起始位,读取数据的终止位,以utf-8编码转化成byte
msg = new String(dp.getData(), 0, dp.getData().length, "utf-8");
System.out.println(new Date() + "客户端收到回复,内容:" + msg);
ds.close();
ds = null;
}
}
先启动服务器再启动客户端,可以看到客户端发送的消息和得到的回服,如:
Wed Aug 29 22:52:55 GMT+08:00 2018客户端发送成功,内容:你好啊
Wed Aug 29 22:52:55 GMT+08:00 2018客户端收到回复,内容:滚啊
但是如果先启动客户端再启动服务器,可以发现客户端发送了消息,看不到回复的消息,却没有报错