6

ローカル コード ベース (クライアント部分) と通信するツイスト デーモン (サーバー部分) を作成しようとしています。基本的に、クライアントは AMP を使用してデーモンに Remote() を呼び出し、いくつかの処理 (データベースの更新) を開始することになっています。サーバー上で各メソッドの処理が終了したら、ユーザーがサーバーの進行状況を把握できるように、サーバーからクライアントに Remote() を呼び出す必要があります。

クライアントからサーバーを呼び出して応答を得ることができましたが、サーバーからクライアントに応答を送信させることができません。

私は解決策を探しましたが、双方向通信に AMP を使用するサンプル コードが見つかりません。常にクライアントがサーバーを呼び出しています。

クライアントにサーバーを呼び出して処理を開始させ(ServerStart AMPコマンド)、サーバーに複数の呼び出しをクライアントに送信させて、処理の更新を提供しようとしています(MessageClient AMPコマンド)。

どんな助けでも大歓迎です。クライアントからサーバーを呼び出し、サーバーが 2 つの呼び出しをクライアントに返す方法を示す非常に単純な例は素晴らしいでしょう!

ampclient.py

from client_server import MessageServer, Client, ServerStart
from twisted.internet.protocol import ClientCreator
from twisted.internet import reactor
from twisted.protocols import amp
from time import sleep
from twisted.internet.protocol import Factory
from twisted.internet.endpoints import TCP4ServerEndpoint
from twisted.application.service import Application
from twisted.application.internet import StreamServerEndpointService

def startServerProcess():
    def show_start(result):
        print 'result from server: %r' % result

    d = ClientCreator(reactor, amp.AMP).connectTCP(
        '127.0.0.1', 1234).addCallback(
            lambda p: p.callRemote(ServerStart, truncate=True)).addCallback(
                show_start)    

pf = Factory()
pf.protocol = Client
reactor.listenTCP(1235, pf)
print 'client listening'

startServerProcess()

sleep(4)

reactor.run()

ampserver.py

from client_server import MessageClient, Server
from twisted.internet.protocol import ClientCreator
from twisted.internet import reactor
from twisted.protocols import amp
from time import sleep
from twisted.internet.protocol import Factory
from twisted.internet.endpoints import TCP4ServerEndpoint
from twisted.application.service import Application
from twisted.application.internet import StreamServerEndpointService

def makeClientCall():
    def show_result(result):
        print 'result from client: %r' % result     

    d = ClientCreator(reactor, amp.AMP).connectTCP(
        '127.0.0.1', 1235).addCallback(
            lambda p: p.callRemote(MessageClient)).addCallback(
                show_result)


application = Application("server app")

endpoint = TCP4ServerEndpoint(reactor, 1234)
factory = Factory()
factory.protocol = Server
service = StreamServerEndpointService(endpoint, factory)
service.setServiceParent(application)

sleep(4)

makeClientCall()
makeClientCall()

client_server.py

from twisted.protocols import amp
from twisted.internet import reactor
from twisted.internet.protocol import Factory
from twisted.internet.endpoints import TCP4ServerEndpoint
from twisted.application.service import Application
from twisted.application.internet import StreamServerEndpointService

class MessageServer(amp.Command):
    response = [('msg', amp.String())]

class ServerStart(amp.Command):
    arguments = [('truncate', amp.Boolean())]
    response = [('msg', amp.String())]

class Server(amp.AMP):
    def message_it(self):
        msg = 'This is a message from the server'
        print 'msg sent to client: %s' % msg
        return {'msg': msg}
    MessageServer.responder(message_it)

    def start_it(self, truncate):
        msg = 'Starting processing...'
        return {'msg': msg}
    ServerStart.responder(start_it)



class MessageClient(amp.Command):
    response = [('msg', amp.String())]

class Client(amp.AMP):
    def message_it(self):
        msg = 'This is a message from the client'
        return {'msg': msg}
    MessageClient.responder(message_it)
4

2 に答える 2

4

双方向 AMP クライアントとサーバーの簡単な例を次に示します。重要なのは、AMP プロトコル クラスがクライアント接続への参照を保持し、callRemoteメソッドを提供することです。

もちろん、これは AMP コードを掘り下げて知っているだけです。ねじれたドキュメントはせいぜい不足しており、少なくともコアの外では不足しています。

ファイル: count_server.tac

from twisted.protocols.amp import AMP
from twisted.internet import reactor
from twisted.internet.protocol import Factory
from twisted.internet.endpoints import TCP4ServerEndpoint
from twisted.application.service import Application
from twisted.application.internet import StreamServerEndpointService

from count_client import Counter

application = Application('test AMP server')

endpoint = TCP4ServerEndpoint(reactor, 8750)
factory = Factory()
factory.protocol = Counter
service = StreamServerEndpointService(endpoint, factory)
service.setServiceParent(application)

ファイル: count_client.py

if __name__ == '__main__':
    import count_client
    raise SystemExit(count_client.main())

