2012-09-11 6 views
17

मैं कोड के इस हिस्से पर एक 10 सेकंड का समय समाप्त बनाने की जरूरतDatagramSocket को टाइमआउट जोड़ना - (प्राप्त)

datagrampacket getack = नए datagrampacket (आवक, incoming.length);
सॉकेट.रेसीव (गेटैक);

मैं अगर यह 10s से पहले एक पैकेट प्राप्त करता 10s के लिए आने वाले पैकेट के लिए सूचीबद्ध करने के लिए इसकी आवश्यकता है यह करने के लिए नीचे छोड़ होता अगर बयान मामले में यह यह किसी के लिए नीचे कूद और पैकेट को पुन: भेजने होगा 10s तक पहुँचता है। क्या यह संभव है और मैं यह कैसे कर सकता हूं Iam इस पर बहुत नया है।

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

ओपी के लिए थोड़ा सा स्पष्टीकरण अच्छा होगा! – Rizier123

+1

@ रिज़ियर 123: मैं अच्छी अंग्रेजी नहीं बोलता (मैं पोलिश से हूं), इसलिए मैंने केवल कोड दिया। इसका उपयोग 'socket.receive (getack) के बजाय किया जा सकता है;'। –

संबंधित मुद्दे