聊天室(Java实现)
时间: 2023-08-14 08:06:28 浏览: 36
聊天室是一个基于网络的多人聊天室,用户可以通过它与其他用户进行实时聊天。下面是一个使用 Java 实现的简单聊天室。
1. 服务器端
服务器端需要监听客户端的请求,并将消息转发给所有连接的客户端。以下是服务器端的代码:
```java
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
public class ChatServer {
private List<ClientThread> clients = new ArrayList<>();
private ServerSocket serverSocket;
public ChatServer(int port) {
try {
serverSocket = new ServerSocket(port);
System.out.println("Server started on port " + port);
while (true) {
Socket clientSocket = serverSocket.accept();
ClientThread client = new ClientThread(this, clientSocket);
clients.add(client);
client.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void broadcast(String message) {
for (ClientThread client : clients) {
client.sendMessage(message);
}
}
public void removeClient(ClientThread client) {
clients.remove(client);
}
public static void main(String[] args) {
ChatServer server = new ChatServer(12345);
}
}
class ClientThread extends Thread {
private ChatServer server;
private Socket clientSocket;
public ClientThread(ChatServer server, Socket clientSocket) {
this.server = server;
this.clientSocket = clientSocket;
}
public void run() {
try {
System.out.println("Client connected: " + clientSocket.getInetAddress().getHostAddress());
while (true) {
String message = Utils.receiveMessage(clientSocket);
if (message == null) {
break;
}
server.broadcast(message);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
server.removeClient(this);
Utils.close(clientSocket);
System.out.println("Client disconnected: " + clientSocket.getInetAddress().getHostAddress());
}
}
public void sendMessage(String message) {
Utils.sendMessage(clientSocket, message);
}
}
class Utils {
public static String receiveMessage(Socket socket) throws IOException {
byte[] buffer = new byte[1024];
int length = socket.getInputStream().read(buffer);
if (length == -1) {
return null;
}
return new String(buffer, 0, length);
}
public static void sendMessage(Socket socket, String message) {
try {
socket.getOutputStream().write(message.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
public static void close(Socket socket) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
2. 客户端
客户端需要连接到服务器端,并可以发送和接收消息。以下是客户端的代码:
```java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
public class ChatClient {
private Socket socket;
private BufferedReader input;
private BufferedReader serverInput;
public ChatClient(String host, int port) {
try {
socket = new Socket(host, port);
System.out.println("Connected to server " + host + " on port " + port);
input = new BufferedReader(new InputStreamReader(System.in));
serverInput = new BufferedReader(new InputStreamReader(socket.getInputStream()));
new Thread(() -> {
while (true) {
try {
String message = serverInput.readLine();
if (message == null) {
break;
}
System.out.println(message);
} catch (IOException e) {
e.printStackTrace();
}
}
Utils.close(socket);
}).start();
while (true) {
String message = input.readLine();
if (message == null || message.equals("/quit")) {
break;
}
Utils.sendMessage(socket, message);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
ChatClient client = new ChatClient("localhost", 12345);
}
}
class Utils {
public static void sendMessage(Socket socket, String message) {
try {
socket.getOutputStream().write(message.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
public static void close(Socket socket) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
以上是一个简单的聊天室的 Java 实现。你可以根据需要进行修改和扩展。