Java - 如何关闭重置由我的应用程序初始化的套接字并在运行中重新打开它?无论是TCP还是UDP

时间:2012-03-08 20:34:59

标签: java linux networking tcp udp

我有以下应用程序,如下所示:

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);

1 个答案:

答案 0 :(得分:1)

操作系统需要一些时间“注意”该端口可以再次使用 - 即使您关闭套接字并终止该应用程序。问题可以通过以下代码解决:

ServerSocket ss = ... //initialization of socket listening on port 1965
ss.setReuseSocket(true);

请记住,上面的代码只是操作系统的提示,应该尽可能快地释放端口。 TCP堆栈的一些奇特的实现可能不尊重这一点。