该代码中将消息发送给所有连接的客户端和将消息发送给服务器要怎么实现
时间: 2024-04-14 11:30:47 浏览: 9
要实现将消息发送给所有连接的客户端,可以在服务器类中维护一个保存所有客户端输出流的列表。当服务器接收到一条消息时,遍历这个列表,将消息发送给每个客户端。
在服务器类中,定义一个`List<PrintWriter>`类型的变量,用于保存所有客户端的输出流。在处理客户端连接的线程中,将每个新连接的客户端的输出流添加到这个列表中。
```java
// 服务器类
public class Server {
private ServerSocket serverSocket;
private List<PrintWriter> clientWriters;
public Server() {
clientWriters = new ArrayList<>();
}
public void start() {
try {
serverSocket = new ServerSocket(8888);
while (true) {
Socket socket = serverSocket.accept();
// 处理客户端连接的线程
Thread thread = new Thread(new ClientHandler(socket));
thread.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
// 处理客户端连接的线程
private class ClientHandler implements Runnable {
private Socket socket;
private BufferedReader reader;
private PrintWriter writer;
public ClientHandler(Socket socket) {
this.socket = socket;
try {
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer = new PrintWriter(socket.getOutputStream());
// 将客户端的输出流保存到列表中
clientWriters.add(writer);
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
String message;
try {
while ((message = reader.readLine()) != null) {
// 将消息发送给所有连接的客户端
for (PrintWriter clientWriter : clientWriters) {
clientWriter.println(message);
clientWriter.flush();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
```
要实现将消息发送给服务器,在客户端界面中,当用户点击发送按钮时,将消息发送给服务器即可。
在客户端界面中,获取用户输入的消息,通过Socket对象的输出流将消息发送给服务器。
```java
// 客户端界面
public class ClientGUI extends Application {
private Socket socket;
private PrintWriter writer;
public void start(Stage primaryStage) {
// 创建界面布局
TextField inputField = new TextField(); // 输入消息的文本框
Button sendButton = new Button("发送"); // 发送按钮
// 设置按钮点击事件
sendButton.setOnAction(e -> {
String message = inputField.getText();
writer.println(message);
writer.flush();
inputField.clear();
});
// 创建布局,并添加控件
VBox vbox = new VBox();
vbox.getChildren().addAll(inputField, sendButton);
// 创建场景并设置布局
Scene scene = new Scene(vbox, 400, 300);
// 设置舞台并显示
primaryStage.setScene(scene);
primaryStage.show();
// 连接服务器
try {
socket = new Socket("localhost", 8888);
writer = new PrintWriter(socket.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
```
在服务器中,当接收到客户端发送的消息时,将其发送给所有连接的客户端。
```java
// 服务器类
public class Server {
private ServerSocket serverSocket;
private List<PrintWriter> clientWriters;
public Server() {
clientWriters = new ArrayList<>();
}
public void start() {
try {
serverSocket = new ServerSocket(8888);
while (true) {
Socket socket = serverSocket.accept();
// 处理客户端连接的线程
Thread thread = new Thread(new ClientHandler(socket));
thread.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
// 处理客户端连接的线程
private class ClientHandler implements Runnable {
private Socket socket;
private BufferedReader reader;
private PrintWriter writer;
public ClientHandler(Socket socket) {
this.socket = socket;
try {
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer = new PrintWriter(socket.getOutputStream());
// 将客户端的输出流保存到列表中
clientWriters.add(writer);
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
String message;
try {
while ((message = reader.readLine()) != null) {
// 将消息发送给所有连接的客户端
for (PrintWriter clientWriter : clientWriters) {
clientWriter.println(message);
clientWriter.flush();
}
// 将消息显示在服务器界面上(可选)
System.out.println(message);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
```
这样,当客户端发送一条消息时,服务器会将该消息发送给所有连接的客户端,并且服务器也可以将接收到的消息显示在控制台上。
请注意,在真实的应用中,你可能还需要处理异常、加入更多的错误检查、处理客户端断开连接等情况。此外,还应该考虑消息的格式、认证和加密等安全性相关问题。以上代码仅为简单示例,你可以根据需要进行扩展和优化。