Good Day,
I have a Java Servlet where I actually need to send a TCP Packet. If the connection is opened, I can send the data successfully..
However, if it does need to timeout, it never does.
My socket sending code looks like this:
private static String sendMessage(int command,String data,int port,String ip){
try{
String sendString=Integer.toString(command)+":"+data+'$'+'\n';
BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in));
Socket clientSocket = new Socket(ip, port);
clientSocket.setSoTimeout(30000);
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
outToServer.writeBytes(sendString);
String rcvString = inFromServer.readLine();
System.out.println("FROM DEVICE: " + rcvString);
clientSocket.close();
return rcvString;
}catch(Exception e){
System.err.println(e.getMessage());
}
return NULL;
}
As you can see, I set the timeout to 30s. However, it takes almost 80s to timeout. Sometimes it takes 60s. It keeps varying. I set the timeout to 10s and it still takes as long. It's as if that function is not working at all. What gives!? Is it a threading issue?
You are setting the timeout after the connect.
Try this:
private static String sendMessage(int command,String data,int port,String ip){
try{
String sendString=Integer.toString(command)+":"+data+'$'+'\n';
BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in));
// Socket clientSocket = new Socket(ip, port);
// clientSocket.setSoTimeout(30000);
Socket clientSocket = new Socket();
InetAddress addr = InetAddress.getByName(ip);
SocketAddress sockaddr = new InetSocketAddress(addr, port);
clientSocket.connect(sockaddr, 20000); // 20 seconds time out
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
outToServer.writeBytes(sendString);
String rcvString = inFromServer.readLine();
System.out.println("FROM DEVICE: " + rcvString);
clientSocket.close();
return rcvString;
}catch(Exception e){
System.err.println(e.getMessage());
}
return NULL;
}