2012-04-07 16 views
9

मैं सर्वर पर डेटा भेजना चाहता हूं, फिर एक मिनट के लिए उत्तर का इंतजार करें और फिर सॉकेट बंद करें।सॉकेट के लिए सेट टाइमआउट

यह कैसे करें?

DatagramPacket sendpack = new ......; 
socket.send(pack); 
DatagramPacket recievepack = new .....; 
//wait 1 minute{ 
socket.recieve(buf); 
//wait 1 minute} 
socket.close(); 
+0

क्या आपको सॉकेट पर एक मिनट या डेटा उपलब्ध होने की प्रतीक्षा करनी है? यदि आप पूरे मिनट का इंतजार करना चाहते हैं, तो मैं नींद या नींद का काम करूंगा। ये जारी रखने से पहले समाप्त होने की अवधि के लिए होगा। यदि आप डेटा की प्रतीक्षा कर रहे हैं, तो मैं चुनिंदा फ़ंक्शन देखता हूं, जो आपको डेटा आने या समय की अवधि समाप्त होने की प्रतीक्षा करने की अनुमति देगा, जो भी पहले आता है। – Glenn

+0

@Glenn नींद एक मिनट तक बर्बाद हो सकती है। यदि डेटा एक सेकंड के बाद आता है तो क्या होगा? आपको लगता है कि पढ़ने के लिए समय * * के लिए * क्या है? – EJP

उत्तर

19

आप इसे आजमा सकते हैं। अपने परिदृश्य में आवश्यक सॉकेट के टाइमआउट को बदलें! यह कोड एक संदेश भेजेगा और फिर टाइमआउट तक पहुंचने तक संदेशों को प्राप्त करने के लिए प्रतीक्षा करें!

DatagramSocket s; 

    try { 
     s = new DatagramSocket(); 
     byte[] buf = new byte[1000]; 
     DatagramPacket dp = new DatagramPacket(buf, buf.length); 
     InetAddress hostAddress = InetAddress.getByName("localhost"); 

     String outString = "Say hi";  // message to send 
     buf = outString.getBytes(); 

     DatagramPacket out = new DatagramPacket(buf, buf.length, hostAddress, 9999); 
     s.send(out);  // send to the server 

     s.setSoTimeout(1000); // set the timeout in millisecounds. 

     while(true){  // recieve data until timeout 
      try { 
       s.receive(dp); 
       String rcvd = "rcvd from " + dp.getAddress() + ", " + dp.getPort() + ": "+ new String(dp.getData(), 0, dp.getLength()); 
       System.out.println(rcvd); 
      } 
      catch (SocketTimeoutException e) { 
       // timeout exception. 
       System.out.println("Timeout reached!!! " + e); 
       s.close(); 
      } 
     } 

    } catch (SocketException e1) { 
     // TODO Auto-generated catch block 
     //e1.printStackTrace(); 
     System.out.println("Socket closed " + e1); 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
+0

एक सेकंड पढ़ने के लिए एक सेकंड बहुत छोटा है। गायब 'ब्रेक' की वजह से यह कोड 'सॉकेट अपवाद: सॉकेट बंद' फेंक देगा जैसे ही टाइमआउट होता है। सभी 'सॉकेटएक्सप्शन' का मतलब सॉकेट बंद नहीं है। – EJP

8

आप DatagramSocket उपयोग कर रहे हैं, या Socket आप उपयोग कर सकते हैं,

socket.setSoTimeout(1000); 
//the value is in milliseconds 

कोई विस्तृत व्याख्या के लिए, आप DatagramSocket javadoc या Socket javadoc में एक नज़र लिया है चाहिए।

+1

'सॉकेट.सेटसोटाइमआउट 'भी मौजूद है। – EJP

+0

@EJP, धन्यवाद। जवाब सही किया। – shibli049

1

ईजेपी की टिप्पणी को स्पष्ट करने के लिए, इसका मतलब है कि वह "गायब break" सॉकेट अपवाद के कारण होता है।

String group = "224.0.0.0"; 
int port = 5000; 

MulticastSocket recvSock = new MulticastSocket(port); 
recvSock.joinGroup(InetAddress.getByName(group)); 
recvSock.setSoTimeout(1000); 

while(true) { 
    try { 
     recvSock.receive(in);    
    } catch (SocketTimeoutException e) { 
     break; // Closing here would cause a SocketException 
    } 
} 

// Move the close() outside the try catch bloock 
recvSock.leaveGroup(InetAddress.getByName(group)); 
recvSock.close();