Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.java.programmer > #38967
| From | Andreas Leitgeb <avl@logic.at> |
|---|---|
| Newsgroups | comp.lang.java.programmer |
| Subject | server-side Socket does not recognize broken connection. |
| Date | 2019-05-29 11:03 +0000 |
| Organization | A noiseless patient Spider |
| Message-ID | <slrnqespnm.cfl.avl@logic.at> (permalink) |
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);
}
}
}
Back to comp.lang.java.programmer | Previous | Next — Next in thread | Find similar | Unroll thread
server-side Socket does not recognize broken connection. Andreas Leitgeb <avl@logic.at> - 2019-05-29 11:03 +0000
Re: server-side Socket does not recognize broken connection. Eric Sosman <esosman@comcast-dot-net.invalid> - 2019-05-29 08:30 -0400
Re: server-side Socket does not recognize broken connection. Joerg Meier <joergmmeier@arcor.de> - 2019-05-29 14:58 +0200
Re: server-side Socket does not recognize broken connection. Andreas Leitgeb <avl@logic.at> - 2019-05-29 14:50 +0000
Re: server-side Socket does not recognize broken connection. Eric Douglas <e.d.programmer@gmail.com> - 2019-05-29 08:22 -0700
Re: server-side Socket does not recognize broken connection. Andreas Leitgeb <avl@logic.at> - 2020-01-30 15:22 +0000
Re: server-side Socket does not recognize broken connection. Martin Gregorie <martin@mydomain.invalid> - 2019-05-29 16:06 +0000
Re: server-side Socket does not recognize broken connection. Eric Douglas <e.d.programmer@gmail.com> - 2019-05-29 07:14 -0700
Re: server-side Socket does not recognize broken connection. trisha guillot <guillottrisha347@gmail.com> - 2019-05-31 20:13 -0700
Re: server-side Socket does not recognize broken connection. Marcel Mueller <news.5.maazl@spamgourmet.org> - 2019-06-01 16:08 +0200
csiph-web