我有以下应用程序,如下所示:
Runtime.getRuntime().exec("java -cp /var/dist/Test.jar System.V PDP-11");
它有10到20秒的任务,它还包含端口1965
上的TCP / UDP服务器。一旦该任务完成,我的另一只手发送一个TCP字节来关闭System.V
Runtime.getRuntime().exec("java -cp /var/dist/Test.jar System.V PDP-11/20");
在不到1秒的时间内,如上所述执行另一个操作,但由于端口1965
已在使用中,因此失败。但它是使用System.exit(0)
我如何解决这个问题?所以它没有说"已经在使用端口"?似乎需要花费大量时间来初始化通过Java监听的TCP或UDP端口。 (其中nc -l端口被快速杀死)。
跟进:
我尝试了以下但仍然需要获得该端口(Linux OS)。
byte [] buf = new byte [50];
sock.setSoTimeout(100);
答案 0 :(得分:1)
操作系统需要一些时间“注意”该端口可以再次使用 - 即使您关闭套接字并终止该应用程序。问题可以通过以下代码解决:
ServerSocket ss = ... //initialization of socket listening on port 1965
ss.setReuseSocket(true);
请记住,上面的代码只是操作系统的提示,应该尽可能快地释放端口。 TCP堆栈的一些奇特的实现可能不尊重这一点。