一个对等对象处理多个客户端
One peer object handle multiple clients
我有一个使用 TCP 和 Twisted 的服务器-客户端代码。我想要创建的第一个对等对象(按第一个连接的客户端的顺序) 服务(发送消息)未来即将到来的客户。因此,我保存了第一个对等点(全局列表)并将其用于所有即将到来的连接,但它仅服务于第一个客户端(它连接到)而忽略其他。
如何让对等端同时为所有连接的客户端提供服务?(我将针对不超过 3 个客户端进行测试 ).
def connectionMade(self):
global connectedList
if self.pt == 'client':
self.connected = True
else:
print "Connected from", self.transport.client
try:
self.transport.write('<connection up>')
except Exception, e:
print e.args[0]
self.ts = time.time()
reactor.callLater(5, self.sendUpdate)
connectedList.append(self.transport) # add peer object
def sendUpdate(self):
global updateCounter, connectedList
print "Sending update"
try:
updateCounter += 1
print(connectedList[0])
# Send updates through first connected peer
connectedList[0].write('<update ' + str(updateCounter) + '>')
except Exception, ex1:
print "Exception trying to send: ", ex1.args[0]
if self.connected == True:
reactor.callLater(5, self.sendUpdate)
to serve (send messages) future upcoming clients as well
这句话很难理解。我的解释是,您希望 sendUpdate
向除第一个客户端之外的所有客户端发送消息(按连接时间排序)。
but it only serves the first client
这同样困难。我的解释是您观察到只有第一个客户端(按连接时间排序)从服务器接收任何消息的行为。
这是您向客户发送消息的代码:
connectedList[0].write('<update ' + str(updateCounter) + '>')
请注意,此代码始终向 connectedList[0]
发送一条消息。也就是说,它只向一个客户端发送消息——不管有多少个——它总是选择[=14中的第一个客户端=](对应第一个连接到服务器的客户端)。
您可能想要更多这样的东西:
for c in connectedList[1:]:
c.write('<update ' + str(updateCounter) + '>')
注意这是如何向多个客户端发送消息的。
此外,与您的问题无关,您应该避免使用全局变量,并且应该避免使用裸露的 ITransport
作为您的协议接口。
我有一个使用 TCP 和 Twisted 的服务器-客户端代码。我想要创建的第一个对等对象(按第一个连接的客户端的顺序) 服务(发送消息)未来即将到来的客户。因此,我保存了第一个对等点(全局列表)并将其用于所有即将到来的连接,但它仅服务于第一个客户端(它连接到)而忽略其他。
如何让对等端同时为所有连接的客户端提供服务?(我将针对不超过 3 个客户端进行测试 ).
def connectionMade(self):
global connectedList
if self.pt == 'client':
self.connected = True
else:
print "Connected from", self.transport.client
try:
self.transport.write('<connection up>')
except Exception, e:
print e.args[0]
self.ts = time.time()
reactor.callLater(5, self.sendUpdate)
connectedList.append(self.transport) # add peer object
def sendUpdate(self):
global updateCounter, connectedList
print "Sending update"
try:
updateCounter += 1
print(connectedList[0])
# Send updates through first connected peer
connectedList[0].write('<update ' + str(updateCounter) + '>')
except Exception, ex1:
print "Exception trying to send: ", ex1.args[0]
if self.connected == True:
reactor.callLater(5, self.sendUpdate)
to serve (send messages) future upcoming clients as well
这句话很难理解。我的解释是,您希望 sendUpdate
向除第一个客户端之外的所有客户端发送消息(按连接时间排序)。
but it only serves the first client
这同样困难。我的解释是您观察到只有第一个客户端(按连接时间排序)从服务器接收任何消息的行为。
这是您向客户发送消息的代码:
connectedList[0].write('<update ' + str(updateCounter) + '>')
请注意,此代码始终向 connectedList[0]
发送一条消息。也就是说,它只向一个客户端发送消息——不管有多少个——它总是选择[=14中的第一个客户端=](对应第一个连接到服务器的客户端)。
您可能想要更多这样的东西:
for c in connectedList[1:]:
c.write('<update ' + str(updateCounter) + '>')
注意这是如何向多个客户端发送消息的。
此外,与您的问题无关,您应该避免使用全局变量,并且应该避免使用裸露的 ITransport
作为您的协议接口。