скрученный , вернуть пользовательское сообщение клиенту после получения запроса от клиента

Я написал простой код 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 - это та, которую мне нужно отправить клиенту.


person rakesh    schedule 06.06.2013    source источник
comment
вы планируете сделать это синхронное или асинхронное соединение??   -  person abhishekgarg    schedule 06.06.2013
comment
из приведенного выше требования я думаю, что пытаюсь установить асинхронное соединение. я не отправляю большие пакеты данных, а просто XML-структуры. Я не думаю, что синхронность необходима.   -  person rakesh    schedule 06.06.2013


Ответы (2)


Похоже, ваш код уже делает то, что вы просите. Simple.render_GET возвращает response. response — это то, что отправляется клиенту. Возможно, вы не знаете, как получить ответ после его отправки клиенту? Если это так, ответ может быть readBody (дополнительные документы).

person Jean-Paul Calderone    schedule 06.06.2013
comment
Да, это правда, я не могу получить ответ после того, как он был отправлен клиенту. Я пробовал print response. он показал мне местоположение объекта. это должен быть однострочный код, верно? Я что-то здесь упускаю. - person rakesh; 06.06.2013
comment
эй @ Jean-Paul-Calderone, спасибо за ссылку, но для меня это не очень важно, если не сложно, не могли бы вы опубликовать ответ, это мне очень поможет, пожалуйста. - person rakesh; 06.06.2013
comment
Вы читали страницы, на которые ведут ссылки? Они дают вам ответ. Я не собираюсь переписывать документацию для вас здесь. - person Jean-Paul Calderone; 06.06.2013
comment
Привет, @Jean, извини, если моя просьба тебя раздражает, я новичок в этом. В любом случае, я просмотрел документ и понял, что в server.py ничего не нужно менять, за исключением того, что print response нужно изменить на return response. теперь я понял, какие изменения нужно было внести в client.py. Я сделаю все возможное, чтобы добиться этого, если я не получу результатов, мне, возможно, придется еще раз беспокоить вас своими глупыми сомнениями. извини Жан - person rakesh; 06.06.2013
comment
Привет, Жан, я обновил ответ, пожалуйста, ознакомься с ним, спасибо за ссылки. - person rakesh; 06.06.2013
comment
Хорошо. Рад, что ты понял это. Для чего бы это ни стоило, вам, вероятно, следует отредактировать свой вопрос в будущем, а не добавлять ответ, который добавляет больше деталей к вопросу. - person Jean-Paul Calderone; 08.06.2013

Я нашел то, что хотел: это мой обновленный код для 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>.

это то, что я хотел.

person rakesh    schedule 06.06.2013