2012-09-11 10 views
17

trzeba utworzyć 10 sekund czas oczekiwania na tej części koduDodawanie timeout DatagramSocket - odbiór()

DatagramPacket getack = nowy DatagramPacket (przychodzący, incoming.length);
socket.receive (getack);

muszę go na liście dla pakietów przychodzących do 10s, jeśli otrzyma paczkę przed 10s byłoby przejść do if w przypadku osiągnie 10s byłoby skoczyć do innego i ponownie wysłać paczkę. Czy to możliwe i jak mogę to zrobić całkiem nowatorsko.

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) { 

    } 

} 

Odpowiedz

31

To powinno zadziałać na twój przykład.

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... 
} 
+0

Hm Patrzyłem na to, ale zastanawiałem się, czy to będzie działać jak miałem na myśli. Czy zadziała to w zasadzie, jeśli coś zostanie odebrane przed 10-krotnym pominięciem, jeśli i po osiągnięciu limitu czasu, to przejdź do innego? –

+0

Też umieściłem to przed lub po getack = DatagramPacket(); –

+0

@kellax Dokonałem edycji mojego wpisu. Musisz ustawić limit czasu przed wywołaniem odbioru. – sebastian

0
socket.setSoTimeout(10000); 
socket.receive(getack); 
socket.setSoTimeout(0); 
+1

Małe wyjaśnienie dla OP byłoby dobre! – Rizier123

+1

@ Rizier123: Nie mówię dobrze po angielsku (jestem z Polski), więc podałem tylko kod. To może być użyte zamiast tego samego "socket.receive (getack);". –