web-dev-qa-db-fra.com

définir le délai d'attente pour la réception d'un socket

Je souhaite envoyer des données au serveur, puis attendre une réponse pendant une minute, puis fermer le socket.

Comment faire?

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

Vous pouvez essayer ça. Modifiez le délai d'attente du socket comme requis dans votre scénario! Ce code enverra un message et attendra de recevoir des messages jusqu'à ce que le délai est atteint!

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();
    }
21
Future2020

Si vous utilisez DatagramSocket ou Socket vous pouvez utiliser, 

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

Pour tout détail, vous devriez avoir jeté un œil dans DatagramSocket javadoc ou Socket javadoc .

8
shibli049

Pour clarifier le commentaire d'EJP, c'est ce qu'il entendait par "un breakname__" manquant, provoquant une 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();
1
Th3Gavst3r