Sockets: Why a Connection reset exception on Windows but not on Linuxwhen a client disconnects from

Discussion in 'Java' started by pcgallagher, Dec 27, 2008.

  1. pcgallagher

    pcgallagher Guest

    I'm curious why I get a Connection reset exception when I run this
    code on Windows but not on Linux.

    It's a client and a server communicating through a socket. The
    exception occurs on the server when the client terminates suddenly.
    It's ordinary client-server code, but I'll include it for
    illustration.

    It make sense that the exception occurs - the server is waiting for
    the client to send a command, but the client suddenly terminates.
    What's odd is that the exception occurs on Windows but not on Linux.

    Here are the results on the server side, when run on Windows Vista:

    Accepting clients now
    Client acquired on port #7777, reading from socket
    Hi
    java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(Unknown Source)
    at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
    at sun.nio.cs.StreamDecoder.read(Unknown Source)
    at java.io.InputStreamReader.read(Unknown Source)
    at java.io.BufferedReader.fill(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)
    at Server.serviceClient(Server.java:31)
    at Server.main(Server.java:51)



    Here are the results when run on Linux:

    Accepting clients now
    Client acquired on port #7777, reading from socket
    Hi
    Client serviced



    Here's the code for the Server and the Client.
    Server.java:


    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;

    public class Server {

    private ServerSocket serverSocket;
    private BufferedReader bufferedReader;

    public Server(int port) throws java.io.IOException {
    serverSocket = new ServerSocket(port);
    }

    /**
    * serviceClient accepts a client connection and reads lines from
    the socket.
    * Each line is handed to executeCommand for parsing and
    execution.
    */
    public void serviceClient() throws java.io.IOException {
    System.out.println("Accepting clients now");
    Socket clientConnection = serverSocket.accept();
    // Arrange to read input from the Socket
    InputStream inputStream = clientConnection.getInputStream();
    bufferedReader = new BufferedReader(new InputStreamReader
    (inputStream));
    // Arrange to write result across Socket back to client
    OutputStream outputStream = clientConnection.getOutputStream
    ();
    PrintStream printStream = new PrintStream(outputStream);

    System.out.println("Client acquired on port #" +
    serverSocket.getLocalPort() + ", reading from socket");

    String commandLine;
    while ((commandLine = bufferedReader.readLine()) != null) {
    try {
    System.out.println(commandLine);
    } catch (Exception ex) {
    System.out.println("ERROR: " + ex);
    }
    }
    }


    public static void main(String argv[]) {
    int port = 1099;
    if (argv.length > 0) {
    try {
    port = Integer.parseInt(argv[0]);
    } catch (Exception e) {
    }
    }
    try {
    Server server = new Server(port);
    server.serviceClient();
    System.out.println("Client serviced");
    } catch (Exception ex) {
    ex.printStackTrace();
    }
    }
    }




    Client.java:

    public class Client {
    public static void main(String[] args) {
    try {
    // parse command line arguments
    String host = args[0];
    int port = Integer.parseInt(args[1]);
    SocketWriter sw = new SocketWriter(host, port);
    sw.sayHi();
    } catch (Exception ae) {
    System.out.println("An exception occurred");
    ae.printStackTrace();
    }
    }
    }



    SocketWriter.java:

    import java.io.*;
    import java.net.Socket;

    class SocketWriter {


    private Socket socket;
    private PrintStream printStream;
    private BufferedReader inputReader;


    SocketWriter(String host, int port) throws java.io.IOException {
    socket = new Socket(host, port);
    OutputStream outputStream = socket.getOutputStream();
    printStream = new PrintStream(outputStream);
    InputStream inputStream = socket.getInputStream();
    InputStreamReader inputStreamReader = new InputStreamReader
    (inputStream);
    inputReader = new BufferedReader(inputStreamReader);
    }

    void sayHi() {
    printStream.println("Hi");
    }
    }


    ---
    Paul
     
    pcgallagher, Dec 27, 2008
    #1
    1. Advertising

  2. Re: Sockets: Why a Connection reset exception on Windows but noton Linux when a client disconnects from a server

    pcgallagher wrote:
    > I'm curious why I get a Connection reset exception when I run this
    > code on Windows but not on Linux.
    >
    > It's a client and a server communicating through a socket. The
    > exception occurs on the server when the client terminates suddenly.
    > It's ordinary client-server code, but I'll include it for
    > illustration.
    >
    > It make sense that the exception occurs - the server is waiting for
    > the client to send a command, but the client suddenly terminates.


    At first, there should be no exception since the client doesn't
    terminate suddenly. It finishes its work and should disconnect from the
    server (behind the scenes).

    Try to close the streams explicitly in SocketWriter and try it again.

    Bye
    Michael
     
    Michael Rauscher, Dec 27, 2008
    #2
    1. Advertising

  3. pcgallagher

    Mark Space Guest

    Re: Sockets: Why a Connection reset exception on Windows but noton Linux when a client disconnects from a server

    pcgallagher wrote:
    > I'm curious why I get a Connection reset exception when I run this
    > code on Windows but not on Linux.


    I re-jiggered your code very slightly to make it an SSCCE, I don't get
    an exception. Instead, the server hangs waiting for more input, because
    the client doesn't send any more data or close the socket.


    debug:
    Accepting clients now
    Client acquired on port #1099, reading from socket
    Hi


    And hangs there. I didn't investigate this further, since I did make
    changes. You may want to try this code, and report back. If your
    behavior is different, then there's some sort of environmental
    difference in Windows set-up. I'm running Vista, SP1, I think, within
    NetBeans IDE.

    This code is now a single file SSCCE. Cut, paste, run.


    /*
    * To change this template, choose Tools | Templates
    * and open the template in the editor.
    */

    package socketweirdness;

    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io_OutputStream;
    import java.io.PrintStream;
    import java.net.ServerSocket;
    import java.net.Socket;


    public class Main {

    static final int DEFAULT_PORT = 1099;

    /**
    * @param args the command line arguments
    */
    public static void main( final String[] args) throws
    InterruptedException {
    ServerThread st = new ServerThread( args );
    st.start();
    Thread.sleep( 500 ); // wait a bit for server to start
    Client.main( args );
    }
    static class ServerThread extends Thread
    {
    private final String [] args;
    ServerThread( final String[] args ) {
    this.args = args;
    }
    @Override
    public void run() {
    Server.main( args );
    }
    }

    }

    //import java.io.*;
    //import java.net.ServerSocket;
    //import java.net.Socket;

    //public class Server
    class Server {

    private ServerSocket serverSocket;
    private BufferedReader bufferedReader;

    public Server(int port) throws java.io.IOException {
    serverSocket = new ServerSocket(port);
    }

    /**
    * serviceClient accepts a client connection and reads lines from
    the socket.
    * Each line is handed to executeCommand for parsing and
    execution.
    */
    public void serviceClient() throws java.io.IOException {
    System.out.println("Accepting clients now");
    Socket clientConnection = serverSocket.accept();
    // Arrange to read input from the Socket
    InputStream inputStream = clientConnection.getInputStream();
    bufferedReader = new BufferedReader(new InputStreamReader
    (inputStream));
    // Arrange to write result across Socket back to client
    OutputStream outputStream = clientConnection.getOutputStream
    ();
    PrintStream printStream = new PrintStream(outputStream);

    System.out.println("Client acquired on port #" +
    serverSocket.getLocalPort() + ", reading from socket");

    String commandLine;
    while ((commandLine = bufferedReader.readLine()) != null) {
    try {
    System.out.println(commandLine);
    } catch (Exception ex) {
    System.out.println("ERROR: " + ex);
    }
    }
    }


    public static void main(String argv[]) {
    int port = Main.DEFAULT_PORT;
    if (argv.length > 0) {
    try {
    port = Integer.parseInt(argv[0]);
    } catch (Exception e) {
    }
    }
    try {
    Server server = new Server(port);
    server.serviceClient();
    System.out.println("Client serviced");
    } catch (Exception ex) {
    ex.printStackTrace();
    }
    }
    }




    //Client.java:

    //public class Client {
    class Client {
    public static void main(String[] args) {
    try {
    String host = "localhost";
    int port = Main.DEFAULT_PORT;
    if( args.length >= 2 ) {
    // parse command line arguments
    host = args[0];
    port = Integer.parseInt(args[1]);
    }
    SocketWriter sw = new SocketWriter(host, port);
    sw.sayHi();
    } catch (Exception ae) {
    System.out.println("An exception occurred");
    ae.printStackTrace();
    }
    }
    }



    //SocketWriter.java:

    //import java.io.*;
    //import java.net.Socket;

    class SocketWriter {


    private Socket socket;
    private PrintStream printStream;
    private BufferedReader inputReader;


    SocketWriter(String host, int port) throws java.io.IOException {
    socket = new Socket(host, port);
    OutputStream outputStream = socket.getOutputStream();
    printStream = new PrintStream(outputStream);
    InputStream inputStream = socket.getInputStream();
    InputStreamReader inputStreamReader = new InputStreamReader
    (inputStream);
    inputReader = new BufferedReader(inputStreamReader);
    }

    void sayHi() {
    printStream.println("Hi");
    }
    }
     
    Mark Space, Dec 27, 2008
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. rajatag

    Sockets - Mass Disconnects

    rajatag, Jan 14, 2006, in forum: Java
    Replies:
    4
    Views:
    307
    rajatag
    Feb 2, 2006
  2. Manjesh Gowda
    Replies:
    2
    Views:
    398
    Howard
    Sep 2, 2004
  3. Mr. SweatyFinger
    Replies:
    2
    Views:
    2,076
    Smokey Grindel
    Dec 2, 2006
  4. Boris Nikolaevich

    Finish execution of ASP script when client disconnects

    Boris Nikolaevich, Sep 3, 2003, in forum: ASP General
    Replies:
    4
    Views:
    171
    Michael D. Kersey
    Sep 4, 2003
  5. Gary
    Replies:
    0
    Views:
    196
Loading...

Share This Page