在看到本文之前,如果读者没看过笔者的上一个系列 Java实现Socket网络编程,建议先翻阅。
笔者将在上期Demo的基础上,进一步修改和扩展,达到本次Demo的运行效果。
首先展示Demo的演示效果:
初始状态:1个服务器,2个客户端
Paste_Image.png
检测通信正常:
Paste_Image.png
断开服务器,再次检测通信正常:
Paste_Image.png
服务器重新启动,自动刷新:
Paste_Image.png
添加客户端:
Paste_Image.png
关于 C(客户端)和 S(服务器)之间的TCP通信,以及 C 检测 S 状态,自动重连等机制,笔者在上期Demo的实现过程中已详细阐述,此处就不再赘述。
我们来看看本次案例的实现需求:
1、服务器支持多客户端访问
2、C和S之间使用TCP连接
3、C和C之间使用UDP直接通信
由于案例需求的步骤1、2已实现,我们对步骤3作如下设计思路:
1、客户端创建监听线程,建立UDP监听端口,并发消息告诉服务器,指定自己的服务端口。
2、服务器得知客户端的服务端口后,广播通知其他客户端,现已登录的客户端服务端口列表。
3、客户端之间直接通过UDP,向指定服务端口发送消息。
值得注意的是,C与C之间要求直接通信,所以必须满足“在服务器关闭的情况下,C与C之间仍能通信”的情况,而不是借助服务器完成间接通信
首先,我们创建客户端监听线程,并发消息告诉服务器
public void run() {
try {
DatagramSocket server = new DatagramSocket(0);// 随机分配一个端口号
// 向服务器发送接收客户端的DatagramSocket的端口号
String message = Common.SPECIAL;
String t = "" + server.getLocalPort();
ClientMain.frame.setTitle("client " + t);
String c = "" + t.length();
if (c.length() < 2) {
c = "000" + c;
} else if (c.length() < 3) {
c = "00" + c;