下面是关于 "java网络之基于UDP的聊天程序示例解析" 的完整攻略:
一、背景介绍
在Java编程过程中,网络编程是非常重要的一部分。UDP协议是Java中常用的一种协议,其具有数据传输快、连接简单等特点,非常适合一些及时性要求不高的网络应用,比如聊天室程序等。本篇攻略就是针对基于UDP协议的聊天程序的编写,进行详细的解析。
二、程序设计思路
本程序的设计思路可以归纳为如下几个步骤:
- 客户端与服务器端都使用UDP协议进行数据的传输与接收。
- 客户端之间的通信需要通过服务器进行转发。
- 客户端与服务器之间,以及客户端之间,都需要确立好唯一的通讯对象,以进行数据的传输。
- 对于向服务器端发送的数据,需要使用线程池进行优化。
三、程序示例解析
示例1:服务器端代码
public class ChatServer {
// 维护所有在线的客户端
private static Map<String, SocketAddress> onlineClients = new ConcurrentHashMap<String, SocketAddress>();
public static void main(String[] args) throws Exception {
// 创建DatagramSocket,监听1024端口
DatagramSocket server = new DatagramSocket(1024);
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
System.out.println("服务器已启动!");
while (true) {
// 接收客户端发来的消息
server.receive(packet);
// 解析收到的消息
String message = new String(packet.getData(), 0, packet.getLength(), "UTF-8");
String[] arr = message.split(":");
if (arr.length == 2) {
// 收到客户端的上线请求
String name = arr[1];
onlineClients.put(name, packet.getSocketAddress());
// 向该客户端反馈上线成功的消息
String msg = "sys: welcome " + name + " online!";
byte[] responseBuf = msg.getBytes("UTF-8");
DatagramPacket responsePacket = new DatagramPacket(responseBuf, responseBuf.length, packet.getAddress(), packet.getPort());
server.send(responsePacket);
} else if (arr.length == 3) {
// 收到客户端的消息,请求转发到指定客户端
String from = arr[0];
String to = arr[1];
String content = arr[2];
SocketAddress toAddress = onlineClients.get(to);
String msg = from + ":" + content;
byte[] responseBuf = msg.getBytes("UTF-8");
DatagramPacket responsePacket = new DatagramPacket(responseBuf, responseBuf.length, toAddress);
server.send(responsePacket);
}
}
}
}
以上是服务器端的主要代码逻辑,主要实现了接收客户端消息,处理客户端上下线请求,转发消息等功能。
示例2:客户端代码
public class ChatClient {
private static String name;
private static SocketAddress serverAddress;
private static DatagramSocket client;
private static ExecutorService threadPool = Executors.newSingleThreadExecutor();
public static void main(String[] args) throws Exception {
// 设定服务器地址
serverAddress = new InetSocketAddress("127.0.0.1", 1024);
// 创建DatagramSocket
client = new DatagramSocket();
System.out.println("请输入你的名字:");
Scanner scanner = new Scanner(System.in);
name = scanner.nextLine();
// 向服务器发送上线请求
String message = "login:" + name;
byte[] buf = message.getBytes("UTF-8");
DatagramPacket packet = new DatagramPacket(buf, buf.length, serverAddress);
client.send(packet);
threadPool.execute(new ReceiveMessageTask());
// 发送消息给其他在线客户端
while (true) {
String line = scanner.nextLine();
if (StringUtils.isEmpty(line)) continue;
String[] arr = line.split(":");
if (arr.length == 2) {
String to = arr[0];
String content = arr[1];
String message2 = name + ":" + to + ":" + content;
byte[] buf2 = message2.getBytes("UTF-8");
SocketAddress toAddress = onlineClients.get(to);
if (toAddress != null) {
DatagramPacket packet2 = new DatagramPacket(buf2, buf2.length, toAddress);
client.send(packet2);
} else {
System.out.println("用户 " + to + " 不在线");
}
} else {
System.out.println("格式不正确,正确格式为:[对方用户名]:[消息内容]");
}
}
}
static class ReceiveMessageTask implements Runnable {
@Override
public void run() {
while (true) {
try {
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
client.receive(packet);
String message = new String(packet.getData(), 0, packet.getLength(), "UTF-8");
System.out.println(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
以上是客户端的主要代码逻辑,主要实现了登录请求的发送,消息的发送,消息的接收等功能。
四、总结
以上就是基于UDP协议的聊天程序示例解析的相关内容,通过本攻略的学习,读者可以了解基于UDP协议进行数据传输的流程和步骤,以及Java中的相关网络编程知识。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java网络之基于UDP的聊天程序示例解析 - Python技术站