2012-09-11 18 views
17

Necesito crear un segundo tiempo de espera de 10 en esta parte del códigoAdición de tiempo de espera a DatagramSocket - recibir()

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

lo necesito a la lista de los paquetes entrantes para 10s si se recibe un paquete antes de 10 segundos sería pase directamente a si la declaración en el caso de que llegue 10s sería saltar a otra cosa y volver a enviar el paquete. ¿Es esto posible y cómo podría hacer esto? Soy bastante nuevo en esto.

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

    } 

} 

Respuesta

31

Eso debería funcionar para su ejemplo.

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 Miré a eso, pero me preguntaba si eso va a trabajar como yo quería decir. ¿Funcionará esto en el principio de que si se recibe algo antes de los 10s, salte a if y si se alcanza el tiempo de espera, salte a else? –

+0

También pongo esto antes o después de getack = DatagramPacket(); –

+0

@kellax He hecho una edición de mi publicación. Tienes que configurar el tiempo de espera antes de llamar a recibir. – sebastian

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

¡Una pequeña explicación para OP sería buena! – Rizier123

+1

@ Rizier123: No hablo bien el inglés (soy polaco), así que solo di el código. Esto se puede usar en lugar de 'socket.receive (getack);' –

Cuestiones relacionadas