0

我已经编写了一个简单的 http 服务器和 http 客户端代码,我能够成功地从客户端以 xml 的形式向服务器发送消息。这是我的代码。

客户端.py

from StringIO import StringIO
from twisted.internet import reactor
from twisted.web.client import Agent
from twisted.web.http_headers import Headers

from twisted.web.client import FileBodyProducer
from xml_dict import bm_xml

xml_str = bm_xml()
agent = Agent(reactor)
body = FileBodyProducer(StringIO(xml_str))

d = agent.request(
   'GET',
   'http://localhost:8080/',
    Headers({'User-Agent': ['Replication'],
            'Content-Type': ['text/x-greeting']}),
    body)

def cbResponse(response):
    print response.version
d.addCallback(cbResponse)

def cbShutdown(ignored):
   reactor.stop()
d.addBoth(cbShutdown)

reactor.run()

服务器.py

from twisted.web import server, resource
from twisted.internet import reactor

def parse_xml(xml_str):
  print xml_str
  response = "xml_to_client"
  return response



class Simple(resource.Resource):
     isLeaf = True
     def render_GET(self, request):
        xml_request_str = request.content.read()
        response = parse_xml(xml_request_str)
        print response

 site = server.Site(Simple())
 reactor.listenTCP(8080, site) 
 reactor.run()

我在这里要做的是从客户端发送一个xml字符串到服务器,xml是从另一个文件的bm_xml模块生成的。此 xml 已成功读取到服务器,现在一旦服务器接收到 xml,我需要解析此 xml 并返回另一个 xml 字符串。我有解析 xml 并构造另一个 xml 的代码,以便客户端从服务器接收这个 xml,但我不知道如何将消息从服​​务器发送到客户端。在服务器或客户端中所需的所有更改在哪里?我假设cbresponse必须在客户端进行更改,但我不知道应该在服务器端进行更改。在服务器response变量中是我需要发送给客户端的变量。

4

2 回答 2

2

您的代码似乎已经按照您的要求进行。 Simple.render_GET返回responseresponse是发送给客户端的内容。也许您不确定在将响应发送给客户端后如何获得响应?如果是这样,答案可能是readBody更多文档)。

于 2013-06-06T10:32:08.093 回答
0

我找到了我想要的:这是我更新的 client.py 代码

 from StringIO import StringIO

 from twisted.internet import reactor
 from twisted.internet.protocol import Protocol
 from twisted.web.client import Agent
 from twisted.web.http_headers import Headers
 from twisted.internet.defer import Deferred

 from twisted.web.client import FileBodyProducer
 from xml_dict import bm_xml

 xml_str = bm_xml()
 agent = Agent(reactor)
 body = FileBodyProducer(StringIO(xml_str))

 class BeginningPrinter(Protocol):
     def __init__(self, finished):
         self.finished = finished
         self.remaining = 1024 * 10

     def dataReceived(self, bytes):
        if self.remaining:
            reply = bytes[:self.remaining]
            print reply

    def connectionLost(self, reason):
         print 'Finished receiving body:', reason.getErrorMessage()
         self.finished.callback(None)


  d = agent.request(
   'POST',
   'http://localhost:8080/',
    Headers({'User-Agent': ['Replication'],
            'Content-Type': ['text/x-greeting']}),
    body)

  def cbRequest(response):
      finished = Deferred()
      response.deliverBody(BeginningPrinter(finished))
      return finished

  d.addCallback(cbRequest)

  def cbShutdown(ignored):
  reactor.stop()

  d.addBoth(cbShutdown)
  reactor.run()

这是我的 server.py

  from twisted.web import server, resource
  from twisted.internet import reactor
  from xml_parser import parser
  from twisted.web.resource import Resource

  def parse_xml(xml_str):
       print xml_str
       xml_response = parser(xml_str)
       return xml_response

 class re_simple(Resource):
       isLeaf = True
       def render_POST(self, request):
            xml_request_str = request.content.read()
            xml_response = parse_xml(xml_request_str)
            return xml_response

 site = server.Site(re_simple())
 reactor.listenTCP(8080, site)
 print "server started"
 reactor.run()

现在我发送请求:<some Xml>到服务器,我得到服务器的响应<some response>

这就是我想要的。

于 2013-06-06T17:05:43.350 回答