Как отправить список с сервера на клиент в скрученном питоне?

Я делаю программу многоклиентского чат-сервера на скрученном питоне. В моей программе, если мы отправляем «список» от одного клиента, сервер должен отправить этому клиенту список подключенных клиентов. Кроме того, когда мы отправляем «сообщение с именем клиента» от одного клиента, сервер должен отправить это сообщение целевому клиенту, указанному в «имя клиента». Но мой код не работает. есть ошибки на сервере. Не отображает список и также не работает разговор.

Код моего сервера приведен ниже:

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()   

Может ли кто-нибудь дать мне решение, пожалуйста


person Suruchi    schedule 30.11.2011    source источник


Ответы (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)
person jfs    schedule 30.11.2011
comment
Себастьян: У меня есть еще одно сомнение в моей вышеприведенной программе. Вы сказали мне, что transport.write() принимает строку, а не список. Это (transport.write()) работает, когда я меняю этот список на строку? Могу ли я использовать как lineReceived, так и dataReceived в одном протоколе? - person Suruchi; 30.11.2011
comment
Есть только одна линия. Итак, использовать ли мне transport.write()? - person Suruchi; 30.11.2011