在多个端口上运行套接字脚本

时间:2012-05-13 05:31:12

标签: python ios sockets twisted

我想要做的是在每个端口1025+上运行以下脚本。我正在做的是制作一个与该脚本交互的Blackjack iPhone应用程序,用于在线游戏。问题是,我想通过更改端口来手动将其放在每个端口上,以便每次都监听所有端口。我该怎么做才能在每个端口上都有一个新表。每个表都有一个ID,应用程序将检查该ID以查看玩家的数量以及谁在桌旁。

套接字设置Table类的ID,但我需要在多个端口上才能保持该表的运行并保存每个玩家的移动等。

最重要的是,如何在每个端口上运行此脚本,如何自行更改侦听端口,以及如何让python在每个端口上自行创建所有表?

class Table:
    def __init__(self, id):
        self.players = []
        self.positions = {'1': '', '2': '', '3': '', '4': ''}

    def sit(self, player_id, position):
        self.positions[position] = player_id

# --------------------------------------------- #
# --------------------------------------------- #


class Socket(Protocol):
    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]



            msg = ""

        print msg

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

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


factory = Factory()
factory.protocol = Socket
factory.clients = []

reactor.listenTCP(1025, factory)
print "Blackjack server started"
reactor.run()

1 个答案:

答案 0 :(得分:1)

回答您的问题

你问:

  • 如何在每个端口上运行此脚本?
  • 如何自行更改侦听端口?
  • 如何让python在每个端口上自行创建所有表?

我认为这里的答案是简单地使用循环将工厂绑定到任意数量的端口。 但是,由于您在工厂中也存储了客户列表,因此您还需要为到达端口创建一个新工厂。如下所示:

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

您正在使用类,因此每个工厂都有自己的客户端列表,每个客户端都有自己的Socket实例来管理连接。您没有显示实例化Table实例的方式,但只要每个Socket或Factory实例实例化并维护对Table的引用,这应该允许您拥有多个连接,每个连接都有自己的连接状态。

通过保留所有工厂的列表,您可以迭代它们以制作正在运行的游戏列表等。

考虑不同的架构

虽然上述方法可行,但并不是客户端 - 服务器系统通常是如何构建的。 特别是,您的系统需要您的客户端知道要使用的端口。当你们全都在起居室时,这可能是临时工作,但这很乏味,而且一般不会扩展。

你想要的东西,比如网络服务器,监听一个端口建立连接,然后告诉客户:“嘿,你的表ID是25,每当你想说话时都使用它”。此外,这意味着将一个表列表提供给客户端,以便他们可以选择一个。而且,你可以从那里获得更多的爱好:给客户一个特殊的过期cookie,以便它不会意外地破坏/打扰它不再属于的游戏等。