ローカル コード ベース (クライアント部分) と通信するツイスト デーモン (サーバー部分) を作成しようとしています。基本的に、クライアントは 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)