it-swarm.com.de

Hinzufügen eines Timeouts zu DatagramSocket - receive ()

Ich muss für diesen Teil des Codes ein Timeout von 10 Sekunden erstellen

DatagramPacket getack = new DatagramPacket (incoming, incoming.length);
socket.receive (getack);

Ich brauche es, um für 10s ankommende Pakete aufzulisten, wenn es ein Paket vor 10s erhält, springt es ab, wenn die Anweisung 10s erreicht, wenn es 10s erreicht, würde es zu einem anderen Sprung springen und das Paket erneut senden. Ist das möglich und wie könnte ich das machen?.

private static void sendDATA() {
    outgoing = new byte[512]; // Empty array
    try {
        ByteBuffer sDATA = ByteBuffer.allocate(516);
        // 512 - 2 byte opcode, 2 byte block #, 512 data

        DatagramPacket data = new DatagramPacket(outgoing, outgoing.length, InetAddress.getByName(clientip), clientport);
        InputStream fis = new FileInputStream(new File(FILE));

        int a;
        int block = 1; 

        while((a = fis.read(outgoing,0,512)) != -1)
        {
            data.setLength(a);
            sDATA.put((byte)3);
            sDATA.put((byte)block);
            sDATA.put(outgoing);
            socket.send(data); 

            while(true) {
                DatagramPacket getack = new DatagramPacket(incoming, incoming.length);
                socket.receive(getack);

                if(incoming[0] == 3 && incoming[1] == block) {
                    break;
                } else {
                    socket.send(data);
                }
            }

        }       
    } catch (Exception e) {

    }

}
19

Das sollte für dein Beispiel funktionieren.

socket.setSoTimeout(10000);
while(true) {
    DatagramPacket getack = new DatagramPacket(incoming, incoming.length);
    try {
        socket.receive(getack);
    } catch (SocketTimeoutException e) {
       // resend
       socket.send(data);
       continue;
    }
    // check received data...
}
35
sebastian
socket.setSoTimeout(10000);
socket.receive(getack);
socket.setSoTimeout(0);
0
Bartosz Konkol