【问题标题】:Two tcp connections from a client in Twisted来自 Twisted 客户端的两个 tcp 连接
【发布时间】:2015-12-02 22:01:34
【问题描述】:

我是扭曲的新手。我编写了一个客户端,它通过两个端口 8037 和 8038 连接到服务器。我知道工厂创建了两个连接对象。现在当我按下 Ctrl-C 时,它会显示

Connection Lost Connection to the other side was lost in a non clean fashion.
Connection Lost Connection to the other side was lost in a non clean fashion. 

下面是代码:

from twisted.internet import protocol,reactor

class TestClient(protocol.Protocol):
  def __init__(self):
    pass

  def connectionMade(self):
    print "Connected "
    self.sayHello()

  def connectionLost(self,reason):
    self.transport.loseConnection()

  def sayHello(self):
    self.transport.write("Hello")

  def dataReceived(self,data):
    print "Received data ",data



class TestClientFactory(protocol.ClientFactory):
  def buildProtocol(self,addr):
    return TestClient()

  def clientConnectionFailed(self,connectory,reason):
    print "Connection Failed ",reason.getErrorMessage()

  def clientConnectionLost(self,connector,reason):
    print "Connection Lost ",reason.getErrorMessage()

reactor.connectTCP("<server_ip>",8037,TestClientFactory())
reactor.connectTCP("<server_ip>",8038,TestClientFactory())
reactor.run()
  1. 如何让客户端干净地关闭两个 tcp 连接?
  2. 如何只为一个连接调用sayHello()方法?

我刚接触twisted,所以举个例子会很有帮助。

谢谢

【问题讨论】:

    标签: python twisted


    【解决方案1】:

    连接的时候,如果要调用sayHello,可以使用rpc的思想。

    例如,您发送类似“sayHello_args”的消息,解析 msg 并通过 args 调用 sayhello。

    如果您不想发送任何消息。连接后, d.addCallback(sayHello) 进行调用。 d = defer.succeed(0) d.addCallback(lambda _ : self.sayHello())

    如果你想关闭连接,使用 reactor.stop()

    【讨论】:

    • 感谢小亨的回复。但是 clientConnectionLost 中的 if 条件仍然给我以非干净时尚消息关闭的连接。
    • 我通过这种方式添加新图片;我关得干干净净。如果您知道解决此问题的另一种方法,请告诉我。谢谢。
    【解决方案2】:

    不干净的连接关闭真的没什么好担心的。获得一个干净的退出可能会使您的关闭过程变得更慢和错误,因为它需要一堆额外的代码,并且无论如何您都必须能够处理异常的网络连接终止。事实上,称其为“干净”甚至可能有点误导:“同时确认”可能更接近它实际告诉您的连接是如何关闭的。

    至于如何调用sayHello,我不完全理解你的问题,但是如果你使用AMP,调用连接对面的方法是很容易的。

    【讨论】:

    • 感谢字形的回复。我已经编辑了上面 TestClient 的代码。我在建立连接后调用 self.sayHello() 。我只为一个连接调用 sayHello() 的意思是,在上面的代码中,在端口 8037 和 8038 上与服务器建立连接后,客户端会在两个端口上发送“Hello”消息,对吗? .有没有办法仅在一个端口(8037 或 8038)上发送该消息?谢谢
    • 我不明白你在问什么。如果您希望连接到端口 8038 的客户端执行与 TestClientFactory 不同的操作,请实例化 TestClientFactory 以外的其他内容,或为 TestClientFactory 提供一个构造函数参数,将其传递给 TestClient 以告诉它执行某些操作不同的。但这与 Twisted 无关;如果你想让 Python 对象做一些不同的事情,你只需要制作不同的 Python 对象 :)
    • 另外,您可能不应该直接使用connectTCP。请改用Endpoints
    猜你喜欢
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 2011-05-30
    • 1970-01-01
    • 2013-02-17
    • 2015-04-20
    • 2018-04-10
    相关资源
    最近更新 更多