用java请完成多线程的TCP网络程序,建立一个Server端及三个Client端
时间: 2024-04-30 21:18:12 浏览: 15
好的,以下是一个简单的多线程TCP网络程序的示例。在这个示例中,我们将创建一个Server端和三个Client端,每个Client端都可以向Server端发送消息,Server端会把接收到的消息广播给所有连接到它的Client端。
Server端代码:
```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 Server {
private List<ClientHandler> clients = new ArrayList<>();
public void start(int port) {
try {
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("Server started on port " + port);
while (true) {
Socket socket = serverSocket.accept();
System.out.println("New client connected: " + socket);
ClientHandler clientHandler = new ClientHandler(socket);
clients.add(clientHandler);
clientHandler.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private void broadcast(String message) {
for (ClientHandler client : clients) {
client.sendMessage(message);
}
}
private class ClientHandler extends Thread {
private Socket socket;
private BufferedReader input;
private PrintWriter output;
public ClientHandler(Socket socket) {
this.socket = socket;
}
public void run() {
try {
input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
output = new PrintWriter(socket.getOutputStream(), true);
String name = input.readLine();
System.out.println(name + " has joined the chat");
String message;
while ((message = input.readLine()) != null) {
System.out.println(name + ": " + message);
broadcast(name + ": " + message);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
input.close();
output.close();
socket.close();
clients.remove(this);
System.out.println("Client disconnected: " + socket);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void sendMessage(String message) {
output.println(message);
}
}
public static void main(String[] args) {
Server server = new Server();
server.start(1234);
}
}
```
Client端代码:
```java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class Client {
public void start(String host, int port, String name) {
try {
Socket socket = new Socket(host, port);
System.out.println("Connected to server: " + socket);
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
BufferedReader serverInput = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter output = new PrintWriter(socket.getOutputStream(), true);
output.println(name);
String message;
while ((message = input.readLine()) != null) {
output.println(message);
System.out.println(serverInput.readLine());
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Client client1 = new Client();
client1.start("localhost", 1234, "Client 1");
Client client2 = new Client();
client2.start("localhost", 1234, "Client 2");
Client client3 = new Client();
client3.start("localhost", 1234, "Client 3");
}
}
```
在这个示例中,我们创建了一个Server类和一个Client类,Server类维护了一个ClientHandler列表,每当有一个新的客户端连接到Server时,Server就会创建一个新的ClientHandler线程去处理这个客户端的请求。ClientHandler线程负责接收客户端的消息并广播给所有连接到Server的客户端。每个Client端在连接到Server时都需要提供一个名字,用于在广播消息时标识发送者。当客户端断开连接时,Server会从列表中移除对应的ClientHandler线程。
要运行这个程序,我们可以在命令行中输入以下命令:
```
javac Server.java
javac Client.java
java Server
java Client
```
其中,Server类需要在一个窗口中运行,而Client类需要在另外三个窗口中分别运行。运行后,我们可以在Client的窗口中输入消息并观察Server和其他Client的窗口中是否收到了相应的广播消息。