如何在Twisted Python中从服务器发送列表到客户端?
我正在用Twisted Python做一个多客户端聊天服务器程序。在我的程序里,如果一个客户端发送“list”这个指令,服务器就应该把连接的客户端列表发回给这个客户端。另外,当我们从一个客户端发送“talk clientname message”时,服务器也应该把这个消息发送给指定的“clientname”客户端。但是我的代码没有正常工作,服务器里有错误。它没有显示客户端列表,而且“talk”功能也不行。
下面是我的服务器代码:
class MultiEcho(Protocol):
def __init__(self, factory):
self.factory = factory
def connectionMade(self):
self.factory.clients.append(self)
def dataReceived(self,data):
data = data.strip()
if (data == "list"):
for client in self.factory.clients:
print self.factory.clients
self.transport.write(self.factory.clients)
else:
data = data.split()
if (len(data) > 1):
l = data[1]
m = data[2]
l.transport.write(m)
def connectionLost(self,reason):
self.factory.clients.remove(self)
class MultiEchoFactory(Factory):
def __init__(self):
self.clients = []
def buildProtocol(self, addr):
return MultiEcho(self)
if __name__ == '__main__':
import sys
if len(sys.argv) != 4:
print "Sorry.. not correct.. Try Again!"
sys.exit(1)
else:
if (sys.argv[1] == "chatserver") and (sys.argv[2] == "-p"):
PORT = sys.argv[3]
reactor.listenTCP(8000, MultiEchoFactory())
reactor.run()
有没有人能给我个解决办法呢?
1 个回答
1
- 你不能指望
dataReceived()
能收到多少数据。你可能需要从LineReceiver
这个类去继承,然后使用lineReceived()
来逐行处理输入的数据。 transport.write()
接受的是字符串,而不是列表。
你需要为每个客户端定义一个 clientname
,比如说,一个工厂应该能够根据名字找到对应的客户端。然后你可以在 LineReceived()
中这样做:
command, _, rest = line.partition(command_separator)
if command == "talk":
clientname, _, message = rest.partition(arg_separator)
self.factory.getClient(clientname).sendLine(message)