Java 如何侦听端口上的传入数据包?
我想监听端口19132上传入的数据包,并在它们到达时打印出来,但到目前为止,我的代码根本无法打印任何内容。有一台服务器通过端口19132将数据包转发到我的计算机,该端口已打开并启用,但仍然没有打印任何内容Java 如何侦听端口上的传入数据包?,java,port,serversocket,Java,Port,Serversocket,我想监听端口19132上传入的数据包,并在它们到达时打印出来,但到目前为止,我的代码根本无法打印任何内容。有一台服务器通过端口19132将数据包转发到我的计算机,该端口已打开并启用,但仍然没有打印任何内容 public static void listenToPort(){ try{ ServerSocket serverSocket = new ServerSocket(19132); Socket socket = serverSocket.accep
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());
}
}
在服务器端,有信息被发送,但客户端程序(此脚本)没有接收任何信息,有什么问题吗?您正在读取行,而不是“数据包”。如果发送到此端口的数据不包含换行符,
readLine()
将永远阻塞,或者直到对等方关闭连接
另一方面,当它读取某些内容或EOS时,您的代码将永远旋转打印
null
,因为您没有检查readLine()
是否返回null,此时您必须关闭套接字并退出循环。您正在读取行,而不是“数据包”。如果发送到此端口的数据不包含换行符,readLine()
将永远阻塞,或者直到对等方关闭连接
另一方面,当它读取某些内容或EOS时,您的代码将永远旋转打印
null
,因为您没有检查readLine()
是否返回null,此时必须关闭套接字并退出循环。更不用说,很可能System.exit没有给控制台足够的时间刷新其输出(我不能100%确定System.exit是否会导致刷新System.out和System.err)
为什么不在服务器进程上附加一个调试器,看看它是否通过了in.readLine()?正如其他海报中提到的,如果您不发送换行符,in.readLine()将一直阻止,直到您发送换行符为止
其次,您不应该真正使用System.exit。在大多数情况下,这是一种糟糕的形式,会让人们奇怪为什么一个应用程序会随机退出。如果要退出某个应用程序,应允许代码返回main()方法,然后根据需要执行System.exit。更不用说,System.exit可能没有足够的时间让控制台刷新其输出(我不能100%确定System.exit是否会导致System.out和System.err刷新) 为什么不在服务器进程上附加一个调试器,看看它是否通过了in.readLine()?正如前面提到的另一张海报所述,如果不发送换行符,in.readLine()将一直阻塞,直到您发送为止 其次,你不应该真的使用System.exit。在大多数情况下,它的形式很糟糕,会让人们想知道为什么一个应用程序会随机退出。如果你想退出一个应用程序,你应该允许代码返回main()方法,如果需要的话,你可以从那里执行System.exit