Question:
How do you determine when a client has closed its socket, so that a
server can cease to wait for messages from that client?
Answer:
When a socket endpoint closes its socket, a read on the InputStream
at the other end will return -1, indicating end of file. If the
process crashes, the same will happen because the operating system
will close the socket when the process dies.
However, if the host
that the process is running on crashes, there is no way to detect
the endpoint termination. With native system programming, it is
possible to set the SO_KEEPALIVE socket option to test the integrity
of a connection on a more frequent basis than the default 2 hours.
Java does not allow you to do this, and instead relies on the system
default.