set timeout for socket receive

48,539

Solution 1

You can try this. Change the timeout of the socket as required in your scenario! This code will send a message and then wait to receive messages until the timeout is reached!

DatagramSocket s;

    try {
        s = new DatagramSocket();
        byte[] buf = new byte[1000];
        DatagramPacket dp = new DatagramPacket(buf, buf.length);
        InetAddress hostAddress = InetAddress.getByName("localhost");

        String outString = "Say hi";        // message to send
        buf = outString.getBytes();

        DatagramPacket out = new DatagramPacket(buf, buf.length, hostAddress, 9999);
        s.send(out);        // send to the server

        s.setSoTimeout(1000);   // set the timeout in millisecounds.

        while(true){        // recieve data until timeout
            try {
                s.receive(dp);
                String rcvd = "rcvd from " + dp.getAddress() + ", " + dp.getPort() + ": "+ new String(dp.getData(), 0, dp.getLength());
                System.out.println(rcvd);
            }
            catch (SocketTimeoutException e) {
                // timeout exception.
                System.out.println("Timeout reached!!! " + e);
                s.close();
            }
        }

    } catch (SocketException e1) {
        // TODO Auto-generated catch block
        //e1.printStackTrace();
        System.out.println("Socket closed " + e1);

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

Solution 2

If you are using DatagramSocket, or Socket you can use,

socket.setSoTimeout(1000); 
//the value is in milliseconds

For any detail, you should've taken a look in DatagramSocket javadoc or Socket javadoc.

Solution 3

To clarify EJP's comment, this is what he meant by a "missing break" causing a SocketException.

String group = "224.0.0.0";
int port = 5000;

MulticastSocket recvSock = new MulticastSocket(port);
recvSock.joinGroup(InetAddress.getByName(group));
recvSock.setSoTimeout(1000);

while(true) {
    try {
        recvSock.receive(in);               
    } catch (SocketTimeoutException e) {
        break;  // Closing here would cause a SocketException
    }
}

// Move the close() outside the try catch bloock
recvSock.leaveGroup(InetAddress.getByName(group));
recvSock.close();
Share:
48,539
Артём Царионов
Author by

Артём Царионов

Updated on July 05, 2022

Comments

  • Артём Царионов
    Артём Царионов almost 2 years

    I want to send data to server, then wait for an answer for one minute and then close the socket.

    How to do it?

     DatagramPacket sendpack = new ......;
     socket.send(pack);
     DatagramPacket recievepack = new .....;
     //wait 1 minute{
     socket.recieve(buf);
     //wait 1 minute}
     socket.close();