如何在Twisted Python中从服务器发送列表到客户端?

2 投票
1 回答
1511 浏览
提问于 2025-04-17 07:22

我正在用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)

撰写回答