title: Socket time out after two minutes although set to more than two mintues
body: <p>following <a href="https://stackoverflow.com/questions/12406628/java-socket-read-time-out-exception">this post</a>, I have the same problem and I managed to reproduce it with a simple test cast. I hope that you will be able to help me.</p>
  
  <p>Let me explain, I am sending messages using sockets. Everything is working great as long as I set the so_timeout to be less than two minutes. But if I set it to be more than two minutes the socket is timed out after two minutes. So, if I set the so_timeout to be 10 seconds the socket will be timed out after 10 seconds, but if I set it to be 180 seconds the socket will be timed out after 120 seconds.</p>
  
  <p>Here is a test case:</p>
  
  <pre><code>import java.io.*;
  import java.net.InetSocketAddress;
  import java.net.ServerSocket;
  import java.net.Socket;
  import java.net.SocketTimeoutException;
  
  /**
   *
   */
  public class TestSocket1 {
  
  public static void main(String[] args) throws IOException {
  
      ServerSocket serverSocket = new ServerSocket();
  
      serverSocket.setReuseAddress(true);
      serverSocket.bind(new InetSocketAddress(1111), 0);
      serverSocket.setSoTimeout(1000);
      Socket socket = null;
  
      boolean send = true;
  
      while (send) {
          try {
              socket = serverSocket.accept();
              Thread.sleep(100);
              String messageReceived = readFromSocket(socket);
  
              System.out.println(messageReceived);
  
              if (send) {
                  send = false;
  
                  Thread.sleep(150000); // Causing 2.5 minutes delay
                  // Sending message
  
                  BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF8"));
                  PrintWriter printWriter = new PrintWriter(wr, true);
  
                  String output = "Hello Back";
  
                  printWriter.println(output);
                  printWriter.flush();
                  socket.shutdownOutput();
  
              }
  
          }
          catch (SocketTimeoutException ie) {
          }
          catch (Exception e) {
          }
          finally {
              if (socket != null) {
                  socket.close();
              }
          }
      }
  
  
  }
  
  protected static String readFromSocket(Socket socket) throws IOException {
      StringBuilder messageReceived = new StringBuilder();
      BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
  
      String line = br.readLine();
  
      messageReceived.append(line);
  
      socket.shutdownInput();
  
      return messageReceived.toString();
  }
  
  
  }
  </code></pre>
  
  <hr>
  
  <pre><code>import java.io.*;
  import java.net.InetSocketAddress;
  import java.net.Socket;
  import java.net.SocketAddress;
  
  /**
   *
   */
  public class TestSocket2 {
  
  public static void main(String[] args) throws IOException {
  
      Socket socket = new Socket();
      socket.setKeepAlive(true);
      socket.setReuseAddress(true);
      socket.setTcpNoDelay(true);
      socket.setSoTimeout(180000); // Should wait 3 minutes before throwing time out exception - Actually throwing after 2 minutes
  
      SocketAddress socketAddress = new InetSocketAddress(1111);
  
      socket.connect(socketAddress, 5000);
  
      // Sending message
  
      BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF8"));
      PrintWriter printWriter = new PrintWriter(wr, true);
  
      String output = "Hello There";
  
      printWriter.println(output);
      printWriter.flush();
      socket.shutdownOutput();
  
      String messageReceived = readFromSocket(socket);
  
      System.out.println(messageReceived);
  
  }
  
  protected static String readFromSocket(Socket socket) throws IOException {
      StringBuilder messageReceived = new StringBuilder();
      BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
  
      String line = br.readLine();
  
      messageReceived.append(line);
  
      socket.shutdownInput();
  
      return messageReceived.toString();
  }
  
  
  }
  </code></pre>
  
  <p>You should run the TestSocket1 class first and then TestSocket2.  </p>
  
  <p>I am struggling with this problem for a long time and any help will be appreciated. Thank you. </p>
  
  <ul>
  <li>EDIT</li>
  </ul>
  
  <p>So I removed the dependency on SO_TimeOut and took @Nick suggestion in <a href="https://stackoverflow.com/questions/1306119/setsotimeout-on-a-client-socket-doesnt-affect-the-socket">this post</a> to check the available input stream before reading it. But now the problem is that after two minutes the available bytes always return 0 although the input was written to the stream. So I still have the same problem.</p>