2013-02-21 9 views
6

तो, मैंने अपने क्लाइंट साइड पर एक थ्रेड लिखा, जो सॉकेट स्ट्रीम से readObject() पर कोशिश करता है।जावा - readObject() और setSoTimeout()

यह थ्रेड तब तक चलता है जब तक क्लाइंट कनेक्ट नहीं होता है।

सर्वर के कनेक्शन को क्लाइंट के जीयूआई पर बंद किया जा सकता है। यदि ग्राहक "डिस्कनेक्ट" मेनू विकल्प पर क्लिक करके डिस्कनेक्ट करने का निर्णय लेता है (यह क्लाइंट प्रोग्राम से बाहर नहीं निकलता है), सॉकेट बंद हो जाएगा और isConnected गलत पर सेट हो जाएगा।

चूंकि क्लाइंट पढ़ते हैं, थ्रेड स्ट्रीम से readObject() तक प्रयास करता है, जबकि कनेक्शन जीयूआई के माध्यम से बंद किया जा सकता है, मैंने एक टाइमआउट 250ms (setSoTimeout(250)) पर सेट किया है।

@Override 
public void run() 
{ 
    this.connection = this.connectionHandler.getSocket(); 
    while(connectionHandler.isConnected()) 
    { 
    this.readCircle(); 
    } 
    this.connectionHandler.setReadTaskRunning(false); 
} 

private void readCircle() 
{ 
    try 
    { 
    this.connection.setSoTimeout(250); 
    this.connectionHandler.readData(); //this uses readObject(). 
    } 
catch(SocketTimeoutException timeout){} 
catch(...){} 

}

मुझे पता है कि readObject() को अवरुद्ध कर देगा, और अगर ग्राहक अभी भी जुड़ा हुआ है की जाँच करने के, मैं इसे एक while में wraped है, जो (हर समय समाप्त) की जाँच करता है अगर ग्राहक सॉकेट अभी भी जुड़ा हुआ है।

अब मेरा प्रश्न:

मामले में, readObject() शुरू होता है सर्वर द्वारा पारित एक वस्तु पाने के लिए है, यह पढ़ने के लिए कोशिश करता है, लेकिन जब तक प्रसंस्करण समय समाप्त होता है, धारा पर डेटा "क्षतिग्रस्त" हो जाएगा किसी भी तरह से, क्योंकि यह रद्द कर दिया। या मुझे readObject() ब्लॉक देना चाहिए और यदि GUI थ्रेड सॉकेट को बंद करना चाहता है तो अपवाद प्राप्त करें।

मुझे सॉकेट के साथ बहुत अनुभवी नहीं है और शायद मेरा दृष्टिकोण बिल्कुल गलत है।

+1

कनेक्ट किया गया है() सहकर्मी डिस्कनेक्ट होने पर झूठी वापसी नहीं करता है। आपको EOFException को पकड़ना और संभालना है। – EJP

+0

हां आप सही हैं। 'पकड़ो (...) {}' मुझे अपवादों का एक गुच्छा पकड़ना होगा। 'EOFException' पकड़ क्लाइंट पक्ष पर संसाधनों को बंद करने के लिए' बल डिस्कनेक्ट() 'का आह्वान करेगा और समायोजित करेगा उपयोगकर्ता के लिए जीयूआई तत्व। – Hexa

उत्तर

2

सॉकेट रीड टाइमआउट SocketTimeoutException को readObject() द्वारा फेंकने का कारण बन जाएगा। आप उस ObjectInputStream का पुन: उपयोग नहीं कर पाएंगे, और स्ट्रीम क्षतिग्रस्त हो सकती है क्योंकि इसकी वर्तमान स्थिति काफी हद तक अनिर्धारित रहेगी।

शायद यह केवल कनेक्शन को बंद करके और फिर से खोलकर तय किया जा सकता है।

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