java - 如何向多线程服务器上的所有客户端发送消息?
问题描述
我编写了一个简单的多线程服务器,两个客户端可以在其上向服务器发送消息,服务器可以一次向所有客户端发送消息。但我无法让它按预期工作。
我已经通过将所有 PrintWriter 的列表放入 Server 类中进行了尝试,然后通过每个 PrintWriter 打印消息,但这也不起作用。
公共类客户{
private static final String IP = "10.59.0.188";
private Socket clientSocket;
private PrintWriter toServer;
private BufferedReader fromServer;
private BufferedReader input;
private String serverMessage;
private String clientMessage;
private String name;
public static void main(String[] args) {
try {
new Client();
} catch (Exception e) {
System.err.println(e);
}
}
public Client() throws IOException {
input = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Name: ");
name = input.readLine();
openConnection();
toServer.println(name);
while (true) {
clientMessage = input.readLine();
toServer.println(clientMessage);
}
//closeConnection();
}
private void openConnection() throws IOException{
clientSocket = new Socket(IP, 6666);
toServer = new PrintWriter(clientSocket.getOutputStream(), true);
fromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
}
}
公共类服务器{
private ServerSocket serverSocket;
private BufferedReader input;
private Vector<ClientProcess> processList;
private int clientCount = 0;
private String serverMessage;
public static void main(String[] args) {
try {
new Server();
} catch (Exception e) {
System.err.println(e);
}
}
public Server() throws IOException {
startServer();
while (clientCount < 2) {
waitForNewClient();
}
for (ClientProcess clientProcess : processList) {
clientProcess.start();
System.out.println("Clientprocess started");
}
}
private void startServer() throws IOException {
processList = new Vector<>();
input = new BufferedReader(new InputStreamReader(System.in));
serverSocket = new ServerSocket(6666);
System.out.println("Server online");
}
private void waitForNewClient() throws IOException {
System.out.println("Waitin' for new Client...");
Socket clientSocket = serverSocket.accept();
ClientProcess clientProcess = new ClientProcess(clientSocket);
processList.add(clientProcess);
clientCount++;
}
}
公共类 ClientProcess 扩展线程 {
private Socket clientSocket;
private PrintWriter toClient;
private BufferedReader fromClient;
private String clientMessage;
private String serverMessage;
private String name;
private BufferedReader input;
public ClientProcess(Socket clientSocket) {
this.clientSocket = clientSocket;
input = new BufferedReader(new InputStreamReader(System.in));
}
@Override
public void run() {
try {
openClientConnection();
name = fromClient.readLine();
do {
clientMessage = fromClient.readLine();
System.out.println(name + ": " + clientMessage);
} while (true);
//closeClientConnection();
} catch (IOException e) {
System.err.println(e);
}
}
private void openClientConnection() throws IOException {
toClient = new PrintWriter(clientSocket.getOutputStream());
fromClient = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
serverMessage = "ServerMessageTest00";
toClient.println(serverMessage);
System.out.println("Client Connection Online");
}
}
解决方案
在 ClientProcess 中创建一个新的PrintWriter
.
从javadoc:
从现有的 OutputStream 创建一个新的 PrintWriter,而不自动刷新行。
这意味着您将toClient.println(...);
被写入服务器的输出缓冲区,但不会发送到客户端,因为您错过了toClient.flush()
.
推荐阅读
- python - 将 json 列表标准化为值
- exception - 骆驼春 DSL 永远返还
- r - RI 需要帮助理解我教授的 R 代码来计算准确的置信区间
- google-maps - Google Places API 商店定位器 - 单击搜索结果标题以显示 infoWindow
- c++ - 如何在链表 C++ 的开头插入一个数字?
- javascript - javascript中的导出处理程序问题
- python - 如何从基本操作构建 TensorFlow 循环?
- python - 多个数据库创建和迁移不起作用
- go - 如何验证多个嵌套结构
- reporting-services - 存储 SSRS 报告的格式化文本