用Java编写一个测试应用程序,作为聊天服务器(ip:192.168.1.1,端口:8888),等待来自多个客户端的连接请求,通信应该通过多线程使用TCP协议来处理连接。
时间: 2024-03-23 12:43:04 浏览: 25
好的,以下是一个简单的Java聊天服务器程序示例:
```java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
public class ChatServer {
private ServerSocket serverSocket;
private List<Socket> clients;
public ChatServer(int port) {
try {
serverSocket = new ServerSocket(port);
clients = new ArrayList<>();
System.out.println("Chat server started on port " + port);
} catch (IOException e) {
System.err.println("Unable to start server on port " + port);
e.printStackTrace();
System.exit(1);
}
}
public void start() {
while (true) {
try {
Socket client = serverSocket.accept();
clients.add(client);
System.out.println("Client connected from " + client.getInetAddress());
new Thread(new ClientHandler(client)).start();
} catch (IOException e) {
System.err.println("Error accepting client connection");
e.printStackTrace();
}
}
}
private class ClientHandler implements Runnable {
private Socket client;
private BufferedReader in;
private PrintWriter out;
public ClientHandler(Socket client) {
this.client = client;
try {
in = new BufferedReader(new InputStreamReader(client.getInputStream()));
out = new PrintWriter(client.getOutputStream(), true);
} catch (IOException e) {
System.err.println("Error creating input/output streams for client " + client.getInetAddress());
e.printStackTrace();
}
}
@Override
public void run() {
try {
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println("Received message from " + client.getInetAddress() + ": " + inputLine);
broadcast(inputLine);
}
} catch (IOException e) {
System.err.println("Error reading input from client " + client.getInetAddress());
e.printStackTrace();
} finally {
try {
client.close();
clients.remove(client);
System.out.println("Client disconnected from " + client.getInetAddress());
} catch (IOException e) {
System.err.println("Error closing client connection");
e.printStackTrace();
}
}
}
private void broadcast(String message) {
for (Socket client : clients) {
if (client != this.client) {
try {
PrintWriter clientOut = new PrintWriter(client.getOutputStream(), true);
clientOut.println(message);
} catch (IOException e) {
System.err.println("Error sending message to client " + client.getInetAddress());
e.printStackTrace();
}
}
}
}
}
public static void main(String[] args) {
ChatServer server = new ChatServer(8888);
server.start();
}
}
```
此示例使用ServerSocket在指定端口上启动聊天服务器。当客户端连接时,服务器将创建一个新的线程来处理每个客户端的连接。每个客户端的请求都会在自己的线程中处理,以避免阻塞其他客户端的连接。服务器通过广播将从一个客户端收到的消息发送到所有其他客户端。
你可以运行此示例并在多个命令行窗口中使用telnet等程序连接到服务器,然后开始聊天。