python - traduccion - Cómo escribir un plugin Twisted client
twisted serie (3)
He usado twisted
para implementar un cliente. Funciona bien. Ahora quiero poder pasarle argumentos de línea de comando, así que necesito implementar un plugin twisted
. Realicé muchas búsquedas para encontrar recursos que mostrarían cómo convertir el programa a un complemento. Sin embargo, no pude encontrar exactamente lo que estaba buscando.
Aquí hay una parte relacionada de mi código client.py
:
import sys
import time
import os
import errno
import re
from stat import *
global runPath
runPath = ''/home/a02/Desktop/''
from twisted.python import log
from GlobalVariables import *
from twisted.internet import reactor, threads, endpoints
from time import sleep
from twisted.internet.protocol import ClientFactory# , Protocol
from twisted.protocols import basic
import copy
class MyChat(basic.LineReceiver):
def connectionMade(self):
print "Connected to the server!"
EchoClientFactory.buildClientObject(self.factory, self)
self.runPythonCommands = RunPythonCommands ()
return
def connectionLost(self, reason):
print "Lost Connection With Server!"
#self.factory.clients.remove(self)
#self.transport.loseConnection()
print ''connection aborted!''
#reactor.callFromThread(reactor.stop)
reactor.stop ()
return
def lineReceived(self, line):
#print "received", repr(line)
line = line.strip ()
if line == "EOF":
print "Test Completed"
self.factory.getLastReceivedMsg (line)
exeResult = self.runPythonCommands.runPythonCommand(line.strip())
self.sendLine(exeResult)
EchoClientFactory.lastReceivedMessage = ""
EchoClientFactory.clientObject[0].receivedMessages = []
return
def message (self, line):
self.sendLine(line)
#print line
return
class EchoClientFactory(ClientFactory):
protocol = MyChat
clientObject = []
lastReceivedMessage = ''''
def buildClientObject (self, newClient):
client = Client ()
self.clientObject.append(client)
self.clientObject[0].objectProtocolInstance = newClient
return
def getLastReceivedMsg (self, message):
self.lastReceivedMessage = message
self.clientObject [0].lastReceivedMsg = message
self.clientObject[0].receivedMessages.append (message)
return
def connectionLost (self):
reactor.stop()
return
def clientConnectionFailed(self, connector, reason):
print ''Connection failed. Reason:'', reason
connector.connect ()
return
Esto es lo que escribí para mi client_plugin.py
:
from zope.interface import implements
from twisted.python import usage
from twisted.plugin import IPlugin
from twisted.application.service import IServiceMaker
from twisted.application.internet import TCPServer
from twisted.spread import pb
from slave.client import EchoClientFactory,MyChat, Client, RunPythonCommands, MyError, line
class Options(usage.Options):
optParameters = [["port", "p", 8789, "The port number to listen on."], ["host", "h", "192.168.47.187", "The host to connect to"]]
class MyServiceMaker(object):
implements(IServiceMaker, IPlugin)
tapname = "echoclient"
description = "Echo Client"
options = Options
def makeService(self, options):
clientfactory = pb.PBServerFactory(EchoClientFactory ())
return TCPServer(options["host"],int(options["port"]), clientfactory)
serviceMaker = MyServiceMaker()
He usado la misma jerarquía de carpetas mencionada en la documentación. Como no he podido encontrar suficientes ejemplos de complementos en la web, estoy realmente atascado en este punto. Apreciaría cualquier ayuda. ¿Alguien podría decirme cómo cambiar el código? Gracias de antemano.
¿Deberías quizás estar usando los archivos tac
para ejecutarlo desde la línea de comandos?
http://twistedmatrix.com/documents/12.2.0/core/howto/application.html#auto5
Entonces, usar tu clase MyChat
debería ser más fácil en otro programa ...
Simplemente siga estos enlaces para obtener documentos y ayuda:
from __future__ import print_function
from twisted.internet import reactor
from twisted.web.client import Agent
from twisted.web.http_headers import Headers
agent = Agent(reactor)
d = agent.request(
''GET'',
''http://example.com/'',
Headers({''User-Agent'': [''Twisted Web Client Example'']}),
None)
def cbResponse(ignored):
print(''Response received'')
d.addCallback(cbResponse)
def cbShutdown(ignored):
reactor.stop()
d.addBoth(cbShutdown)
reactor.run()
Salida:
C:/Python27>python.exe twist001.py
Response received
MyServiceMaker().makeService
devolver un objeto de servicio principal desde su MyServiceMaker().makeService
. Intente agregar from twisted.internet import service
luego en makeService
agregue esto al principio: top_service = service.Multiservice()
Cree el servicio tcp_service = TCPServer(...)
: tcp_service = TCPServer(...)
al servicio superior: tcp_service.setServiceParent(top_service)
A continuación, devuelva el servicio superior: return top_service
También puede que necesite echar un vistazo a esta excelente serie de tutoriales de Dave Peticolas (el artículo n ° 16 es el que es útil para su problema)