// Java聊天室代码示例
import java.io.*;
import java.net.*;
import java.util.*;
public class ChatServer {
private static final int PORT = 12345;
private static HashSet<String> names = new HashSet<>();
private static HashSet<PrintWriter> writers = new HashSet<>();
public static void main(String[] args) {
System.out.println("Chat Server is running...");
try (ServerSocket listener = new ServerSocket(PORT)) {
while (true) {
new Handler(listener.accept()).start();
}
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
private static class Handler extends Thread {
private String name;
private Socket socket;
private BufferedReader in;
private PrintWriter out;
public Handler(Socket socket) {
this.socket = socket;
}
public void run() {
try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);
// Ask for the user's name.
out.println("SUBMITNAME");
name = in.readLine();
if (name == null) {
return;
}
synchronized (names) {
if (!names.contains(name)) {
names.add(name);
writers.add(out);
} else {
out.println("NAMEINUSE");
return;
}
}
out.println("NAMEACCEPTED");
// Start conversation.
while (true) {
String input = in.readLine();
if (input.toLowerCase().equals("/quit")) {
return;
}
for (PrintWriter writer : writers) {
writer.println("MESSAGE " + name + ": " + input);
}
}
} catch (IOException e) {
System.out.println(e.getMessage());
} finally {
if (name != null) {
names.remove(name);
}
if (out != null) {
writers.remove(out);
}
try {
socket.close();
} catch (IOException e) {
}
}
}
}
}
Handler
线程来处理通信。该线程负责读取客户端的消息,并将消息广播给所有其他连接的客户端。HashSet
来存储当前在线用户的名称,确保每个用户名是唯一的。如果用户尝试使用已存在的名称,服务器会通知客户端重新输入。希望这段代码和解释对你有帮助!
上一篇:java 抽象
下一篇:java list 对象排序
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站