from sys import stdout

from twisted.python.log import startLogging, err
from twisted.protocols import amp
from twisted.internet import reactor
from twisted.internet.protocol import Factory
from twisted.internet.endpoints import TCP4ClientEndpoint

class Count(amp.Command):
    arguments = [('n', amp.Integer())]
    response = [('ok', amp.Boolean())]

class Counter(amp.AMP):
    @Count.responder
    def count(self, n):
        print 'received:', n
        n += 1

        if n < 10:
            print 'sending:', n
            self.callRemote(Count, n=n)

        return {'ok': True}

def connect():
    endpoint = TCP4ClientEndpoint(reactor, '127.0.0.1', 8750)
    factory = Factory()
    factory.protocol = Counter
    return endpoint.connect(factory)

def main():
    startLogging(stdout)

    d = connect()
    d.addErrback(err, 'connection failed')
    d.addCallback(lambda p: p.callRemote(Count, n=1))
    d.addErrback(err, 'call failed')

    reactor.run()

サーバー出力:

$ twistd -n -y count_server.tac
2013-03-27 11:05:18-0500 [-] Log opened.
2013-03-27 11:05:18-0500 [-] twistd 12.2.0 (/usr/bin/python 2.7.3) starting up.
2013-03-27 11:05:18-0500 [-] reactor class: twisted.internet.epollreactor.EPollReactor.
2013-03-27 11:05:18-0500 [-] Factory starting on 8750
2013-03-27 11:05:18-0500 [-] Starting factory <twisted.internet.protocol.Factory instance at 0x2adc368>
2013-03-27 11:05:22-0500 [twisted.internet.protocol.Factory] Counter connection established (HOST:IPv4Address(TCP, '127.0.0.1', 8750) PEER:IPv4Address(TCP, '127.0.0.1', 58195))
2013-03-27 11:05:22-0500 [Counter,0,127.0.0.1] received: 1
2013-03-27 11:05:22-0500 [Counter,0,127.0.0.1] sending: 2
2013-03-27 11:05:22-0500 [Counter,0,127.0.0.1] received: 3
2013-03-27 11:05:22-0500 [Counter,0,127.0.0.1] sending: 4
2013-03-27 11:05:22-0500 [Counter,0,127.0.0.1] received: 5
2013-03-27 11:05:22-0500 [Counter,0,127.0.0.1] sending: 6
2013-03-27 11:05:22-0500 [Counter,0,127.0.0.1] received: 7
2013-03-27 11:05:22-0500 [Counter,0,127.0.0.1] sending: 8
2013-03-27 11:05:22-0500 [Counter,0,127.0.0.1] received: 9
2013-03-27 11:05:26-0500 [Counter,0,127.0.0.1] Counter connection lost (HOST:IPv4Address(TCP, '127.0.0.1', 8750) PEER:IPv4Address(TCP, '127.0.0.1', 58195))
^C2013-03-27 11:05:31-0500 [-] Received SIGINT, shutting down.
2013-03-27 11:05:31-0500 [-] (TCP Port 8750 Closed)
2013-03-27 11:05:31-0500 [-] Stopping factory <twisted.internet.protocol.Factory instance at 0x2adc368>
2013-03-27 11:05:31-0500 [-] Main loop terminated.
2013-03-27 11:05:31-0500 [-] Server Shut Down.

クライアント出力:

$ python count_client.py
2013-03-27 11:05:22-0500 [-] Log opened.
2013-03-27 11:05:22-0500 [-] Starting factory <twisted.internet.protocol.Factory instance at 0x246bf80>
2013-03-27 11:05:22-0500 [Uninitialized] Counter connection established (HOST:IPv4Address(TCP, '127.0.0.1', 58195) PEER:IPv4Address(TCP, '127.0.0.1', 8750))
2013-03-27 11:05:22-0500 [Counter,client] received: 2
2013-03-27 11:05:22-0500 [Counter,client] sending: 3
2013-03-27 11:05:22-0500 [Counter,client] received: 4
2013-03-27 11:05:22-0500 [Counter,client] sending: 5
2013-03-27 11:05:22-0500 [Counter,client] received: 6
2013-03-27 11:05:22-0500 [Counter,client] sending: 7
2013-03-27 11:05:22-0500 [Counter,client] received: 8
2013-03-27 11:05:22-0500 [Counter,client] sending: 9
^C2013-03-27 11:05:26-0500 [-] Received SIGINT, shutting down.
2013-03-27 11:05:26-0500 [Counter,client] Counter connection lost (HOST:IPv4Address(TCP, '127.0.0.1', 58195) PEER:IPv4Address(TCP, '127.0.0.1', 8750))
2013-03-27 11:05:26-0500 [Counter,client] Stopping factory <twisted.internet.protocol.Factory instance at 0x246bf80>
2013-03-27 11:05:26-0500 [-] Main loop terminated.
于 2013-03-27T16:21:33.663 に答える