सॉकेट संचालन के लिए एक समय सीमा निर्धारित करना


86

जब मैं एक सॉकेट बनाता हूं:

Socket socket = new Socket(ipAddress, port);

यह एक अपवाद फेंकता है, जो ठीक है, क्योंकि आईपी पता उपलब्ध नहीं है। (परीक्षण चर जहां String ipAddress = "192.168.0.3"और int port = 300।)

समस्या यह है: मैं इसे उस सॉकेट के लिए टाइमआउट करने के लिए कैसे सेट करूं?

जब मैं सॉकेट बनाता हूं, तो मुझे समय से पहले कम करने UnknownHostExceptionऔर सॉकेट को टाइमआउट करने के लिए कैसे कम किया जाए?


10
@adrianboimvaser: उस स्थिति में, आपको एक डुप्लिकेट के रूप में फ़्लैग करना चाहिए, और डुप्लिकेट की ओर इशारा करते हुए एक टिप्पणी छोड़नी चाहिए, इसलिए एक मॉडरेटर इसे इस तरह बंद कर सकता है (आपने एक साल पहले उस टिप्पणी को छोड़ दिया था - शायद आप जानते हैं कि अब तक)। मैं अपना वोट अब करने के लिए डालूंगा, लेकिन मुझे पता नहीं है कि डुप्लिकेट कहां है!
टॉम एंडरसन

1
उत्तर देने की प्रवृत्ति को देर से जारी रखने के लिए, @EJP इस प्रश्न का शीर्षक आपके द्वारा सुझाए गए डुप्लिकेट की तुलना में बहुत कम अस्पष्ट है
इसहाक

@ आईसैक और वास्तव में यह बिल्कुल भी डुप्लिकेट नहीं है, टिप्पणी को वापस लिया गया।
लोर्न

(नोट: मैंने कम अस्पष्ट होने के लिए टट्टी को मोड़ दिया है।)
स्टीफन सी

जवाबों:


165

का प्रयोग करें Socket()निर्माता , और connect(SocketAddress endpoint, int timeout)विधि के बजाय।

आपके मामले में यह कुछ इस तरह दिखेगा:

Socket socket = new Socket();
socket.connect(new InetSocketAddress(ipAddress, port), 1000);

प्रलेखन से उद्धरण

connect

public void connect(SocketAddress endpoint, int timeout) throws IOException

इस सॉकेट को एक निर्दिष्ट टाइमआउट मान के साथ सर्वर से जोड़ता है। शून्य के एक टाइमआउट को एक अनंत टाइमआउट के रूप में व्याख्या की जाती है। कनेक्शन तब तक ब्लॉक रहेगा जब तक कि कोई त्रुटि नहीं होती है।

पैरामीटर:

endpoint- सॉकेटएड्रेस
timeout- मिलीसेकंड में उपयोग किए जाने वाले टाइमआउट मूल्य।

फेंकता:

IOException- अगर कनेक्शन के दौरान कोई त्रुटि होती है
SocketTimeoutException- यदि कनेक्ट होने से पहले समय समाप्त हो जाता है
IllegalBlockingModeException- यदि इस सॉकेट में एक संबद्ध चैनल है, और चैनल गैर-अवरोधक मोड में है
IllegalArgumentException- यदि समापन बिंदु शून्य है या सॉकेट है तो सॉकेट द्वारा समर्थित उपवर्ग नहीं है

चूंकि: 1.4


4
यह ConnectException (लेकिन इसे बढ़ाएं नहीं) के लिए टाइमआउट को कम कर सकता है और इसका अज्ञातHostException के लिए टाइमआउट पर कोई प्रभाव नहीं पड़ता है, जो ओपी का दावा है कि उसे मिल रहा है (हालांकि मुझे विश्वास नहीं है)। यह भी ध्यान दें कि डिफ़ॉल्ट को अनंत बताते हुए Javadoc गलत है। यह नहीं है। प्लेटफ़ॉर्म में लगभग एक मिनट का डिफ़ॉल्ट समय है, और इसे बढ़ाया नहीं जा सकता।
लोर्ने का मार्किव

