java.net.SocketException: Connection reset

964,811

Solution 1

There are several possible causes.

  1. The other end has deliberately reset the connection, in a way which I will not document here. It is rare, and generally incorrect, for application software to do this, but it is not unknown for commercial software.

  2. More commonly, it is caused by writing to a connection that the other end has already closed normally. In other words an application protocol error.

  3. It can also be caused by closing a socket when there is unread data in the socket receive buffer.

  4. In Windows, 'software caused connection abort', which is not the same as 'connection reset', is caused by network problems sending from your end. There's a Microsoft knowledge base article about this.

Solution 2

Connection reset simply means that a TCP RST was received. This happens when your peer receives data that it can't process, and there can be various reasons for that.

The simplest is when you close the socket, and then write more data on the output stream. By closing the socket, you told your peer that you are done talking, and it can forget about your connection. When you send more data on that stream anyway, the peer rejects it with an RST to let you know it isn't listening.

In other cases, an intervening firewall or even the remote host itself might "forget" about your TCP connection. This could happen if you don't send any data for a long time (2 hours is a common time-out), or because the peer was rebooted and lost its information about active connections. Sending data on one of these defunct connections will cause a RST too.


Update in response to additional information:

Take a close look at your handling of the SocketTimeoutException. This exception is raised if the configured timeout is exceeded while blocked on a socket operation. The state of the socket itself is not changed when this exception is thrown, but if your exception handler closes the socket, and then tries to write to it, you'll be in a connection reset condition. setSoTimeout() is meant to give you a clean way to break out of a read() operation that might otherwise block forever, without doing dirty things like closing the socket from another thread.

Solution 3

Whenever I have had odd issues like this, I usually sit down with a tool like WireShark and look at the raw data being passed back and forth. You might be surprised where things are being disconnected, and you are only being notified when you try and read.

Solution 4

You should inspect full trace very carefully,

I've a server socket application and fixed a java.net.SocketException: Connection reset case.

In my case it happens while reading from a clientSocket Socket object which is closed its connection because of some reason. (Network lost,firewall or application crash or intended close)

Actually I was re-establishing connection when I got an error while reading from this Socket object.

Socket clientSocket = ServerSocket.accept();
is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
int readed = is.read(); // WHERE ERROR STARTS !!!

The interesting thing is for my JAVA Socket if a client connects to my ServerSocket and close its connection without sending anything is.read() is being called repeatedly.It seems because of being in an infinite while loop for reading from this socket you try to read from a closed connection. If you use something like below for read operation;

while(true)
{
  Receive();
}

Then you get a stackTrace something like below on and on

java.net.SocketException: Socket is closed
    at java.net.ServerSocket.accept(ServerSocket.java:494)

What I did is just closing ServerSocket and renewing my connection and waiting for further incoming client connections

String Receive() throws Exception
{
try {                   
            int readed = is.read();
           ....
}catch(Exception e)
{
        tryReConnect();
        logit(); //etc
}


//...
}

This reestablises my connection for unknown client socket losts

private void tryReConnect()
        {
            try
            {
                ServerSocket.close();
                //empty my old lost connection and let it get by garbage col. immediately 
                clientSocket=null;
                System.gc();
                //Wait a new client Socket connection and address this to my local variable
                clientSocket= ServerSocket.accept(); // Waiting for another Connection
                System.out.println("Connection established...");
            }catch (Exception e) {
                String message="ReConnect not successful "+e.getMessage();
                logit();//etc...
            }
        }

I couldn't find another way because as you see from below image you can't understand whether connection is lost or not without a try and catch ,because everything seems right . I got this snapshot while I was getting Connection reset continuously.

enter image description here

Solution 5

Embarrassing to say it, but when I had this problem, it was simply a mistake that I was closing the connection before I read all the data. In cases with small strings being returned, it worked, but that was probably due to the whole response was buffered, before I closed it.

In cases of longer amounts of text being returned, the exception was thrown, since more then a buffer was coming back.

You might check for this oversight. Remember opening a URL is like a file, be sure to close it (release the connection) once it has been fully read.

Share:
964,811

Related videos on Youtube

bluish
Author by

bluish

I'm here to learn and to improve help retrieval about IT. #SOreadytohelp You can contact me at rumoreblu snail gmail dot com ;)

Updated on February 23, 2022

