gpt4 book ai didi

java - 如何在收到输入后通知所有线程

转载 作者:行者123 更新时间:2023-12-01 19:10:56 27 4
gpt4 key购买 nike

我目前正在开发一些东西,其中有一个服务器等待连接,一旦建立连接,就会创建一个线程来处理服务器和客户端之间的通信。所有这些通信都是基于字符串的,利用InputStreamReaders和OutputStreamReaders,我现在需要做的是能够通过他们自己的ServerThread向每个连接的客户端发送消息。编写内容的简单 View 如下:

public final static int SERVER_PORT = 12345;   
private static int numThreads=0;

public void Server() {
ServerSocket serverSocket = null;

try{
serverSocket = new ServerSocket(Server.SERVER_PORT);
} catch (IOException e) {
e.printStackTrace();
System.exit(-1);
}

while (true) {
try {
Socket socket = serverSocket.accept();
numThreads++;
new ServerThread(socket, numThreads).start();
} catch (Exception e) {
e.printStackTrace();
}
}
}

变量numThreads主要用于向客户端打印特定信息。在 ServerThread 上我会:

@Override
public void run() {
while (true) {
String command=null;
try{
command = readString(); //method that reads input from Client
//Do actions based on command
}catch(Exception ex){
ex.getMessage();
}
}
//Close streams and socket
}

所显示方法的内容可能有一些拼写错误,因为目前还有更多内容,但应该有助于直观地显示问题。

为了简化客户端,我们假设有一个客户端,它连接到服务器并向我们的ServerThread发送命令/消息。

每次客户端连接到服务器时,都会创建一个新的ServerThread,它会不断等待客户端发送命令。如果这个命令对应于例如“发送”,我需要向连接到服务器的每个客户端发送一条消息。

我怎样才能做到这一点?

最佳答案

这里我提供一个思路,可以通过事件监听(观察者模式)来解决。
可以将发布商分为一个单独的类。

public class ServerThread implements Runnable {

// Used for event subscription (CopyOnWriteArrayList is not the best implementation, please adjust
// according to project needs)
private static final List<ServerThread> LISTENERS = new CopyOnWriteArrayList<>();

public ServerThread(Socket socket, int num) {
// do something ...
LISTENERS.add(this);
}

@Override
public void run() {
while (true) {
String command = null;
try {
command = readString(); // method that reads input from Client
// Do actions based on command
if ("send".equals(command)) {
ServerThread.publish(new SendEvent(command));
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
// Close streams and socket
}

private String readString() {
return null;
}

/**
* event publishing method
*
* @param event
*/
public static void publish(SendEvent event) {
LISTENERS.forEach(listener -> listener.listen(event));
}

/**
* Event processing method
*
* @param event
*/
public void listen(SendEvent event) {
// to something ...
}
}

关于java - 如何在收到输入后通知所有线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59482912/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com