0

我想监听端口 19132 上的传入数据包并在它们到来时将它们打印出来,但到目前为止我的代码根本没有打印任何东西。有一台服务器通过端口 19132 将数据包转发到我的计算机,并且该端口已打开并启用,但仍然没有打印任何内容。

public static void listenToPort(){
    try{
        ServerSocket serverSocket = new ServerSocket(19132);
        Socket socket = serverSocket.accept();
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        while(true){
            try{
                System.out.println(in.readLine());
            }
            catch(IOException e){
                System.out.println("Connection to server lost!");
                System.exit(1);
                break;
            }
        }
    }
    catch(IOException e){
        System.out.println(e.getMessage());
    }
}

在服务器端有信息被发送,但是客户端程序(这个脚本)没有收到任何东西,这是什么问题?

4

2 回答 2

2

您正在阅读行,而不是“数据包”。如果发送到此端口的数据不包含换行符,readLine()将永远阻塞,或者直到对等方关闭连接。

另一方面,当它确实读取某些内容或 EOS 时,您的代码将永远旋转打印null,因为您没有检查是否readLine()返回 null,此时您必须关闭套接字并退出循环。

于 2012-07-06T02:28:35.517 回答
1

更不用说,System.exit 完全有可能没有给控制台足够的时间来刷新它的输出(我不能 100% 确定 System.exit 是否会导致 System.exit 刷新。和 System.err)。

为什么不将调试器附加到您的服务器进程,看看它是否甚至超过了 in.readLine()?正如其他海报中提到的那样,如果您不发送换行符, in.readLine() 会阻塞,直到您发送。

其次,您不应该真正使用 System.exit。在大多数情况下,这是一种糟糕的形式,并导致人们想知道为什么应用程序会随机退出。如果你想退出一个应用程序,你应该允许代码返回到 main() 方法,如果需要,你可以从那里执行 System.exit。

于 2012-07-06T02:33:48.453 回答