2012-10-09 19 views
9

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

एकमात्र समाधान जिसे मैं सोच सकता हूं, पढ़ने और लिखने के लिए धागा बना रहा है, और जब भी मुझे लिखना होता है तो पढ़ने वाले धागे को बाधित कर रहा है।

वहाँ एक बेहतर समाधान है या यह एक ही तरीका है मैं कर सकता हूँ इस

+1

कृपया अपने काम के बारे में अधिक जानकारी प्रदान करने के लिए अपनी पोस्ट संपादित करें। आपने क्या प्रयास किया है आपने क्या शोध किया है? क्या कोड काम नहीं कर रहा है? – Gray

+1

यह सिर्फ एक मुद्दा नहीं है - @CrazyCasta उत्तर देखें। टीएक्स/आरएक्स धाराएं स्वतंत्र हैं और एक धागे से पढ़ी जाती हैं जबकि दूसरे से लिखना ठीक है। –

+0

आर/डब्ल्यू एक साथ पूर्ण-डुप्लेक्स की परिभाषा है, जो टीसीपी है। – irreputable

उत्तर

6

आप दो धागे का उपयोग कर सकते है। पढ़ने के लिए एक और लिखने के लिए एक। इस तरह लिखने वाले थ्रेड लिखते समय लिख सकते हैं (पढ़ने को रोकने की आवश्यकता नहीं है)।

इसे पढ़ने का एक और तरीका है पढ़ने से पहले सॉकेट पर setSoTimeout(timeoutMs) का उपयोग करना। इससे SocketTimeoutException फेंकने का कारण बन जाएगा यदि इसे टाइमआउट से अधिक समय लगता है, तो मिससेकंड पढ़ने के लिए, आपको कृपया लिखने की अनुमति देता है।

+1

मैं टाइमआउट भाग के अलावा इस से सहमत होगा। तुम ऐसा क्यों चाहेगो? आप वैसे भी लिख सकते हैं। –

+0

@TobiasRitzau आपको दो के बजाय एक धागा का उपयोग करने की अनुमति देता है। मुझे बिल्कुल यकीन नहीं है कि ओपी क्या करने की कोशिश कर रहा है, इसलिए मैं बस एक और विकल्प जोड़ रहा था। – CrazyCasta

+2

कुछ गंभीर सिंक मुद्दे हैं जो इससे उत्पन्न हो सकते हैं। और यदि आप टाइमआउट करते हैं, तो सॉकेट बंद हो जाती है, या क्या मुझे कुछ याद आ रहा है? –

-1

आप दो अलग-अलग बंदरगाहों का उपयोग कर सकते हैं, एक सुनने के लिए और एक लिखने के लिए। और संचालन करने के लिए विभिन्न धागे का उपयोग करें, फिर आप (सत्य) लूप एक समस्या पैदा नहीं करेंगे।

+2

यही एक सॉकेट करता है ... यह पहले से ही पूर्ण डुप्लेक्स का समर्थन करता है। –

0

एफ़टीपी प्रोटोकॉल चश्मे पर एक नज़र डालें। यह वही करता है जो आप दो सॉकेट/चैनलों का उपयोग करते हैं, एक कमांड के लिए और एक डेटा के लिए।

+1

इसकी आवश्यकता नहीं है। एक सॉकेट दो अलग-अलग चैनलों को भेजने और प्राप्त करने के लिए पर्याप्त है। –

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