What is the functionality of setSoTimeout and how it works?
JavaNetworkingConnectionJava Problem Overview
I'm trying to learn Socket by myself. I'm little bit confused by following text from Oracle website. I have some questions regarding that. Thanks in advance for any clear explanation.
> setSoTimeout
> 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 > 0. A timeout of zero is interpreted as an infinite timeout.
-
What is SO_TIMEOUT?
-
Socket is the endpoint of a connection. If I say
mySocket.setSoTimeout(2000);
Does it mean that I'm blocking reading any input from the Server/Client for this socket for 2000 millisecond and after this time the socket is ready to read data?
-
What does it mean timeout expire?
-
What is the option which must be enabled prior to blocking operation?
-
Infinite Timeout means that the socket does't read anymore?
Java Solutions
Solution 1 - Java
> Does it mean that I'm blocking reading any input from the Server/Client for this socket for 2000 millisecond and after this time the socket is ready to read data?
No, it means that if no data arrives within 2000ms a SocketTimeoutException
will be thrown.
> What does it mean timeout expire?
It means the 2000ms (in your case) elapses without any data arriving.
> What is the option which must be enabled prior to blocking operation?
There isn't one that 'must be' enabled. If you mean 'may be enabled', this is one of them.
> Infinite Timeout menas that the socket does't read anymore?
What a strange suggestion. It means that if no data ever arrives you will block in the read forever.
Solution 2 - Java
The JavaDoc explains it very well: > 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 > 0. A timeout of zero > is interpreted as an infinite timeout.
SO_TIMEOUT
is the timeout that a read()
call will block. If the timeout is reached, a java.net.SocketTimeoutException will be thrown. If you want to block forever put this option to zero (the default value), then the read()
call will block until at least 1 byte could be read.
Solution 3 - Java
This example made everything clear for me:
As you can see setSoTimeout prevent the program to hang! It wait for SO_TIMEOUT
time! if it does not get any signal it throw exception! It means that time expired!
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;
public class SocketTest extends Thread {
private ServerSocket serverSocket;
public SocketTest() throws IOException {
serverSocket = new ServerSocket(8008);
serverSocket.setSoTimeout(10000);
}
public void run() {
while (true) {
try {
System.out.println("Waiting for client on port " + serverSocket.getLocalPort() + "...");
Socket client = serverSocket.accept();
System.out.println("Just connected to " + client.getRemoteSocketAddress());
client.close();
} catch (SocketTimeoutException s) {
System.out.println("Socket timed out!");
break;
} catch (IOException e) {
e.printStackTrace();
break;
}
}
}
public static void main(String[] args) {
try {
Thread t = new SocketTest();
t.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}