Java TCP实现多用户群聊天,每个客户端连接时输入自己用户名,服务端广播消息时在信息前标注哪一用户发出,请给出相应的服务器和客户端代码
时间: 2024-05-03 17:19:19 浏览: 7
服务器端代码:
```java
import java.io.*;
import java.net.*;
import java.util.*;
public class ChatServer {
private static ArrayList<PrintWriter> clients = new ArrayList<>();
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("Chat server started.");
while (true) {
Socket socket = serverSocket.accept();
System.out.println("Client connected from " + socket.getInetAddress().getHostAddress());
new ClientHandler(socket).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static class ClientHandler extends Thread {
private Socket socket;
private BufferedReader in;
private PrintWriter out;
private String username;
public ClientHandler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);
// Ask for username
out.println("Enter your username:");
username = in.readLine();
System.out.println(username + " joined the chat.");
// Add client to list of clients
synchronized (clients) {
clients.add(out);
}
// Broadcast message to all clients
broadcastMessage(username + " joined the chat.");
// Read messages from client and broadcast to all clients
String message;
while ((message = in.readLine()) != null) {
System.out.println(username + ": " + message);
broadcastMessage(username + ": " + message);
}
} catch (IOException e) {
System.out.println(username + " left the chat.");
} finally {
// Remove client from list of clients
synchronized (clients) {
clients.remove(out);
}
// Broadcast message to all clients
broadcastMessage(username + " left the chat.");
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void broadcastMessage(String message) {
synchronized (clients) {
for (PrintWriter client : clients) {
client.println(message);
}
}
}
}
}
```
客户端代码:
```java
import java.io.*;
import java.net.*;
import java.util.Scanner;
public class ChatClient {
public static void main(String[] args) {
try {
Socket socket = new Socket("localhost", 8888);
System.out.println("Connected to chat server.");
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
Scanner scanner = new Scanner(System.in);
// Enter username
System.out.print("Enter your username: ");
String username = scanner.nextLine();
out.println(username);
// Read messages from server
new Thread(() -> {
try {
String message;
while ((message = in.readLine()) != null) {
System.out.println(message);
}
} catch (IOException e) {
e.printStackTrace();
}
}).start();
// Send messages to server
String message;
while (true) {
message = scanner.nextLine();
out.println(message);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
运行以上代码后,可以启动多个客户端与服务器进行连接,每个客户端连接时输入自己的用户名,服务端会在广播消息时在信息前标注哪一用户发出。