3
4 साल बाद भी यह मददगार था, यह स्वीकृत जवाब होना चाहिए।
शार्प एज

4
यह अब 5 साल बाद है और यह इंटरनेट पर मुझे मिला सबसे अच्छा जवाब है। धन्यवाद
MBH

1
socket.setSoTimeout(timeoutMillis)IO ऑपरेशंस को ब्लॉक करने के दौरान टाइमआउट के लिए कॉल करना भी महत्वपूर्ण है ।
ग्रे

43

आप सॉकेट के लिए टाइमआउट सेट नहीं करते हैं, आप उस सॉकेट पर आपके द्वारा किए जाने वाले ऑपरेशन के लिए टाइमआउट सेट करते हैं।

उदाहरण के लिए socket.connect(otherAddress, timeout)

या संचालन socket.setSoTimeout(timeout)पर एक समय सीमा निर्धारित करने के लिए read()

देखें: http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html


खैर, इस मामले में यह एक ऑपरेशन भी है, कनेक्ट करना। मुझे ऐसा कोई स्थान नहीं मिला है जिसमें कहा गया हो कि यह ctor एक असीम मध्यांतर का उपयोग करता है, हालाँकि ऐसा प्रतीत होता है।
सैंडोस

3
@ सांडोस यह स्पष्ट रूप से जावदोक में कनेक्ट () के लिए कहा गया है। हालाँकि यह भी गलत है। डिफ़ॉल्ट टाइमआउट प्लेटफ़ॉर्म टाइमआउट है, एक मिनट के आसपास, अनन्तता नहीं, और यह केवल इस कनेक्ट () विधि से कम किया जा सकता है, बढ़ा नहीं।
लोर्ने का मार्किस

ध्यान दें, socket.setSoTimeoutAFTER कहा जाना चाहिए connect, या इसका कोई प्रभाव नहीं होगा और पढ़ता है कि कभी भी समय समाप्त नहीं होगा। यह एक खराब दस्तावेज है।
pstanton

19

आप निम्नलिखित समाधान का उपयोग कर सकते हैं:

SocketAddress sockaddr = new InetSocketAddress(ip, port);
// Create your socket
Socket socket = new Socket();
// Connect with 10 s timeout
socket.connect(sockaddr, 10000);

आशा करता हूँ की ये काम करेगा!


1
यदि, जैसा कि वह दावा करता है, उसे एक अज्ञातHostException मिल रही है, यह पहली पंक्ति पर होगा, जहां प्रभाव में कोई संशोधित समयबाह्य नहीं है।
लोर्ने का मार्किस

हालाँकि, पहली पंक्ति में कोई अपवाद नहीं है। प्रलेखन से: "होस्टनाम को एक InetAddress में हल करने का प्रयास किया जाएगा। यदि वह प्रयास विफल हो जाता है, तो पते को अनसुलझे के रूप में चिह्नित किया जाएगा"
ady

किस मामले में यह connect()विधि द्वारा हल किया जाएगा , लेकिन एक टाइमआउट के नियंत्रण में नहीं।
लोर्न

8

के कारण आप टाइमआउट को नियंत्रित नहीं कर सकते UnknownHostException। ये DNS टाइमिंग हैं। आप केवल मान्य होस्ट दिए गए कनेक्ट टाइमआउट को नियंत्रित कर सकते हैं। पूर्ववर्ती उत्तरों में से कोई भी इस बिंदु को सही ढंग से संबोधित नहीं करता है।

लेकिन मुझे यह विश्वास करना मुश्किल है कि UnknownHostExceptionजब आप होस्टनाम के बजाय आईपी एड्रेस निर्दिष्ट करते हैं तो आप वास्तव में मिल रहे हैं ।

EDIT जावा के DNS टाइमआउट को नियंत्रित करने के लिए इस उत्तर को देखें


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.