Способ передачи данных с сервера всем клиентам с помощью python twisted [duplicate]

У меня есть другая перспектива ответить на это.

При работе на разных уровнях, например, в приложении MVC, контроллеру нужны службы для вызова бизнес-операций. В таких сценариях контейнер инжекции зависимостей может использоваться для инициализации служб, чтобы исключить исключение NullReferenceException. Это означает, что вам не нужно беспокоиться о проверке нулевого значения и просто вызвать службы с контроллера, как будто они всегда будут доступны (и инициализированы) как одиночный или прототип.

public class MyController
{
    private ServiceA serviceA;
    private ServiceB serviceB;

    public MyController(ServiceA serviceA, ServiceB serviceB)
    {
        this.serviceA = serviceA;
        this.serviceB = serviceB;
    }

    public void MyMethod()
    {
        // We don't need to check null because the dependency injection container 
        // injects it, provided you took care of bootstrapping it.
        var someObject = serviceA.DoThis();
    }
}
5
задан SpankMe 17 September 2010 в 19:19
поделиться

3 ответа

Я думаю, что ваш комментарий выше по правильной линии - вам нужно иметь ссылку или «дескриптор» для объекта, которому вы хотите отправить данные.

Другими словами, отправляющий фабричный объект должен иметь ссылку для принимающего фабричного объекта, если вы хотите использовать связь объекта с объектом - то есть вызовы методов. Один из способов добиться этого - это то, что имя принимающей фабрики должно быть отправлено на фабрику отправки при инициализации.

Это не всегда очевидно из примеров, но фабрика может иметь данные, переданные ей при ее инициализации , Например, в приведенном выше примере строка, которая создает MultiEchoFactory, может быть изменена на:

 reactor.listenTCP(4321, MultiEchoFactory(someOtherObject))

и сам объект MultiEchoFactory, модифицированный в его методе init:

class MultiEchoFactory(Factory):
    protocol = MultiEcho
    def __init__(self, otherObjectReference):
        self.echoers = []
        self.otherObject = otherObjectReference

Теперь вы ссылаются на другой объект и методы вызова на нем.

Другой подход может состоять в том, чтобы иметь полностью отдельный объект, которому все ваши заводы ссылаются на инициализацию и который действует как своего рода " искать "сервер для ссылок на объекты, когда один объект хочет поговорить с другим. Эта функция может быть предоставлена ​​функцией, если вы предпочитаете не использовать объект.

0
ответ дан Mick 27 August 2018 в 18:10
поделиться

Заводы - это просто объекты. Чтобы передавать данные от одного к другому, вы определяете и вызываете методы и передаете данные в качестве параметра или устанавливаете атрибуты. Я думаю, что этот вопрос faq поможет вам:

Как мне сделать ввод одного результата соединения на выходе другим?

Кажется, что это вопрос с Twisted, но на самом деле это вопрос Python. Каждый объект Protocol представляет одно соединение; вы можете вызвать его transport.write, чтобы записать в него некоторые данные. Это обычные объекты Python; вы можете поместить их в списки, словари или любую другую структуру данных, подходящую для вашего приложения.

В качестве простого примера добавьте список на свой завод, а в connectionMade и connectionLost , добавьте его и удалите из этого списка. Вот код Python:

from twisted.internet.protocol import Protocol, Factory
from twisted.internet import reactor

class MultiEcho(Protocol):
    def connectionMade(self):
        self.factory.echoers.append(self)
    def dataReceived(self, data):
        for echoer in self.factory.echoers:
            echoer.transport.write(data)
    def connectionLost(self, reason):
        self.factory.echoers.remove(self)

class MultiEchoFactory(Factory):
    protocol = MultiEcho
    def __init__(self):
        self.echoers = []

reactor.listenTCP(4321, MultiEchoFactory())
reactor.run()
6
ответ дан nosklo 27 August 2018 в 18:10
поделиться

Как я это делаю, создавая класс контейнера.

from twisted.internet.protocol import Protocol, Factory
from twisted.internet import reactor

class QOTD(Protocol):

    def connectionMade(self):
        self.factory.message_siblings("Got a client")
        self.transport.loseConnection()

class MyFactory(Factory):
    protocol = QOTD
    def __init__(self,root,name):
        self.clients = []
        self.root = root
        self.name = name
        #self.root.add_child(name,self)
    def message_siblings(self,message):
        self.root.message_children(self.name,message)
    def message_sibling(self,message):
        self.root.message_child(self.name,message)  
    def get_message(self,name,message):
        #do something here
        print name,message



class Container(object):
    def __init__(self):
        self.servers = {}
    def add_child(self,obj,name):
        self.servers[name] = obj(self,name)
    def message_children(self,name,message):
        for server in self.servers:
            if server != name:
                self.servers[server].get_message(name,message)
    def message_child(self,name,message):
        if name in self.servers.keys():
            self.servers[server].get_message(name,message)

container = Container()
container.add_child(MyFactory,'test')
container.add_child(MyFactory,'test2')
reactor.listenTCP(8007, container.servers['test'])
reactor.listenTCP(8008, container.servers['test2'])
reactor.run()

Это может быть не лучший метод, но он работает и позволяет использовать некоторую гибкость

0
ответ дан tomfmason 27 August 2018 в 18:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: