2013-04-10 4 views
9

का उपयोग कर यहाँ मेरी स्थिति है:अतुल्यकालिक, स्वीकार किया, बिंदु से बिंदु कनेक्शन gSoap

  1. मैं है एक wsdl, एक हेडर फाइल करने के लिए इस तरह "अनुवाद": wsdl2h -o file.h file.wsdl
  2. फिर, मैं soapcpp2 -Icorrect_path -j file.h
  3. मार डाला
  4. पर "सर्वर साइड" मैं सेवा लागू किया, soapXXXService.[h|cpp]
  5. का उपयोग कर पर "सर्वर साइड" फिर से, मैं soap_init2 इस्तेमाल किया (SOAP_IO_KEEPALIVE के साथ), मैं soap_bind,है, soap_copy, आदि और यह बिल्कुल ठीक काम करने के लिए लगता है (नीचे देखें)
  6. पर "ग्राहक के पक्ष", मैं उत्पन्न proxy वस्तु (फिर SOAP_IO_KEEPALIVE का प्रयोग करके) का उपयोग करें, संदेश का निर्माण और सर्वर पर भेज
  7. "सर्वर" इस ​​संदेश को प्राप्त करता है और वापस एसीके (कस्टम XML)
  8. "ग्राहक" ACK प्राप्त करता है और सब कुछ बिल्कुल ठीक है भेजता है।

तो, क्या मैं अब क्या करना चाहते हैं "सर्वर" "ग्राहक" और "ग्राहक" के लिए "असली" प्रतिक्रिया वापस करना है "सर्वर" करने के लिए एक ACK वापस लौटने के लिए है।

यह कैसे संभव है? (यह होना चाहिए)


"आपने क्या प्रयास किया है?"

दो चीजें मेरे दिमाग में आती हैं।

किसी भी तरह सॉकेट की फ़ाइल डिस्क्रिप्टर का पुन: उपयोग करना है, सर्वर पर वापस "असली प्रतिक्रिया" भेजने के लिए, soap_accept से वापस लौटाया गया है। लेकिन क्या यह भी संभव है?
यूनिक्स सॉकेट पूर्ण डुप्लेक्स हैं, इसलिए यह तकनीकी रूप से संभव है, लेकिन gSoap इसे प्रतिबंधित करता है? क्योंकि मैंने दस्तावेज़ में इस बारे में कुछ भी नहीं देखा था।

दूसरा विकल्प, जो मेरे दिमाग में आता है, "क्लाइंट" में एक ही "सेवा" बनाना है, जिससे संदेश प्राप्त करना संभव हो ("वास्तविक प्रतिक्रिया") और ACK को उसी तरह से वापस करने के लिए "सर्वर" में। लेकिन इसका मतलब यह होगा कि "सर्वर" में proxy ऑब्जेक्ट का एक उदाहरण भी होना चाहिए ताकि यह "वास्तविक प्रतिक्रिया" भेजने में सक्षम हो सके।
और यह वास्तव में मेरे लिए बदसूरत और भयानक लगता है। ऐसा नहीं है कि यह आश्चर्यचकित होगा अगर यह एकमात्र विकल्प है, लेकिन ..

संपादित करें: दूसरे विकल्प के लिए - इसका मतलब यह होगा कि क्लाइंट में श्रोता बंदरगाह होना चाहिए, इनकमिंग कनेक्शन को संभालना चाहिए आदि। मेरे लिए एक ग्राहक की तरह ध्वनि ..


मैं समझता हूँ, कि मैं कैसे gSoap कार्यों में से कुछ मूलभूत हिस्सा (रों) गायब हो सकता है, लेकिन मैं पूरी user documentation और "getting started" guide पढ़ सकते हैं और मैं कुछ भी नहीं मिला इसके बारे में।

कृपया, मुझे पता है अगर कुछ स्पष्ट नहीं है जाने


संपादित करें:

  1. क्लाइंट सर्वर को अनुरोध भेजता है: परिदृश्य, मैं हासिल करना चाहते है
  2. सर्वर एसीके प्रतिक्रिया के रूप में देता है ई (मानक एसीके) की तरह - संकेत प्रतिक्रिया
सफलतापूर्वक प्राप्त - संकेतों अनुरोध
  • बाद में सफलतापूर्वक प्राप्त किया, सर्वर क्लाइंट के लिए प्रतिक्रिया (कि वास्तविक प्रतिक्रिया है)
  • ग्राहक रिटर्न एसीके फिर भेजता है

    और यह परिदृश्य विपरीत दिशा में भी हो सकता है: सर्वर क्लाइंट को भी अनुरोध भेज सकता है। इसका मतलब होगा - ऊपर जैसा ही परिदृश्य है, लेकिन "क्लाइंट" < -> "सर्वर" को बदल रहा है।

    नोट: दोनों request/response और ACK SOAP संदेश जा सकता है।

  • +0

    मुझे लगता है कि अब मैं समझता हूं। मैं अपना प्रारंभिक उत्तर खींच रहा हूं। –

    +0

    अंक 1, 2 और 3 के बारे में प्रश्न। क्या आपको अपने ग्राहक को अपना अनुरोध भेजने की आवश्यकता है, त्वरित "एएसी" प्राप्त करें, फिर बाहर जाने और अन्य चीजों को करने में सक्षम होने के लिए, और बाद में यह देखने के लिए जांचें कि क्या यह प्राप्त हुआ है या नहीं अंतिम प्रतिक्रिया? यदि ऐसा है, तो आप इसके बजाय अपने क्लाइंट को बहुप्रचारित कर सकते हैं और पहले "एएके" को खत्म कर सकते हैं। क्या यह अनुरोध भेजता है, और एक कार्यकर्ता धागे पर अंतिम प्रतिक्रिया की प्रतीक्षा करें, जबकि ग्राहक का मुख्य धागा उपयोगी काम करने के लिए चला जाता है। –

    +0

    बिंदु 4 के बारे में प्रश्न 4. क्लाइंट से सर्वर पर बैक क्यों आवश्यक है? यदि इसकी आवश्यकता है, तो इसे जीएसओएपी दस्तावेज़ों की धारा 7.4 द्वारा नियंत्रित किया जा सकता है। –

    उत्तर

    2

    मैंने इसे अपने प्रश्न में option 2 का उपयोग करके कार्यान्वित किया। यही है: सेवा (एक श्रोता) लागू करें और क्लाइंट और सर्वर दोनों में प्रॉक्सी (अनुरोध भेजने के लिए) का उपयोग करें। इस तरह, मैं निम्नलिखित है:

    1. सर्वर अप
    2. ग्राहक शुरू कर दिया है (एक श्रोता, उर्फ ​​शुरू होता है"सेवा")
    3. ग्राहक, सोप अनुरोध (प्रॉक्सी वस्तु) का उपयोग कर भेजता है सर्वर कह: "मैं हूँ और अपने स्थान xxx कि" (xxx यूआरआई, जो हो जाएगा (कह ग्राहक के श्रोता के लिए सर्वर)
    4. सर्वर सोप संदेश (एसीके) के साथ प्रतिक्रियाओं कनेक्ट करने के लिए प्रयोग किया है: "ठीक है, मैं देख रहा हूँ कि तुम अब कर रहे हैं")
    5. बाद सर्वर ग्राहक के लिए (प्रॉक्सी वस्तु के माध्यम से) सोप अनुरोध भेजता है, पहले संदेश में मिला स्थान का उपयोग कर,; इस अनुरोध अनुरोध के वास्तविक प्रतिक्रिया, 3. में भेजा यह कहते है -
    6. ग्राहक रिटर्न प्रतिक्रिया इस अनुरोध (एसीके) (कह करने के लिए "ठीक है, मैं आपसे बातचीत के लिए तैयार हूँ": "ठीक है, शांत")

    और इस तरह से, दोनों - क्लाइंट और सर्वर एक दूसरे के स्थान पता है, दोनोंदोनों प्रॉक्सी वस्तुओं को बनाए रखने के (सेवा के कार्यान्वयन) एक श्रोता है,।


    ऐसा लगता है कि यह मेरे लिए काम करेगा। मुझे खुशी होगी अगर कोई मुझे एक और विकल्प दे या मेरे प्रश्न में option 1 के बारे में कुछ कहें।


    संपादित करें: कई दिनों के लिए और प्रोटोकॉल के गहरे विश्लेषण के बाद गहन अनुसंधान के बाद, मैं आशय लागू करने के लिए, ऐसा लगता है, कि है कि ऐसा करने के लिए एक ही रास्ता है:

    क्रियान्वयन जरूरी एक एसओएपी क्लाइंट और एसओएपी सर्वर दोनों के रूप में काम करने में सक्षम हो

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