Path: csiph.com!eternal-september.org!feeder.eternal-september.org!reader01.eternal-september.org!.POSTED!not-for-mail From: Andreas Leitgeb Newsgroups: comp.lang.java.programmer Subject: server-side Socket does not recognize broken connection. Date: Wed, 29 May 2019 11:03:18 -0000 (UTC) Organization: A noiseless patient Spider Lines: 53 Message-ID: Reply-To: avl@logic.at Injection-Date: Wed, 29 May 2019 11:03:18 -0000 (UTC) Injection-Info: reader02.eternal-september.org; posting-host="4026fc8d5191aa509b45c747fc04e2b7"; logging-data="2817"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18HfLqQuw+Wxtlpb6vff7pz" User-Agent: slrn/1.0.3 (Linux) Cancel-Lock: sha1:U3B+2pEOgDdNuLr2eOXM1jW45bs= Xref: csiph.com comp.lang.java.programmer:38967 I have a ServerSocket on some port. whenever ".accept()" returns a connection, it goes to a loop that (among doing other stuff) polls the socket's input stream's ".available()" and if it returns > 0 it reads and processes that data. (SSCCE at end of post) A client (e.g. using plain old "telnet" on unix) connects, types a bit, then breaks the connection using Ctrl-] and "close", and is back on the shell. (closing the terminal window that's running telnet has same effect, ditto killing the telnet process - apparently whatever breaks, or even properly shuts down the connection from client side.) The Socket on server side, however keeps reporting 0 on .available(), rather than throwing some exception for the broken socket. Single stepping the .available() method (class AbstractPlainSocketImpl) shows that it just never receives the ConnectionResetException, and thus won't ever get to throw new IOException("Stream closed.") itself. Field resetState never changes away from CONNECTION_NOT_RESET. What am I doing wrong wrt. EOF-detection in ".available()" ? PS: The real code does more interesting stuff while no input is available, so it cannot wait blockingly. The real code also has other exits from the loop (based on input received), but that's not relevant for this SSCCE. PS: unlike most of my recent posts, this one is *not* Java11-related. SSCCE: ServerTest.java import javax.net.ServerSocketFactory; import java.net.ServerSocket; import java.net.Socket; import java.io.InputStream; import java.io.IOException; public class ServerTest { public static void main(String[] args) throws IOException,InterruptedException { ServerSocket serverSocket = ServerSocketFactory.getDefault().createServerSocket(65432); Socket clientSocket = serverSocket.accept(); InputStream is = clientSocket.getInputStream(); while (true) { if (is.available() > 0) { System.out.println( is.read() ); } Thread.sleep(100); } } }