2013-02-28 29 views
3

我创建了一个使用Twisted的自定义协议的服务器,并且我有连接到特定端口上的服务器(比如端口1234)的客户端。我正在寻找基于某种网页创建服务器的控制界面。迄今为止我的研究表明Nevow是流行的选择,但我只需要一些非常简单的东西。从Web界面控制基于Twisted的服务器?

比方说,每一个浏览器访问端口8080上的hello world页面的时候,我将消息发送给连接在1234

客户我有点困惑,我怎么能这两个连接在一起。我想我需要从HelloResource.render_GET调用Server.message?

from twisted.internet import protocol, reactor 
from twisted.web.resource import Resource 

    class Server(protocol.Protocol): 
     def dataReceived(self, data): 
      #do something on the server side 

     def message(self) 
      #send message to clients 

    class HelloResource(Resource): 
     isLeaf = True 

     def render_GET(self,request): 
      return "<html>Hello, world!</html>" 

factory = protocol.Factory() 
factory.protocol = Server 
reactor.listenTCP(1234, factory) 

reactor.listenTCP(8080, server.Site(HelloResource())) 

reactor.run() 

回答

1

如果你想这样做,你的Server.message显然必须是@classmethod,它必须能够访问客户列表,并将消息发送给它们中的每一个。

事情是这样的:

class Server(protocol.Protocol): 
    clients = set() 

    def dataReceived(self, data): 
     #do something on the server side 
     pass 

    def connectionMade(self): 
     Server.clients.add(self) 

    def connectionLost(self): 
     Server.clients.remove(self) 

    @classmethod 
    def message(cls): 
     for client in cls.clients: 
      client.transport.write('got GET request\n') 

现在你可以叫Server.message()render_GET方法。

我不确定这是否是最好的设计 - 真的,有各种更好的对象挂起客户端列表比协议类,但它应该工作。

+0

谢谢,这工作。 – MikeDW 2013-03-05 16:20:30

5

这与a question answered in the Twisted FAQ非常相似。

本质上,您需要使由工厂创建的协议实例可以访问组成Web服务器的资源。

一个简单的方法来做到这一点是让你的工厂保留协议实例的列表(了解buildProtocol如果您还没有),然后工厂实例传递给你的HelloResource初始化,然后有一个初始化保存工厂作为HelloResource实例的属性。

这将HelloResource访问一个协议实例列表 - 通过工厂对象的方式 - 它现在有一个引用 - 它可以迭代,例如,在每个协议实例上调用方法。