2014-04-07 10 views
7

के साथ अक्का आईओटीसीपी मैंने akka.io.tcp का उपयोग कर क्लाइंट और सर्वर लिखा है और क्लाइंट द्वारा भेजे गए संदेशों को पढ़ने में मुझे समस्या है। मैंने संदेशों को भेजने के लिए जेसन का उपयोग किया है। ग्राहक के पक्ष में, मैं इस तरह से संदेश लिखें:जेसन

connection ! Write(ByteString(msgString)) 

सर्वर साइड में मैं निम्नलिखित है:

override def receive: Receive = { 
    case Received(data) => listener ! Json.parse(data.utf8String) 
    case PeerClosed => { 
    context stop self 
    } 
} 

समस्या है अक्का एक समय में एक से अधिक संदेश पढ़ रही है, तो मुझे एक अवैध जेसन मिल गया। क्या एक समय में अक्का को सिर्फ एक संदेश पढ़ने का कोई तरीका है?

+4

मैं यहां गलत हो सकता हूं, लेकिन मेरा मानना ​​है कि यह हिस्सा आपके ऊपर होगा। आपको उस तर्क को लिखना होगा जो जानता है कि एक अनुरोध कब समाप्त होता है और दूसरा शुरू होता है और अपूर्ण अनुरोधों पर होल्डिंग को संभालने में सक्षम होता है और जब उन्हें अंदर आता है तो उन्हें बाकी के साथ जोड़ना। मैं नेटटी शब्दावली में विश्वास करता हूं, यह पाइपलाइन में फ़्रेमडेलिमीटर होगा , लेकिन मुझे विश्वास नहीं है कि वर्तमान में अक्का टीसीपी में एक समान सुविधा है (हालांकि मैं गलत हो सकता हूं)। – cmbaxter

उत्तर

6

अक्का का टीसीपी मॉड्यूल बहुत कम "निम्न स्तर" है (और इसे डिजाइन किया गया है), इसलिए हम किसी भी प्रकार के फ्रेम डिलीमीटर प्रदान नहीं कर रहे हैं। आपको इसे एक टीसीपी स्तरीय बिल्डिंग ब्लॉक की तरह अधिक इलाज करना चाहिए, फिर आपको अपनी सामग्री बनाना है।

आपके उदाहरण में, अभिनेता को डेटा के आने वाले हिस्सों को एकत्र करना होगा, और पता लगाएं कि जब एक जेसन दस्तावेज़ "पूर्ण" होता है, तो अनारशोधन को ट्रिगर करें।

इसके लिए बॉक्स से कुछ प्रदान करने का विचार काफी आकर्षक है ... मैं लोगों से पूछूंगा कि हमारी योजनाएं इस तरह के उपयोग के मामलों का समर्थन करने के लिए क्या हैं।

फिर भी, मुझे आशा है कि इससे मदद मिलेगी!

+1

ठीक है। अब मुझे एक और संदेह है: मुझे एक समय में एक से अधिक संदेश मिल रहे हैं। उदाहरण के लिए आधा संदेश प्राप्त करना संभव है? – Augusto

+1

हां, जैसा कि पहले बताया गया है, अक्का टीसीपी कोड को फ्रेम डिलीमीटर के बारे में नहीं पता है और इस प्रकार चाहे आप चाहे जो भी हो, चाहे वह डेटा का पूरा हिस्सा हो या नहीं। आपको ये सब एक साथ अपने आप को टुकड़ा करने की जरूरत है। – cmbaxter

+0

यह हल करने के लिए आप क्या कर सकते हैं सभी हिस्सों को कुल करना है, फिर प्रत्येक को यह जांचने का प्रयास करें कि JSON दस्तावेज़ कहां समाप्त हो रहा है (यदि यह समाप्त हो रहा है), और फिर उस भाग को अपने "समेकित स्ट्रिंग" से निकालें, फिर 'जेसन' .parse' यह। या आप एक और अभिनेता पेश कर सकते हैं जो विभाजन कर रहा है, और _full_ json तारों को "पार्सर अभिनेता" को भेज सकता है ... बस कुछ विचार :-) –