gpt4 book ai didi

java - 我已经创建了一个带有套接字的 Java 服务器,如何打印到所有套接字?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:45:27 26 4
gpt4 key购买 nike

我已经尝试了一段时间,我希望多个客户端同时接收多个输入。
有一个问题,如果一个客户端说 ',我希望服务器向所有客户端打印“嗨” print2all 嗨'。
我知道如何处理它以打印它,只是打印给所有客户就是问题所在。

这是我目前所拥有的。
服务器

try{
try{
server = new ServerSocket(25565);
} catch (Exception e){
e.printStackTrace();
}
while (isListening){
new SocketThread(server.accept()).start();
}
server.close();
} catch (Exception e){
e.printStackTrace();
}

套接字线程

try {
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

String inputLine, outputLine;
Processor kkp = new Processor();
out.println("Hi!");

while ((inputLine = in.readLine()) != null) {
outputLine = kkp.Proccess(inputLine,this.socket);
out.println(outputLine);
}
out.close();
in.close();
socket.close();

} catch (IOException e) {
e.printStackTrace();
}

客户端

            Processor p = new Processor();
socket = new Socket("localhost",25565);
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
String fromServer;
String fromUser;
out.println("print2all Hi")
socket.close();

最佳答案

首先,您需要跟踪所有已连接的客户端:

final List<SocketThread> clients = new ArrayList<>();

while (isListening){
SocketThread client = new SocketThread(server.accept()).start();
clients.add(client);
}

有了这样的列表,如果一个客户端收到 "print2all Hi",它会简单地遍历所有 clients 并向每个客户端发送消息。为此,您很可能必须在 SocketThread 上公开一些方法来访问客户端套接字。这意味着您必须将 out 变量更改为字段。

另一种方法是保留一个客户端套接字列表。但这严重破坏了封装。如果直接暴露套接字,您也可能会遇到讨厌的 IO/线程安全问题。最好将它们隐藏在某些 API 后面(例如 SocketThread 方法)并在内部正确执行同步。

关于java - 我已经创建了一个带有套接字的 Java 服务器,如何打印到所有套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12550712/

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