Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何侦听端口上的传入数据包?_Java_Port_Serversocket - Fatal编程技术网

Java 如何侦听端口上的传入数据包?

Java 如何侦听端口上的传入数据包?,java,port,serversocket,Java,Port,Serversocket,我想监听端口19132上传入的数据包,并在它们到达时打印出来,但到目前为止,我的代码根本无法打印任何内容。有一台服务器通过端口19132将数据包转发到我的计算机,该端口已打开并启用,但仍然没有打印任何内容 public static void listenToPort(){ try{ ServerSocket serverSocket = new ServerSocket(19132); Socket socket = serverSocket.accep

我想监听端口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());
    }
}

在服务器端,有信息被发送,但客户端程序(此脚本)没有接收任何信息,有什么问题吗?

您正在读取行,而不是“数据包”。如果发送到此端口的数据不包含换行符,
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