title: what causes : java.net.SocketException: Connection timed out, Not the SocketTimeoutException
body: <p>This SocketException is thrown in ObjectInputStream.readObject() method, what cause this excetpion? Besides, the values of soTimeout of client and server socket are both 0, and KeepAlive value is false.</p>
  
  <pre><code>{2012-01-09 17:44:13,908} ERROR java.net.SocketException: Connection timed out
   at java.net.SocketInputStream.socketRead0(Native Method)
   at java.net.SocketInputStream.read(SocketInputStream.java:146)
   at sun.security.ssl.InputRecord.readFully(InputRecord.java:312)
   at sun.security.ssl.InputRecord.read(InputRecord.java:350)
   at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:809)
   at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:766)
   at sun.security.ssl.AppInputStream.read(AppInputStream.java:94)
   at sun.security.ssl.AppInputStream.read(AppInputStream.java:69)
   at java.io.ObjectInputStream$PeekInputStream.peek(ObjectInputStream.java:2265)
   at java.io.ObjectInputStream$BlockDataInputStream.peek(ObjectInputStream.java:2558)
   at    java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2568)
  at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1314)
  at java.io.ObjectInputStream.readObject(ObjectInputStream.java:368)
  </code></pre>
  
  <p>From the JAVA API document about the setSoTimeout method, if this method is set a no-zero value, when the times expires, only the  SocketTimeoutException  was thrown, not the SocketException:Connection timed out, so, this exception should not relate with the setSotimeoutMethod.</p>
  
  <pre><code>public void setSoTimeout(int timeout)  throws SocketException
   Enable/disable SO_TIMEOUT with the specified timeout, in milliseconds. With this 
   option set to a non-zero timeout, a read() call on the InputStream associated with 
   this Socket will block for only this amount of time. If the timeout expires, a 
   java.net.SocketTimeoutException is raised, though the Socket is still valid. The 
  option must be enabled prior to entering the blocking operation to have effect. The 
  timeout must be &gt; 0. A timeout of zero is interpreted as an infinite timeout.
  </code></pre>
  
  <p>However, the value returned by PlainSocketImpl(here,is SSLSocketImpl).getTimeout() is transfered by the setSoTimeout() method, then it is still a very strange method.</p>
  
  <pre><code> SocketInputStream.socketRead0(FileDescriptor fd, byte b[], int off, int len, int timeout)  
    the timeout value is passed in the constructor of  SocketInputStream:SocketInputStream(PlainSocketImpl impl) throws IOException {}
    timeout = impl.getTimeout();
  </code></pre>