1

あるポート (tcp 6666 など) でデータ (単純なテキスト メッセージ) をリッスンし、それらを 1 つまたは複数の異なるプロトコル (irc、xmpp など) に渡すプログラムを作成しようとしています。私は多くのアプローチを試し、インターネットを掘り下げましたが、そのようなタスクに対する簡単で実用的な解決策を見つけることができません。

私が現在戦っているコードはここにあります:http://pastebin.com/ri7caXih

次のようなオブジェクトからの方法を知りたいです。

ircf = ircFactory('asdfasdf', '#asdf666')

自己プロトコル メソッドへのアクセスを取得します。これは、次の理由によります。

self.protocol.dupa1(メッセージ)

self がアクティブなプロトコル オブジェクトに渡されていないというエラーを返します。または、複数のプロトコルを持つ単一のリアクターを作成し、メッセージがそれらのいずれかに到着したときにアクションをトリガーし、そのメッセージを他のプロトコルに渡して処理/処理/送信するための、より優れた、より簡単で、よりコーシャな方法があるでしょうか?

どんな助けでも大歓迎です!

4

3 に答える 3

5

ポート 9001 への複数の接続から読み取り、ポート 9000 の接続に書き出すサンプル コードを次に示します。XMPP、IRC、MSN などに対応する複数の「PutLine」実装が必要になります。

出力接続 PutLine を格納するためにグローバルを使用しましたが、代わりにこれを処理するより複雑な Factory オブジェクトを作成する必要があります。

#!/usr/bin/env python

from twisted.internet.protocol import Protocol, Factory
from twisted.internet.endpoints import clientFromString, serverFromString
from twisted.protocols.basic import LineReceiver
from twisted.internet import reactor

queue = []
putter = None

class GetLine(LineReceiver):
    delimiter = '\n'

    def lineReceived(self, line):
        queue.append(line)
        putter.have_data()
        self.sendLine(line)

class PutLine(LineReceiver):
    def __init__(self):
        global putter
        putter = self
        print 'putline init called %s' % str(self)

    def have_data(self):
        line = queue.pop()
        self.sendLine(line)


def main():
    f = Factory()
    f.protocol = PutLine
    endpoint = clientFromString(reactor, "tcp:host=localhost:port=9000")
    endpoint.connect(f)
    f = Factory()
    f.protocol = GetLine
    endpoint2 = serverFromString(reactor, "tcp:port=9001")
    endpoint2.listen(f)
    reactor.run()

if __name__ == '__main__':
    main()

テスト:

nc -l  9000
python test.py
nc 9001

任意の数の nc 9001 (または netcat 9001) から入力されたデータは、nc -l 9000 に表示されます。

于 2011-05-03T03:15:53.653 に答える
3

これは FAQ で回答されています。

http://twistedmatrix.com/trac/wiki/FrequentlyAskedQuestions#HowdoImakeinputononeconnectionresultinoutputonanother

于 2010-03-27T09:33:25.100 に答える
1

を参照してくださいdoc/core/examples/chatserver.py。そこで、とメソッドにフックを追加して、接続されたクライアントProtocolのリストを維持し、メッセージが到着するとすべてのクライアントを反復処理して渡します。connectionMadeconnectionLost

于 2010-03-26T18:31:11.353 に答える