2013-02-28 4 views
3

Я создал сервер с пользовательским протоколом, используя Twisted, и у меня есть клиенты, которые подключаются к серверу на определенном порту (например, порт 1234). Я ищу создать интерфейс управления для сервера на основе какой-либо веб-страницы. Мои исследования пока показали, что Nevow - популярный выбор, но мне нужно только что-то очень простое.Управление сервером Twisted на основе веб-интерфейса?

Скажет, например, каждый раз, когда браузер обращается к мировой странице приветствия на порт 8080, я посылаю сообщение для клиентов, подключенных по 1234.

Я немного запутался, как я могу соединить эти 2 вместе. Я предполагаю, что мне нужно будет вызвать Server.message из HelloResource.render_GET?

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

5

Это очень похоже на a question answered in the Twisted FAQ.

По сути, вам необходимо сделать экземпляры протокола, созданные на заводе, доступными для ресурсов, составляющих ваш веб-сервер.

Простой способ сделать это, чтобы ваша фабрика хранила список экземпляров протокола (читайте об buildProtocol, если вы еще этого не сделали), а затем передайте заводской экземпляр на ваш инициализатор HelloResource, затем запустите его инициализатор как атрибут на примере HelloResource.

Это будет HelloResource доступ к списку экземпляров протокола - посредством фабричного объекта, на котором теперь имеется ссылка, - который он мог бы затем перебрать и, например, вызвать методы для каждого экземпляра протокола.

 Смежные вопросы

  • Нет связанных вопросов^_^