Details
-
Bug
-
Status: Resolved
-
Major
-
Resolution: Fixed
-
4.4.3
-
None
Description
I have observed the following problem on Linux with Apache HttpComponents 4.4.1 synchronous server: After calling server.shutdown(42, TimeUnit.MICROSECONDS), if there are Keep-alive connections opened (there is no request processing), these sockets are not closed. Only ServerSocket is closed:
netstat -aon | grep 58276
TCP 127.0.0.1:50658 127.0.0.1:58276 ESTABLISHED 18012
TCP 127.0.0.1:58276 127.0.0.1:50658 ESTABLISHED 18012
In attempt to start again HTTP server on the same port a BindingException is thrown:
Caused by: java.net.BindException: Address already in use
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.PlainSocketImpl.socketBind(PlainSocketImpl.java:521)
at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:414)
at java.net.ServerSocket.bind(ServerSocket.java:326)
at java.net.ServerSocket.<init>(ServerSocket.java:192)
at javax.net.DefaultServerSocketFactory.createServerSocket(ServerSocketFactory.java:170)
at org.apache.http.impl.bootstrap.HttpServer.start(HttpServer.java:116)
On Windows the behavior is the same , however there is no BindingException and the server starts process requests without any problems.
One can reproduce the problem using example code from https://github.com/anton-k11/apache-tests/tree/master
- Start the server and the client.
- Client will send several requests to the server.
- Client will open 2 connections to the server.
- After 1 min. the server will be shutdown.
- Check the open connections on port 9090, the 2 connections between client and server are still open.
- After 1 min. a new Server is started on the same port 9090.
- On Linux this brakes with:
java.net.BindException: Address already in use
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:387)
at java.net.ServerSocket.bind(ServerSocket.java:375)
at java.net.ServerSocket.<init>(ServerSocket.java:237)
at javax.net.DefaultServerSocketFactory.createServerSocket(ServerSocketFactory.java:231)
at org.apache.http.impl.bootstrap.HttpServer.start(HttpServer.java:116)
at org.apache.http.examples.server.TestHttpServer.main(TestHttpServer.java:49) - On Windows this work just fine and the server is started successfully.
- On Linux this brakes with: