2012-09-11 33 views
17

我需要在這部分代碼創建10秒的超時添加超時的DatagramSocket - 接收()

DatagramPacket的getack =新的DatagramPacket(傳入,incoming.length);
socket.receive(getack);

我需要它,如果它10S之前接收到數據包爲10秒進入的數據包上市if語句的情況下,達到10秒它會跳下到別的,然後重新發送數據包,將跳過了。這是可能的嗎?我怎麼能做到這一點我很新。

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

    } 

} 

回答

31

這應該適用於您的示例。

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

嗯我看着這一點,但我不知道這是否會工作像我的意思。這將工作的原則,如果10秒前收到的東西跳到如果,如果超時已達到然後跳到其他? –

+0

另外,我也把這個之前或之後getack = DatagramPacket(); –

+0

@kellax我編輯了我的文章。您必須在調用接收之前設置超時。 – sebastian

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

對OP的一點解釋會很好! – Rizier123

+1

@ Rizier123:我不會說英語很好(我來自波蘭語),所以我只給了代碼。這可以用來代替'socket.receive(getack);'。 –