2010-03-15 16 views
32

यहां एक सामान्य प्रश्न है। मैं सबसे अच्छे जवाब की तलाश में नहीं हूं, मैं बस आपको अपने पसंदीदा प्रथाओं को व्यक्त करना चाहता हूं।नेटवर्क प्रोटोकॉल को कैसे कार्यान्वित करें?

मैं जावा में एक नेटवर्क प्रोटोकॉल को कार्यान्वित करना चाहता हूं (लेकिन यह एक सामान्य सवाल है, मुझे सी ++ में एक ही समस्या का सामना करना पड़ा), यह पहली बार नहीं है, जैसा कि मैंने पहले किया है। लेकिन मुझे लगता है कि इसे लागू करने के लिए मुझे एक अच्छा तरीका याद आ रहा है। असल में आमतौर पर मेजबान संदेशों के बीच टेक्स्ट मैसेज और कुछ बाइट बफर का आदान-प्रदान करने, स्थिति संग्रहित करने और अगले संदेश आने तक प्रतीक्षा करने के बारे में सब कुछ है। समस्या यह है कि मैं आम तौर पर स्विच की एक गुच्छा और अधिक या कम जटिल के साथ समाप्त होता हूं यदि विभिन्न स्थितियों/संदेशों पर प्रतिक्रिया देने वाले बयान। पूरी चीज आमतौर पर जटिल और मानसिक होने के लिए मुश्किल हो जाती है। उल्लेख नहीं है कि कभी-कभी जो कुछ आता है उसके पास कुछ "अंधेरा स्थान" होता है, मेरा मतलब प्रोटोकॉल की स्थिति है जो कवर नहीं किया गया है और यह एक अप्रत्याशित तरीके से व्यवहार करता है। मैंने कुछ राज्य मशीन कक्षाओं को लिखने की कोशिश की, जो प्रत्येक कार्रवाई के लिए कम या कम स्मार्ट तरीकों से प्रारंभ और अंत स्थिति की जांच करने का ख्याल रखते हैं। यह प्रोग्रामिंग प्रोटोकॉल को बहुत जटिल बनाता है क्योंकि मुझे हर संभावित स्थिति को कवर करने के लिए कोड की रेखाएं और रेखाएं लिखनी होती हैं। मुझे जो अच्छा लगेगा वह एक अच्छा पैटर्न, या प्रोग्रामिंग जटिल प्रोटोकॉल, मैंटन के लिए आसान और विस्तार और बहुत पठनीय प्रोग्रामिंग में उपयोग किया जाने वाला एक सर्वोत्तम अभ्यास है।

आपके सुझाव क्या हैं?

उत्तर

15

राज्य डिज़ाइन पैटर्न पर स्विच स्विच स्टेटमेंट से बचने के तरीके सीखने के लिए पढ़ें।


ब्लाइंड स्पॉट

राज्य ", मैं प्रोटोकॉल है कि कवर नहीं किया गया है ... की स्थितियों का क्या अर्थ" मदद कर सकते हैं अंतराल से बचने "कभी कभी क्या बाहर आता है कुछ है।" यह एक अच्छी डिजाइन की गारंटी नहीं दे सकता है, आपको अभी भी ऐसा करना है।

"... क्योंकि मुझे हर संभावित स्थिति को कवर करने के लिए कोड की रेखाएं और रेखाएं लिखनी होंगी।"

इसे बोझ या समस्या नहीं माना जाना चाहिए: प्रत्येक संभावित स्थिति को कवर करने के लिए कोड की रेखाएं लिखना चाहिए।

राज्य सहायता कर सकता है क्योंकि आप विरासत लीवरेज प्राप्त करते हैं। यह एक अच्छी डिजाइन की गारंटी नहीं दे सकता है, आपको अभी भी ऐसा करना है।

+0

"Desing पैटर्न" पुस्तक (http://en.wikipedia.org/wiki/Design_Patterns) में यह पैटर्न शामिल समस्या पर लागू होता है। – Dmitry

+0

मुझे विकिपीडिया पर एक झलक मिला है और यह बहुत चालाक लगता है और यह मेरे पास कई समस्याओं का समाधान करेगा। मुझे उस आकर्षक डिजाइन पैटर्न बुक खरीदना चाहिए ... :) – gotch4

+0

@ gotch4 - एक अच्छी किताबों की दुकान के माध्यम से ब्राउज़ करें। जीओएफ उन वस्तुओं में से एक है जिन्हें आप सार्वजनिक रूप से जनसांख्यिकीय मानते हैं लेकिन सच्चाई यह है कि अब वहां बेहतर पैटर्न किताबें हैं। अधिकांश राज्य पैटर्न को कवर करेंगे, इसलिए आप जिनके साथ सहज महसूस करते हैं, उनके लिए खरीदारी करें। – Duck

1

