Java套接字客户端未检测到服务器消息

问题描述 投票:0回答:1

我正在尝试在远程主机上运行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);
            };
        }

服务器正确地打印了“发送消息”字符串,与连接的客户端一样多,但是没有一个客户端进程打印任何内容。知道如何让客户端正确监听套接字输入流吗?

java sockets inputstream bufferedreader printwriter
1个回答
0
投票

您的问题在此服务器代码中:

for (Socket socket : remoteService.getSockets()) {
    System.out.println("Sending message: " + message);
    PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
    printWriter.write(message);
}

不存储PrintWriters,因此会收集垃圾。这将关闭流,这将关闭套接字。

您最好的方法是将字符串字节直接写入Socket.getOutputStream。否则,请保存并重复使用您要创建的PrintWriters。

© www.soinside.com 2019 - 2024. All rights reserved.