簡體   English   中英

將在一個扭曲工廠中收到的數據發送到第二工廠

[英]Sending data received in one Twisted factory to second factory

我正在嘗試使用Twisted框架編寫一個簡單的程序,而我正努力解決(甚至無法想象如何編寫)問題,但是我找不到以下任何相關文檔:

主反應堆使用兩個工廠,一個是自定義工廠,用於偵聽給定端口(例如8000)上的TCP連接,第二個工廠登錄到給定的IRC服務器和通道。 在工廠上以8000的速度接收數據(簡單的一行文本)后,我需要將該數據傳遞給第二個工廠,以便可以對其進行相應的處理-將帶有該文本的消息發送到通道,或者發送私有消息對某些人來說,那現在並不重要。 我找不到任何從第一工廠獲取數據並將其發送到另一工廠進行處理的方法(可能就像第二IRC工廠通常收到的連接一樣?)。

如果可以通過某種方式解決此問題,那么我想添加一個或多個工廠(例如,Jabber)以將在端口8000上接收到的數據一次發送給所有工廠,並將其相應地傳遞給協議(將IRC傳遞給某個通道,聯絡Jabber,依此類推)。

是否有人遇到類似問題並願意給我一些建議,甚至願意分享一些代碼行? 任何幫助將不勝感激!

提前致謝。

工廠只是對象。 要將數據從一個傳遞到另一個,您可以定義和調用方法,然后將數據作為參數傳遞或設置屬性。 我認為這個常見問題將幫助您:

如何在一個連接上輸入結果而在另一個連接上輸出結果?

這似乎是一個扭曲的問題,但實際上是一個Python問題。 每個Protocol對象代表一個連接。 您可以調用其transport.write以向其中寫入一些數據。 這些是常規的Python對象; 您可以將它們放入列表,字典或適合您應用程序的任何其他數據結構。

作為一個簡單的示例,將一個列表添加到您的工廠,並在協議的connectionMadeconnectionLost ,將其添加到該列表並將其從該列表中刪除。 這是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() 

我認為您上面的評論是正確的-您需要為要將數據發送到的對象提供參考或“句柄”。

換句話說,如果要使用對象到對象的通信(即方法調用),則發送工廠對象必須具有接收工廠對象的引用。 一種實現方法是在初始化時將接收工廠的名稱傳遞給發送工廠。

從示例中並不總是很明顯,但是工廠可以在初始化時將數據傳遞給它。 例如,在上面的情況下,可以將創建MultiEchoFactory的行修改為:

 reactor.listenTCP(4321, MultiEchoFactory(someOtherObject))

而MultiEchoFactory對象本身在其init方法中進行了修改:

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

現在,您可以引用另一個對象並在其上調用方法。

另一種方法可能是擁有一個完全獨立的對象,所有工廠在初始化時都會得到一個引用,並且當一個對象想要與另一個對象交談時,它充當對象引用的一種“查找”服務器。 如果您不想使用對象,則可以通過一個函數來提供此功能。

我這樣做的方法是創建一個容器類。

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

這可能不是最好的方法,但它可以正常工作並具有一定的靈活性

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM