मैं एक मुड़ सर्वर है कि XML अनुरोधों की उम्मीद है और बदले में एक्सएमएल प्रतिक्रियाओं भेजता लागू करने के लिए करना चाहते हैं:ट्विस्टेड एक्सएमएलस्ट्रीम: घटनाओं से कैसे जुड़ें?
<request type='type 01'><content>some request content</content></request>
<response type='type 01'><content>some response content</content></response>
<request type='type 02'><content>other request content</content></request>
<response type='type 02'><content>other response content</content></response>
मैं एक मुड़ ग्राहक & सर्वर before कि साधारण तार का आदान-प्रदान और XML का उपयोग करने के लिए है कि विस्तार करने के लिए करने की कोशिश की पैदा की है, लेकिन मुझे यह पता लगाना प्रतीत नहीं होता कि इसे सही तरीके से कैसे सेट किया जाए।
client.py:
#!/usr/bin/env python
# encoding: utf-8
from twisted.internet import reactor
from twisted.internet.endpoints import TCP4ClientEndpoint, connectProtocol
from twisted.words.xish.domish import Element, IElement
from twisted.words.xish.xmlstream import XmlStream
class XMLClient(XmlStream):
def sendObject(self, obj):
if IElement.providedBy(obj):
print "[TX]: %s" % obj.toXml()
else:
print "[TX]: %s" % obj
self.send(obj)
def gotProtocol(p):
request = Element((None, 'request'))
request['type'] = 'type 01'
request.addElement('content').addContent('some request content')
p.sendObject(request)
request = Element((None, 'request'))
request['type'] = 'type 02'
request.addElement('content').addContent('other request content')
reactor.callLater(1, p.sendObject, request)
reactor.callLater(2, p.transport.loseConnection)
endpoint = TCP4ClientEndpoint(reactor, '127.0.0.1', 12345)
d = connectProtocol(endpoint, XMLClient())
d.addCallback(gotProtocol)
from twisted.python import log
d.addErrback(log.err)
reactor.run()
पहले स्ट्रिंग आधारित दृष्टिकोण का उल्लेख के रूप में, ग्राहक जब तक CTRL + सी idles। एक बार जब यह जा रहा है, तो यह ट्विस्ट XMPP example से कुछ प्रेरणा प्राप्त करेगा।
server.py:
#!/usr/bin/env python
# encoding: utf-8
from twisted.internet import reactor
from twisted.internet.endpoints import TCP4ServerEndpoint
from twisted.words.xish.xmlstream import XmlStream, XmlStreamFactory
from twisted.words.xish.xmlstream import STREAM_CONNECTED_EVENT, STREAM_START_EVENT, STREAM_END_EVENT
REQUEST_CONTENT_EVENT = intern("//request/content")
class XMLServer(XmlStream):
def __init__(self):
XmlStream.__init__(self)
self.addObserver(STREAM_CONNECTED_EVENT, self.onConnected)
self.addObserver(STREAM_START_EVENT, self.onRequest)
self.addObserver(STREAM_END_EVENT, self.onDisconnected)
self.addObserver(REQUEST_CONTENT_EVENT, self.onRequestContent)
def onConnected(self, xs):
print 'onConnected(...)'
def onDisconnected(self, xs):
print 'onDisconnected(...)'
def onRequest(self, xs):
print 'onRequest(...)'
def onRequestContent(self, xs):
print 'onRequestContent(...)'
class XMLServerFactory(XmlStreamFactory):
protocol = XMLServer
endpoint = TCP4ServerEndpoint(reactor, 12345, interface='127.0.0.1')
endpoint.listen(XMLServerFactory())
reactor.run()
client.py
उत्पादन:
TX [127.0.0.1]: <request type='type 01'><content>some request content</content></request>
TX [127.0.0.1]: <request type='type 02'><content>other request content</content></request>
server.py
उत्पादन:
onConnected(...)
onRequest(...)
onDisconnected(...)
मेरे सवालों का:
- सर्वर किसी निश्चित XML टैग से मुकाबला करते समय निकाल दिए गए ईवेंट की सदस्यता कैसे ले सकता है?
//request/content
XPath क्वेरी मेरे लिए ठीक लगता है, लेकिनonRequestContent(...)
:-( - उपवर्गीकरण है
XmlStream
औरXmlStreamFactory
सब पर एक उचित दृष्टिकोण कहा जाता नहीं प्राप्त करता है? यह अपने आप आधार वर्ग द्वारा भेजे गए घटनाओं के लिए अजीब है क्योंकिXMLServer
सदस्याएं महसूस करता है और उसके बाद पारित हो जाता है खुद (?)xs
पैरामीटर के रूप में?!? मैं नहीं बल्किXMLServer
एक साधारण वर्ग बना दें और वर्ग के सदस्य के रूप में एकXmlStream
वस्तु है? वहाँ एक विहित दृष्टिकोण है? - मैं कैसे
addErrback(...)
तरह सर्वर पर एक त्रुटि हैंडलर जोड़ना होगा ग्राहक में? मुझे चिंता है कि अपवाद निगल जाएंगे (पहले हुआ), लेकिन मुझे नहीं लगता किकहां प्राप्त करें 0 से इसे संलग्न करने के लिए ... - डिफ़ॉल्ट अनुरोध के बाद सर्वर पहले अनुरोध के बाद कनेक्शन बंद क्यों करता है? मैं
XmlStream.onDocumentEnd(...)
loseConnection()
पर कॉल करता हूं; मैं उस विधि को ओवरराइड कर सकता था, लेकिन मुझे आश्चर्य है कि बंद होने का कोई कारण नहीं है, मुझे नहीं लगता है। क्या यह कनेक्शन खुला नहीं है जब तक कि इस पल के लिए जरूरी सभी संचार नहीं किए जाते हैं?
मुझे आशा है कि यह पोस्ट बहुत विशिष्ट नहीं माना जाएगा; नेटवर्क पर एक्सएमएल की बात करना आम है, लेकिन डेढ़ दिन की तलाश के बावजूद, मैं कोई भी ट्विस्ट एक्सएमएल सर्वर उदाहरण नहीं ढूंढ पाया। हो सकता है कि मैं इसे भविष्य में किसी भी प्रश्न के साथ जंपस्टार्ट में बदलूं ...
क्या आपको बिल्कुल XMLStream का उपयोग करना है? एक्सएमएल, आखिरकार, बस पाठ है। तो, इसे पाठ के रूप में भेजें, और ग्राहकों को इसके बारे में समझ में आता है हालांकि आप कृपया। चाहे वह एक्सएमएल, जेसन, या सादा पाठ है। –