Comments

  • bluish
    bluish about 2 years

    I am getting the following error trying to read from a socket. I'm doing a readInt() on that InputStream, and I am getting this error. Perusing the documentation this suggests that the client part of the connection closed the connection. In this scenario, I am the server.

    I have access to the client log files and it is not closing the connection, and in fact its log files suggest I am closing the connection. So does anybody have an idea why this is happening? What else to check for? Does this arise when there are local resources that are perhaps reaching thresholds?


    I do note that I have the following line:

    socket.setSoTimeout(10000);
    

    just prior to the readInt(). There is a reason for this (long story), but just curious, are there circumstances under which this might lead to the indicated error? I have the server running in my IDE, and I happened to leave my IDE stuck on a breakpoint, and I then noticed the exact same errors begin appearing in my own logs in my IDE.

    Anyway, just mentioning it, hopefully not a red herring. :-(

    • Stu Thompson
      Stu Thompson over 15 years
      Do you have stack traces from both sides? Can you describe the network architecture a bit more? (Over the wild Internet? On the same machine? Somewhere in between?) Does it happen all the time? Or intermittently?
    • Raedwald
      Raedwald over 5 years
    • Florian-Martin
      Florian-Martin over 3 years
      I've had the same problem using WAMP, but fixed it working on a remote server.
    • Sm Srikanth
      Sm Srikanth about 2 years
      Generally, I am asking, can a SQL password expire result in this problem?
  • user207421
    user207421 almost 12 years
    @MattLyons Thanks. There are much better MSDN articles than that. Frankly I find that one hard to believe. A connection won't even exist until the correct source and target IP addresses have been established. The MSDN articles I have seen refer to persistent network errors timing out the connection.
  • user207421
    user207421 almost 12 years
    That would not cause this exception on its own.
  • user207421
    user207421 over 11 years
    Not correct in several respects. Garbage collection and process exits both cause proper closes, not resets, but a close followed by a write by the peer can induce a reset rather than an EOS. SocketTimeoutExceptions are only raised if the reader has set a read timeout.
  • Dean Hiller
    Dean Hiller over 11 years
    it would if System.exit(0) kills the program and no one calls socket.close() as the connection is in a bad state and was not closed properly. sooo more properly said he had a client program that shutdown without closing sockets ;) which is a bad thing and should be fixed.
  • user207421
    user207421 over 10 years
    @DeanHiller No it wouldn't. The operating system would close the socket the same way the application should have.
  • Dean Hiller
    Dean Hiller over 10 years
    @EJP ....I am not sure...I just know we could reproduce it with System.exit but I don't remember the OS/config as that was quite some time ago....calling socket.close() on the server prevented connection reset and it behaved more properly.
  • user207421
    user207421 almost 10 years
    @DeanHiller The reading process exited before the writing process had finished writing.
  • user207421
    user207421 about 7 years
    And it doesn't always mean an RST was received. It can also mean one was generated by this side.
  • Umer Farooq
    Umer Farooq over 5 years
    Yup ! i added sleep(5000) at end of my my client program and figure out that connection reset exception occurred after 5 secs at server side. Which mean my client program was closing before server program and was causing socket exception
  • user207421
    user207421 almost 5 years
    @UmerFarooq Nope. Sleeps don't fix network code. They only hide bugs. Closing the socket before the peer has finished reading does not cause this error.
  • karl li
    karl li almost 4 years
    many thanks, you show me a new direction to fix my issue. and finally I found it is the case!!!
  • user207421
    user207421 over 3 years
    And you can't write to a socket that you have already closed. You will get a SocketException: socket closed, and the peer will not get an RST. Answer is completely incorrect.
  • user207421
    user207421 over 3 years
    SSL protocol mismatches do not cause connection resets. They cause handshake failures.
  • user207421
    user207421 over 3 years
    SSL certificates do not cause connection resets.
  • Davut Gürbüz
    Davut Gürbüz over 3 years
    @MarquisofLorne yes correct, that's why that routine is in another while loop.
  • Davut Gürbüz
    Davut Gürbüz over 3 years
    @MarquisofLorne I noticed after reading my own answer it needed to be 'is being called repeatedly'. Thanks for pointing out. 5y ago :). I improved it now actually, based on reading -1, timeout exception etc. added. Ungraceful connection drops are still problem, there are different inactivity management methods people follow.
  • user207421
    user207421 about 3 years
    There is nothing about OutOfMemoryError in the question.
  • zanderwar
    zanderwar about 3 years
    Given your first 3 points, this would be interesting for you to see a decade later
  • user207421
    user207421 about 3 years
    @zanderwar Thanks. Plagiarism abounding over there.
  • Pino
    Pino about 3 years
    Yes, I know, I didn't say otherwise.