Sto provando a creare un demone contorto (la parte server) che comunica con il mio codice base locale (la parte client). Fondamentalmente, il client dovrebbe chiamare Remote() usando AMP per il demone per avviare alcuni processi (aggiornando il database) con alcuni metodi. Dopo che ciascun metodo ha terminato l'elaborazione sul server, ho bisogno del server per chiamareRemote() sul mio client in modo che l'utente conosca lo stato di avanzamento del server.Come creare la messaggistica bidirezionale usando AMP in Twisted/Python
Sono stato in grado di chiamare il server dal client e ottenere una risposta, ma non riesco a far sì che il server invii una risposta al client.
Ho cercato su Google una soluzione ma non riesco a trovare alcun codice di esempio che utilizzi AMP per la comunicazione bidirezionale: è sempre il client che chiama al server.
Sto tentando di richiamare il client sul server per avviare l'elaborazione (il comando AMP di ServerStart) e quindi chiedere al server di inviare più chiamate al client per fornire aggiornamenti sull'elaborazione (il comando AMP MessageClient).
Qualsiasi aiuto sarebbe GRANDE apprezzato. Un esempio semplicissimo che mostra come chiamare il server dal client e poi fare in modo che il server restituisca due chiamate al client sarebbe fantastico!
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)
Non c'è abbastanza dettaglio per rispondere a questa domanda. Allega un esempio completo e eseguibile che mostra ciò che hai provato e spiega come non ha funzionato. Per chiamare un metodo dal server devi solo chiamare 'client.callRemote (Command)' nel server, quindi non ho idea del motivo per cui non funzionerebbe per te. – Glyph
@Glyph - è sufficiente? Questo è il mio primo post su SO ... Sto eseguendo twistd -l server.log --pidfile server.pid -y ampserver.py e poi python ampclient.py. Sto cercando di ottenere che il server invii risposte multiple ma ottengo solo una risposta. Grazie per l'aiuto! – Scott
@Glyph: allegare la documentazione utilizzabile al progetto Twisted, quindi questo tipo di domande non verrà richiesto. :) –