के रूप में डैमन Gant कहा, टीसीपी एक स्ट्रीमिंग प्रोटोकॉल है। मेरा सुझाव है कि आप अपना खुद का प्रोटोकॉल बनाएं। मैं तार नहीं भेजूंगा। यदि आप कुछ भी गैर-तुच्छ कर रहे हैं तो यह वास्तव में जाने का सबसे अच्छा तरीका है।
आमतौर पर मैं एक जादू संख्या, चेकसम, बाइट में पैकेट शरीर की लंबाई, और प्रोटोकॉल हेडर में प्रोटोकॉल संस्करण शामिल करता हूं। जादू संख्या एक स्ट्रीम में पैकेट को चित्रित करना आसान बनाता है (आपके कस्टम प्रोटोकॉल स्ट्रीम को डीबग करने के लिए बहुत उपयोगी है।) चेकसम होने से यह सुनिश्चित करने में मदद मिलती है कि आप चीजों को सही तरीके से पार्स कर रहे हैं। एक चेकसम टीसीपी पर अखंडता के साथ ज्यादा मदद नहीं करता क्योंकि टीसीपी प्रोटोकॉल में पहले से ही एक चेकसम है। आपके पैकेट के लिए सभी बाइट्स होने पर पैकेट बॉडी की लंबाई आपको पता लगाने में सहायता करती है। प्रोटोकॉल संस्करण आपको पैकेट बॉडी के बाइट्स को समझने के तरीके के बारे में जानने में मदद कर सकता है।
डेटा प्राप्त करने पर, सभी बाइट्स को एक अलग बफर में रखें और अपने प्रोटोकॉल हेडर के लिए स्कैन करें। यदि आप अपने हेडर को पार्स कर सकते हैं, तो यह देखने के लिए जांचें कि पैकेट के बाइट सभी मौजूद हैं। यदि हां, तो पैकेट को पार्स करें। इस प्रक्रिया को तब तक दोहराएं जब तक आप एक अपूर्ण पैकेट नहीं पाते हैं, या बफर खाली होता है।
प्रत्येक पैकेट के लिए आप भेजना चाहते हैं, मैं एक कक्षा बनाउंगा। जब आप एक पैकेट भेजना चाहते हैं, उचित वर्ग बनाएं और क्रमबद्ध करें, और उस वर्ग के बाइट्स के लिए अपने प्रोटोकॉल हेडर को प्रीपेड करें।
आप जावा के सीरियलाइज़र का उपयोग कर सकते हैं, लेकिन यदि आपके पास एक सर्वर से कनेक्ट होने वाले कई क्लाइंट हैं, तो आप शायद सर्वर के लिए जावा का उपयोग नहीं करना चाहते हैं। यह चीजों को मुश्किल बनाता है क्योंकि अब आपको किसी अन्य भाषा में जावा सीरिएलाइज़र को लागू करने की आवश्यकता है। इसकी वजह से यह आमतौर पर आपके पैकेट को हाथ से बाइट में परिवर्तित करने के लिए बेहतर होता है (थकाऊ लेकिन सरल,) या आप प्रतिबिंब का उपयोग करके अपना स्वयं का सीरियलाइज़र लिख सकते हैं। मैं बाद में बड़ी परियोजनाओं के लिए सुझाव दूंगा।
स्रोत
2012-10-28 19:04:07
क्या आपने यह पता लगाने के लिए डीबग किया था कि क्या है> 1? –
के = 1. यदि मैं इसे अच्छी तरह से प्राप्त करता हूं, तो यह होना चाहिए कि बाइट सरणी में कितने तत्व हैं। लेकिन चूंकि केवल एक तत्व है, के = 1. – Kubik
डेटा भेजने के बाद आउटपुटस्ट्रीम को फ़्लश करने का प्रयास करें। –