简体   繁体   中英

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?

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM