Search code examples
javasocketsservletstcp

Java TCP Socket not timing out (called in a Servlet)


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?


Solution

  • 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;
     }