2012-09-11 33 views
17

tôi cần phải tạo ra một thời gian chờ 10 giây trên phần này của mãThêm thời gian chờ để DatagramSocket - nhận()

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

Tôi cần nó để liệt kê các gói dữ liệu đến 10s nếu nó nhận được gói trước 10 giây nó sẽ bỏ qua nếu câu lệnh trong trường hợp nó đạt đến 10 giây. Điều này có thể và làm thế nào tôi có thể làm điều này iam khá mới này.

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

    } 

} 

Trả lời

31

Điều đó sẽ phù hợp với ví dụ của bạn.

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 i nhìn đó, nhưng tôi đã tự hỏi nếu điều đó sẽ làm việc như tôi có nghĩa. Điều này sẽ làm việc trong nguyên tắc mà nếu một cái gì đó được nhận trước khi 10s bỏ qua để nếu và nếu thời gian chờ đạt được sau đó bỏ qua cho người khác? –

+0

Ngoài ra tôi đặt nó trước hoặc sau getack = DatagramPacket(); –

+0

@kellax Tôi đã chỉnh sửa bài đăng của mình. Bạn phải đặt thời gian chờ trước khi gọi điện. – sebastian

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

Một giải thích nhỏ cho OP sẽ tốt! – Rizier123

+1

@ Rizier123: Tôi không nói tiếng Anh tốt (tôi đến từ Ba Lan), vì vậy tôi chỉ viết mã. Điều này có thể được sử dụng thay cho cùng một 'socket.receive (getack);'. –

Các vấn đề liên quan