2010-01-05 14 views
7

मेरा चैट एप्लिकेशन किसी सर्वर से कनेक्ट होता है और जानकारी उपयोगकर्ता द्वारा भेजी जाती है/प्राप्त की जाती है। जब कनेक्शन बदलता है, जैसे कि 3 जी-> वाईफाई, वाईफाई-> 3 जी, डेटा कनेक्शन खोना आदि, socket कभी-कभी डिस्कनेक्ट करने से पहले उम्र के लिए जुड़ा रहता है। इस समय के दौरान, यह कहना असंभव है कि कनेक्शन अभी भी सक्रिय है या नहीं, ऐसा लगता है जैसे संदेशों को ठीक से भेजा जा रहा है। अन्य बार, एक संदेश भेजते समय, यह एक आईओ त्रुटि फेंक देगा और डिस्कनेक्ट होगा।कनेक्टिविटी में परिवर्तन होने पर सॉकेट डिस्कनेक्ट नहीं होता

कनेक्शन परिवर्तनों का पता लगाने और उचित रूप से पुन: कनेक्ट करने के लिए कोड को लागू करने के अलावा, क्या कनेक्टिविटी में परिवर्तन होने पर सॉकेट तुरंत आईओ अपवाद फेंकना संभव है?

संपादित करें:

Socket sock = new Socket(); 
sock.connect(new InetSocketAddress(getAddress(), getPort())), getTimeout()); 
//get bufferedReader and read until BufferedReader#readLine() returns null 

मैं setSoTimeout का उपयोग नहीं के रूप में डेटा दूरस्थ सर्वर के विन्यास पर निर्भर समय की लंबी अवधि के लिए स्थानांतरित नहीं किया जा सकता है: मैं निम्नलिखित कोड का उपयोग कर जोड़ने हूँ।

+0

फिर http://stackoverflow.com/questions/969866/java-detect-lost-connection http://stackoverflow.com देखें/प्रश्न/155,243/क्यों है यह असंभव-बिना-प्रयास कर-कब करने वाली का पता लगाने-कि-टीसीपी-सॉकेट-था-अनुग्रह –

उत्तर

1

क्या आप java.net.Socket कनेक्शन के बारे में बात कर रहे हैं? फिर setSoTimeout() आज़माएं। अन्यथा निर्दिष्ट करें कि आप कैसे कनेक्ट कर रहे हैं।

0

यह एक पुरानी समस्या है जिसे मैंने डेटाबेस दुनिया में कुछ बार पहले देखा है।

मैं जिस समाधान का उपयोग करता था वह अनुप्रयोग स्तर पर कनेक्शन का प्रबंधन करना था। मैं स्पष्ट रूप से एक पिंग के रूप में कनेक्शन पर किसी भी प्रकार (यानी SELECT 1 WHERE FALSE) के किसी भी प्रकार का नो-ऑप संदेश भेजता हूं, और यदि यह असफल हो जाता है तो मैं कनेक्शन को फाड़ और फिर से स्थापित कर दूंगा, संभवतः एक फेलओवर सर्वर पर मूल कनेक्शन स्वीकार नहीं कर रहा था।

0

जैसा कि पिछले उत्तर पहले ही बताए गए हैं, यह एक आम समस्या है। एक कस्टम "पिंग" भेजने के बाद भी इसे कुछ समय की आवश्यकता हो सकती है जब तक कि सॉकेट को यह महसूस न हो कि अंतर्निहित कनेक्शन टूटा हुआ है। इसके अलावा, नियमित पूंछ उनकी पूंछ राज्यों के कारण, 3-4 जी मोबाइल नेटवर्क का उपयोग करके काफी ऊर्जा मांग कर रहे हैं। ऐसा मत करो!

हालांकि, आप क्या कर सकते हैं, requesting to get informed when the connectivity changes (last section) है, और प्रसारण रिसीवर के अनुसार सॉकेट को मैन्युअल रूप से बंद/पुनः कनेक्ट करें। (संपादित करें: मुझे लगता है कि आप पहले से ही इस बारे में पता लगा चुके हैं; इसे पूर्णता के लिए यहां रखते हुए)

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