2012-09-11 30 views
17

alma kod bu bölümünde, 10 saniyelik bir zaman aşımı oluşturmak için gerekenDatagramSocket zaman aşımı ekleme -) (

datagram paketleri getack = Yeni datagram paketleri (gelen, incoming.length);
socket.receive (getack);

ben deyim durumunda bunun aşağı başka atlamak ve paket yeniden olurdu 10s ulaşırsa o kadar atlamak o 10s önce bir paket alırsa 10s için gelen paketler için listelenen için buna ihtiyacım var. Bu mümkün mü ve bunu nasıl yapabilirim ki bu konuda oldukça yeni.

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

    } 

} 

cevap

31

Örneğiniz için çalışmalıdır.

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 ben o baktı ama demek gibi bu işe eğer ben merak ediyorum. Bu, 10'lu yaşlardan önce bir şey alındığında, zaman aşımına ulaşılıp ulaşılmadığı ve başka bir yere atlanıp atlanmadığı ilkesiyle çalışacak mı? –

+0

Ayrıca bunu getack = DatagramPacket(); –

+0

@kellax Gönderimime bir düzenleme yaptım. Almayı çağırmadan önce zaman aşımını ayarlamanız gerekir. – sebastian

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

OP için küçük bir açıklama iyi olurdu! – Rizier123

+1

@ Rizier123: İyi İngilizce bilmiyorum (Lehçe'yim), bu yüzden sadece kod verdim. Bu, aynı 'socket.receive (getack)' yerine kullanılabilir. '. –