聊天室 java代码_java聊天室的实现代码
时间: 2023-07-02 07:15:36 浏览: 141
这里是一个简单的 Java 聊天室的实现代码,希望能帮到您:
```java
import java.io.*;
import java.net.*;
import java.util.*;
public class ChatServer {
ArrayList<ClientHandler> clients = new ArrayList<ClientHandler>(); // 客户端列表
public static void main(String[] args) {
new ChatServer().startServer();
}
public void startServer() {
try (ServerSocket serverSocket = new ServerSocket(8080)) {
System.out.println("聊天室服务器已启动...");
while (true) {
Socket clientSocket = serverSocket.accept();
System.out.println("客户端已连接:" + clientSocket.getInetAddress().getHostAddress());
// 创建客户端处理程序并添加到客户端列表中
ClientHandler clientHandler = new ClientHandler(clientSocket);
clients.add(clientHandler);
// 启动客户端处理程序线程
clientHandler.start();
}
} catch (IOException e) {
System.err.println("聊天室服务器启动失败: " + e.getMessage());
}
}
// 广播消息给所有连接的客户端
public synchronized void broadcast(String message) {
for (ClientHandler client : clients) {
client.sendMessage(message);
}
}
// 移除已断开连接的客户端
public synchronized void removeClient(ClientHandler clientHandler) {
clients.remove(clientHandler);
System.out.println("客户端已断开连接:" + clientHandler.getSocket().getInetAddress().getHostAddress());
}
// 客户端处理程序
class ClientHandler extends Thread {
private Socket socket;
private BufferedReader in;
private PrintWriter out;
public ClientHandler(Socket socket) {
this.socket = socket;
}
public Socket getSocket() {
return socket;
}
// 发送消息给客户端
public void sendMessage(String message) {
out.println(message);
}
// 读取消息并广播给所有客户端
public void run() {
try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);
while (true) {
String input = in.readLine();
if (input == null) {
removeClient(this);
break;
}
broadcast(input);
}
} catch (IOException e) {
removeClient(this);
}
}
}
}
```
这个聊天室服务器使用线程处理每个客户端连接,并使用 ArrayList 存储所有客户端连接。服务器使用 ServerSocket 监听 8080 端口,并在客户端连接时创建一个新的客户端处理程序(ClientHandler)。
每个客户端处理程序都有一个套接字(Socket),它们使用 BufferedReader 和 PrintWriter 从套接字读取和写入数据。在客户端处理程序的 run() 方法中,读取来自客户端的输入,并将其广播给所有其他连接的客户端。
在服务器中,广播消息和移除客户端的方法都是同步的,以确保多个线程不会同时访问客户端列表。
阅读全文