我想要做的是在每个端口(1025+)上运行以下脚本。我正在做的是制作一个 Blackjack iPhone 应用程序,与此脚本交互以进行在线游戏。问题是,我想通过更改端口来手动将其放在每个端口上,以每次监听所有端口。我怎样才能做到每个端口上都有一个新表。每张牌 table 都有一个 ID,应用程序将检查该 ID 以了解玩家数量以及牌 table 上的人员。
套接字设置了 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()
最佳答案
回答您的问题
你问:
- 如何使该脚本在每个端口上运行?
- 如何自行更改监听端口?
- 如何让 python 在每个端口上自行创建所有表?
我认为这里的答案是简单地使用循环将工厂绑定(bind)到所需数量的端口。 但是,由于您还在工厂中存储了客户端列表,因此您还需要为到达端口创建一个新工厂。所以像这样:
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,这样它就不会意外地破解/干扰不再属于它的游戏,等等。
关于python - 在多个端口上运行套接字脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10569551/