{"id":3947,"date":"2014-07-15T11:06:19","date_gmt":"2014-07-15T16:06:19","guid":{"rendered":"http:\/\/appcrawler.com\/wordpress\/?p=3947"},"modified":"2014-07-15T11:06:19","modified_gmt":"2014-07-15T16:06:19","slug":"does-java-reuse-closed-sockets-when-the-host-still-has-one-open","status":"publish","type":"post","link":"http:\/\/appcrawler.com\/wordpress\/2014\/07\/15\/does-java-reuse-closed-sockets-when-the-host-still-has-one-open\/","title":{"rendered":"Does java reuse closed sockets when the host still has one open?"},"content":{"rendered":"<p>We were curious as to what the handoff is between an application that opens a network socket, and how the Linux OS handles it.<\/p>\n<p>Let&#8217;s assume we do what is below:<\/p>\n<pre lang=\"java\">\r\nimport java.net.*;\r\n\r\npublic class checkSocket {\r\n  public static void main(String args[]) throws Exception {\r\n    Socket s = new Socket();\r\n    s.connect(new InetSocketAddress(InetAddress.getByName(\"cmhldecomecm01\"),10180));\r\n    System.out.println(\"created socket on port \" + s.getLocalPort());\r\n    s.close();\r\n    System.out.println(\"closed socket, giving time to reuse port (hopefully)\");\r\n    Thread.sleep(15000);\r\n    s = new Socket();\r\n    s.connect(new InetSocketAddress(InetAddress.getByName(\"cmhldecomecm01\"),10180));\r\n    System.out.println(\"created socket on port \" + s.getLocalPort());\r\n    s.close();\r\n    System.out.println(\"closed socket\");\r\n  }\r\n}\r\n<\/pre>\n<p>As you can see below, we open a second socket.  Our keepalive time of 75 ensures whatever ports have been opened will remain open throughout the test.<\/p>\n<pre>\r\n-bash-4.1$ java checkSocket\r\ncreated socket on port 53572\r\nclosed socket, giving time to reuse port (hopefully)\r\ncreated socket on port 53573\r\nclosed socket\r\n-bash-4.1$ netstat -anp | grep 10180\r\ntcp        0      0 ::ffff:172.28.37.26:53572   ::ffff:172.28.37.75:10180   TIME_WAIT   -\r\ntcp        0      0 ::ffff:172.28.37.26:53573   ::ffff:172.28.37.75:10180   TIME_WAIT   -\r\n-bash-4.1$ \r\n<\/pre>\n<p>Notice that we end up creating two sockets, even when the first one has been closed by the application, but is open by the OS.  Why doesn&#8217;t it reuse these sockets?<\/p>\n<p>When we reconfigure the software to bind locally to a specific port, we see it can be reused.<\/p>\n<pre lang=\"java\">\r\nimport java.net.*;\r\n\r\npublic class checkSocket {\r\n  public static void main(String args[]) throws Exception {\r\n    Socket s = new Socket();\r\n    s.setReuseAddress(true);\r\n    s.connect(new InetSocketAddress(InetAddress.getByName(\"cmhldecomecm01\"),10180));\r\n    System.out.println(\"created socket on port \" + s.getLocalPort());\r\n    int p = s.getLocalPort();\r\n    s.close();\r\n    System.out.println(\"closed socket, giving time to reuse port (hopefully)\");\r\n    Thread.sleep(15000);\r\n    s = new Socket();\r\n    s.setReuseAddress(true);\r\n    s.bind(new InetSocketAddress(InetAddress.getByName(\"cmhldecomatl01\"),p));\r\n    s.connect(new InetSocketAddress(InetAddress.getByName(\"cmhldecomecm01\"),10180));\r\n    System.out.println(\"created socket on port \" + s.getLocalPort());\r\n    s.close();\r\n    System.out.println(\"closed socket\");\r\n  }\r\n}\r\n<\/pre>\n<p>&#8230;with the results below&#8230;<\/p>\n<pre>\r\n-bash-4.1$ java checkSocket\r\ncreated socket on port 53647\r\nclosed socket, giving time to reuse port (hopefully)\r\ncreated socket on port 53647\r\nclosed socket\r\n-bash-4.1$ netstat -anp | grep 10180\r\ntcp        0      0 ::ffff:172.28.37.26:53647   ::ffff:172.28.37.75:10180   TIME_WAIT   -\r\n-bash-4.1$ \r\n<\/pre>\n<p>Any major java HTTP application server handles ports in the latter manner, to ensure resources are used efficiently.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>We were curious as to what the handoff is between an application that opens a network socket, and how the Linux OS handles it. Let&#8217;s assume we do what is below: import java.net.*; public class checkSocket { public static void&hellip;<\/p>\n<p class=\"more-link-p\"><a class=\"more-link\" href=\"http:\/\/appcrawler.com\/wordpress\/2014\/07\/15\/does-java-reuse-closed-sockets-when-the-host-still-has-one-open\/\">Read more &rarr;<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_mi_skip_tracking":false,"footnotes":""},"categories":[25,28],"tags":[],"_links":{"self":[{"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/posts\/3947"}],"collection":[{"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/comments?post=3947"}],"version-history":[{"count":7,"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/posts\/3947\/revisions"}],"predecessor-version":[{"id":3990,"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/posts\/3947\/revisions\/3990"}],"wp:attachment":[{"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/media?parent=3947"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/categories?post=3947"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/tags?post=3947"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}