1

服务器.py

 # This is the Twisted Fast Poetry Server, version 1.0

    import optparse, os

    from twisted.internet.protocol import ServerFactory, Protocol


    def parse_args():
        usage = """usage: %prog [options] poetry-file

    This is the Fast Poetry Server, Twisted edition.
    Run it like this:

      python fastpoetry.py <path-to-poetry-file>

    If you are in the base directory of the twisted-intro package,
    you could run it like this:

      python twisted-server-1/fastpoetry.py poetry/ecstasy.txt

    to serve up John Donne's Ecstasy, which I know you want to do.
    """

        parser = optparse.OptionParser(usage)

        help = "The port to listen on. Default to a random available port."
        parser.add_option('--port', type='int', help=help)

        help = "The interface to listen on. Default is localhost."
        parser.add_option('--iface', help=help, default='localhost')

        options, args = parser.parse_args()

        if len(args) != 1:
            parser.error('Provide exactly one poetry file.')

        poetry_file = args[0]

        if not os.path.exists(args[0]):
            parser.error('No such file: %s' % poetry_file)

        return options, poetry_file


    class PoetryProtocol(Protocol):

        def __init__(self, factory):
            self.factory = factory

        def connectionMade(self):
            self.factory.pushers.append(self)
            #self.transport.write("self.factory.poem")
            #self.transport.write(self.factory.poem)
            #self.transport.loseConnection()



    class PoetryFactory(ServerFactory):

        #protocol = PoetryProtocol


        def __init__(self, poem):
            self.poem = poem
            self.pushers = []#

        def buildProtocol(self, addr):
            return PoetryProtocol(self)



    def main():
        options, poetry_file = parse_args()

        poem = open(poetry_file).read()

        factory = PoetryFactory(poem)


        from twisted.internet import reactor

        port = reactor.listenTCP(options.port or 0, factory,
                                 interface=options.iface)

        print 'Serving %s on %s.' % (poetry_file, port.getHost())

        reactor.run()

        factory.pushers[0].transport.write("hey")#########why is this message not received on the client?




    if __name__ == '__main__':
        main()

当建立连接时,我创建了一个称为协议推送器(在工厂中)的列表。当我尝试写入它时,消息没有到达客户端收到的数据中。为什么?

4

1 回答 1

0

您在运行反应器后立即调用factory.pushers[0].transport.write,但协议实例仅在客户端连接到您的服务器时才添加到工厂推送列表中

如果您想在建立连接时写入客户端,请取消注释 connectionMade 处理程序中的第二行:

    def connectionMade(self):
        self.factory.pushers.append(self)
        self.transport.write("hey")
于 2013-04-28T13:58:08.450 回答