【问题标题】:Twisted server for multiple clients用于多个客户端的 Twisted 服务器
【发布时间】:2011-01-05 13:32:31
【问题描述】:

我想用python(扭曲)编写一个可以接受多个客户端的服务器。我已经非常熟悉使用标准 python 套接字模块进行套接字编程,但是麻烦来了。 我认为扭曲真的很难进入,我已经阅读了一些关于它的教程。 但是我真的找不到一个可以接受多个连接的简单套接字服务器。有人可以帮忙吗?如果我在网上错过了一些有价值的信息,请告诉我,因为我正在拔头发..

非常感谢任何帮助,

安第斯

【问题讨论】:

  • 安德鲁,我认为这个问题与安德赛提出的问题不同。我觉得安德赛的问题很基本。如果我错了,请纠正我。

标签: python twisted


【解决方案1】:

说,你想在端口 9000 上运行一个接受客户端连接的服务器:

from twisted.internet import reactor, protocol

PORT = 9000

class MyServer(protocol.Protocol):
    pass

class MyServerFactory(protocol.Factory):
    protocol = MyServer

factory = MyServerFactory()
reactor.listenTCP(PORT, factory)
reactor.run()

如果你想测试连接到这个服务器,这里是客户端的代码(在不同的终端启动):

from twisted.internet import reactor, protocol

HOST = 'localhost'
PORT = 9000

class MyClient(protocol.Protocol):
    def connectionMade(self):
        print "connected!"

class MyClientFactory(protocol.ClientFactory):
    protocol = MyClient

factory = MyClientFactory()
reactor.connectTCP(HOST, PORT, factory)

reactor.run()

您会注意到代码非常相似,只是我们将 Factory 用于服务器,将 ClientFactory 用于客户端,并且服务器需要侦听 (listenTCP) 而客户端需要连接 (connectTCP)。祝你好运!

【讨论】:

  • 我会说,一个终端中的服务器代码并打开多个新终端并尝试使用nc localhost 9000telnet localhost 9000进行连接。首先使用标准客户端会有所帮助。
  • 感谢这个很棒的例子..我认为这正是我所需要的..不过我有一个问题..在“class MyServer(protocol.Protocol)”下的服务器示例中,你写了一个通行证声明..为什么这个类什么都没有?
  • 我将如何发送和接收数据?
  • 一个工厂类需要一个伴随协议类,所以这就是它被定义的原因。因为它是一个准系统协议,所以它是空的,但你可以在那里重载协议方法:-)
  • 用于发送数据:在协议方法中使用 self.transport.write('your data here')。用于接收:实现 dataReceived 方法(来自协议接口)。查看其他答案中给出的教程,它们会对您有所帮助。
【解决方案2】:

我想,你没有得到扭曲的本质。如果您创建一个扭曲的套接字服务器,则默认情况下可以通过多个客户端进行连接。我会按顺序推荐以下教程,然后阅读扭曲的文档。编写这些教程中给出的小 sn-ps 以了解实际发生的情况。

  1. Dave Peticola's twisted tutorial
  2. Itamar Shtull-Trauring's twisted presentation

【讨论】:

    【解决方案3】:

    本教程是学习如何从头开始编写扭曲服务器的绝佳(最佳)起点: http://twistedmatrix.com/documents/current/core/howto/tutorial/index.html

    【讨论】:

      【解决方案4】:

      Twisted 是一个很棒的框架,但这(通常)意味着对于简单的事情它可能是相当困难的......

      这是事实。如果需要,您需要编写一个实现Resource 的类,一个 LineReceiver,然后将其附加到反应器:

      reactor.connectTCP(<HOST>, <PORT>, istance_of_your_class)
      

      【讨论】:

      • 经过反思,这个答案根本没有任何意义。您已将 'resource' 链接到 'ClientFactory',我看不出 connectTCPall 的提问者的问题有何关联; “接受多个客户端”听起来像提问者正在编写 服务器 而不是客户端。资源仅与 HTTP 相关,LineReceiver 与任何事物有什么关系,您在谈论拥有哪个类的实例?
      猜你喜欢
      • 2013-07-30
      • 2013-12-24
      • 2011-07-24
      • 2019-07-16
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      • 2013-03-25
      • 2016-02-14
      相关资源
      最近更新 更多