【发布时间】:2023-04-01 09:57:01
【问题描述】:
我正在尝试在远程主机上运行 Java 服务器套接字,它将定期向所有连接的客户端广播消息(由外部进程确定)。
服务器套接字定义为:
ServerSocket serverSocket = (ServerSocket) ((ServerSocketFactory)ServerSocketFactory.getDefault()).createServerSocket(3050);
while (true) {
Socket socket = serverSocket.accept();
remoteService.addSocket(socket);
}
它将跟踪数组列表中的套接字连接。每当需要发送广播时,都会调用以下方法:
public void broadcastMessage(String message){
for (Socket socket : remoteService.getSockets()) {
System.out.println("Sending message: " + message);
PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
printWriter.write(message);
}
}
在客户端,设置如下:
Socket socket = (Socket) ((SocketFactory) SocketFactory.getDefault()).createSocket(serverHost,portNum);
BufferedReader socketBufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true) {
String message = socketBufferedReader.readLine();
if (message != null && message != "") {
System.out.println("Message received: " + message);
};
}
服务器正确打印“发送消息”字符串的次数与连接的客户端一样多,但没有任何客户端进程打印任何内容。知道如何让客户端正确监听套接字输入流吗?
【问题讨论】:
-
你在读行但你没有写行。希望我每次在这里写的时候都能赚到钱。在发送的消息中添加行终止符,
-
@ControlAltDel 在 it 被垃圾回收之前,套接字不会关闭,因为集合中仍然存在引用,所以不会关闭。并且关闭一个套接字会解除对端中的
readLine()的阻塞。 -
你是绝对正确的 - 从 write 方法切换到 println 以包含行终止符就可以了。现在一切正常。
标签: java sockets inputstream bufferedreader printwriter