यदि आप जावा का उपयोग कर रहे हैं, तो Apache MINA पर विचार करने पर विचार करें, यह दस्तावेज़ीकरण और नमूने आपको सही तरीके से प्रेरित करना चाहिए।

6

प्रोटोकॉल डिज़ाइन करना आम तौर पर आपके द्वारा काम कर रहे एप्लिकेशन स्थान के बारे में होता है। उदाहरण के लिए, http वेब पेज, ग्राफिक्स और पोस्ट को संभालने के बारे में है, जबकि एफ़टीपी फाइलों को स्थानांतरित करने के बारे में है।

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

3

परिमित राज्य मशीन, तुम क्या चाहते

FSM

तो तुम कहा गया है कि यदि आप एक रिसीवर या इस (निष्क्रिय, connecting_phase1, connecting_phase2, पैकेट के रूप में उम्मीद में हो सकता है की एक पूरी गुच्छा को परिभाषित है .. ।)

तो सभी संभव घटनाओं (packet1 आता है, शुद्ध बंद, को परिभाषित ...)

अंत में आप एक मेज है कि कहते हैं, 'जब राज्य में एक्स और घटना n राज्य के लिए समारोह y और संक्रमण करना होता है क्ष '- के लिए हर राज्य और घटना (कई नल या हो जाएगा dups)

संपादित करें - कैसे एक FSM (स्केच)

struct FSMNode 
{ 
     int m_nextState; 
     void (m_func*); 
} 
FSMNode states[NUMSTATES][NUMEVENTS]= 
    { // state 0 
     {3, bang}, // event 0 
     {2,wiz}, 
     {1, fertang} 
    } 
    { 
     {1, noop}, // event 0 
     {1, noop}, 
     {3, ole} 
    } 
    ....... 
    FSMNode node = states[mystate][event]; 
    node.m_func(context); 
    mystate = node.m_nextState; 

बनाने के लिए मुझे यकीन है कि इस अवैध वाक्य रचना से भरा हुआ है हूँ - लेकिन मुझे आशा है कि आपको बहाव

+0

बेशक मुझे यह पता है। मैं जो जानना चाहता हूं वह एफएसएम और टेबल को लागू करने के लिए सबसे अच्छा प्रथा है ... यह मेरा असली सवाल है – gotch4

2

एक्सएमएल का उपयोग अपने प्रोटोकॉल के रूप में क्यों नहीं करें? आप XML नोड्स

+0

यह समस्या नहीं है ... मुझे पता है कि मैं कोडेक्स को लागू करने के लिए ... – gotch4

+0

मैंने सुझाव दिया क्योंकि इसका एक खुला प्रारूप आज इंटरनेट में व्यापक रूप से। मैं नहीं कह रहा हूं कि अब आप कोडेक्स को कैसे कार्यान्वित नहीं करते हैं। मैं बस कुछ समय बचाने की कोशिश कर रहा हूं, क्योंकि यह वास्तविक दुनिया परियोजनाओं में मेरे साथ हुआ जहां मैंने प्रोटोकॉल के इस प्रारूप को चुना। – Andres

+0

वास्तव में यह मेरी सामान्य पसंद है ... लेकिन मेरी चिंता डेटा स्वरूपण के बारे में नहीं है, प्रोटोकॉल स्थिति प्रबंधन और कार्यान्वयन के बारे में अधिक है। – gotch4

2

के अंदर डेटा के अपने सभी टुकड़ों को समाहित और वर्गीकृत कर सकते हैं, आपको खुद को एक उदाहरण नहीं दे सकता है, लेकिन यह देखने के बारे में कि अन्य (सक्षम) लोग इसे कैसे कर रहे हैं?

इस तरह की तरह? http://anonsvn.jboss.org/repos/netty/trunk/src/main/java/org/jboss/netty/handler/codec/http/

पीएस उस मामले के लिए, मैं वास्तव में नेटटी का उपयोग अपने नेटवर्क ढांचे के रूप में करने और इसके शीर्ष पर अपना प्रोटोकॉल बनाने की सलाह देता हूं। यह बहुत आसान होना चाहिए, और आप शायद सिरदर्द के गुच्छा से छुटकारा पायेंगे ...

+0

लिंक टूटा हुआ है। – Piovezan

3

सी ++ में आप बूस्ट :: स्पिरिट लाइब्रेरी का उपयोग आसानी से अपने प्रोटोकॉल संदेश को पार्स करने के लिए कर सकते हैं। केवल "कठिनाई" आपके संदेश प्रोटोकॉल के व्याकरण को परिभाषित करना है। यह समस्या देखने के लिए ग्नुटेला स्रोत कोड पर एक नज़र डालें। यहां http://www9.limewire.com/developer/gnutella_protocol_0.4.pdf ग्नुटेला प्रोटोकॉल विनिर्देश

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