我想收听端口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());
}
}
在服务器端有信息被发送,但是客户端程序(这个脚本)没有收到任何东西,有什么问题?
答案 0 :(得分:2)
您正在读取行,而不是“数据包”。如果发送到此端口的数据不包含换行符,readLine()
将永久阻止,或直到对等方关闭连接。
另一方面,当 读取内容或EOS时,您的代码将永远打印null
,因为您没有检查readLine()
是否返回null,此时你必须关闭套接字并退出循环。
答案 1 :(得分:1)
更不用说,System.exit可能完全没有足够的时间让控制台刷新它的输出(我不能100%确定System.exit是否会导致刷新在System.out和System.err)。
为什么不将调试器附加到服务器进程,看看它是否已超过in.readLine()?作为提到的其他海报之一,如果您没有发送换行符,in.readLine()会阻止,直到您这样做。
其次,你不应该真正使用System.exit。在大多数情况下这是糟糕的形式,并导致人们想知道为什么一个应用程序将随机退出。如果要退出应用程序,则应该允许代码返回到main()方法,并在那里可以根据需要执行System.exit。