2

我有一个 Twisted 套接字,我试图在多个端口上运行。以下代码以前对我有用,但那是大约 1 个月前,因为如果我没记错的话,我从那以后就没有接触过代码。现在,在我的 Twisted 程序中重新输入代码后,它不再工作了。

class Socket(Protocol):
    table = Table()

    def connectionMade(self):
        #self.transport.write("""connected""")
        self.factory.clients.append(self)
        print "Clients are ", self.factory.clients

    def connectionLost(self, reason):
        self.factory.clients.remove(self)

    def dataReceived(self, data):
        #print "data is ", data
        a = data.split(':')
        if len(a) > 1:
            command = a[0]
            content = a[1]

            if command == "Number_of_Players":
                msg = table.numberOfPlayers


        print msg

        for c in self.factory.clients:
                c.message(msg)

    def message(self, message):
        self.transport.write(message)

NUM_TABLES = 10

factories = [ ]
for i in range(0, NUM_TABLES):
    print i
    factory = Factory()
    factory.protocol = Socket
    factory.clients = []
    factories.append(factory)
    reactor.listenTCP(1025+i, factory)
    #print "Blackjack server started"
    reactor.run()

它通常会在我设置的范围内打印 Blackjack 服务器启动的次数,但现在不会。为了测试它是否循环,我开始打印 i,但它只打印了 0。由于某种原因,for 循环只循环了 1 次。

有什么建议么?谢谢!

4

3 回答 3

5

扭曲的程序通常只reactor运行一个。请记住,当您启动 ( .run()) 反应器时,执行会在反应器循环内部进行(并且您在代码中定义的各种事件,如connectionMade()connectionLost()dataReceived()等在相应的操作发生时被触发)。之后的任何代码都reactor.run()只会在 reactor 停止后执行。

因此,您的代码永远不会通过for循环的第一次迭代。

尝试移出reactor.run()循环:

NUM_TABLES = 10

factories = [ ]
for i in range(0, NUM_TABLES):
    print i
    factory = Factory()
    factory.protocol = Socket
    factory.clients = []
    factories.append(factory)
    reactor.listenTCP(1025+i, factory)

# print "Blackjack server started"

reactor.run()

# whatever code you put here, is executed only **after reactor has stopped**
于 2012-06-02T22:13:21.037 回答
2

您是否收到任何类型的错误消息?您的基本循环没有任何问题。我建议注释掉下面的所有行print i,然后有选择地添加它们直到循环停止 - 这会告诉你是什么导致了问题(显然第二次打印不是问题)

也许listenTCP()正在挂起等待连接?

或者,您正在调用的某个函数中可能存在某种无限循环。确定没有看到其他代码的唯一方法是通过注释掉可疑代码并将其重新添加来消除可能的问题。

更新:根据您的新信息,问题显然出在reactor.run(). 如果代码足够独立,您可以将其发布以供检查。

中的两个潜在问题reactor.code(),一个无限循环,或者程序正在等待某种事件/输入

循环可能是无限的,即编码不正确,因此它开始但从不终止。这看起来好像程序正在暂停/停止(即使 CPU 疯狂地运转)。或者,如果程序正在等待某个输入/事件,它可能会暂停。

于 2012-06-02T21:30:07.797 回答
1

在您到达调试打印之前引发了异常。

通过用try: ... except.

try:
       reactor.listenTCP(1025+i, factory)
except IOError as (errno, strerror):
    print "I/O error({0}): {1}".format(errno, strerror)
except:
    print "something else happened"
于 2012-06-02T21:30:18.120 回答