[Twisted-Python] Server/Client

Christian Simms christian.simms at gmail.com
Thu Jun 21 09:19:32 MDT 2007


On 6/20/07, Delgado, Edgardo CIV NAVAIR 4.1.4.3 <edgardo.delgado at navy.mil>
wrote:
>
> Here's the code:
>
> from twisted.internet.protocol import ServerFactory, ClientFactory,
> Protocol, ClientCreator
> from twisted.protocols.basic import LineReceiver
> from twisted.application.service import Service, Application,
> IServiceCollection
> from twisted.application.internet import TCPServer, TCPClient
> from twisted.internet.stdio import StandardIO
> from twisted.internet import reactor
> import re
>
> class DnLinkProtocol(LineReceiver):
>
>     def connectionMade(self):
>         self.sendLine("Connected from: " + "host " +
>                              str(self.transport.getPeer().host) + " " +
>                              "port " +
>                              str(self.transport.getPeer().port) + '\n')
>
>     def lineReceived(self, line):
>         self.sendLine("DnLink echo: " + line + '\n')
>
> class DSPEProtocol(LineReceiver):
>
>     def connectionMade(self):
>         self.sendLine("Connected from: " + "host " +
>                              str(self.transport.getPeer().host) + " " +
>                              "port " +
>                              str(self.transport.getPeer().port) + '\n')
>
>     def lineReceived(self, line):
>         self.sendLine("DSPE echo: " + line + '\n')
>
> class PAPSExecService(Service):
>
>     def getDnLinkInFactory(self):
>         f = ServerFactory()
>         f.protocol = DnLinkProtocol
>         f.startService = self.startService
>         return f
>
>     def getDSPEInFactory(self):
>         f = ServerFactory()
>         f.protocol = DSPEProtocol
>         f.startService = self.startService
>         return f
>
> application = Application('PAPSExec')
> f = PAPSExecService()
> serviceCollection = IServiceCollection(application)
> TCPServer(9595,
> f.getDnLinkInFactory()).setServiceParent(serviceCollection)
> TCPServer(8585,
> f.getDSPEInFactory()).setServiceParent(serviceCollection)
>
>
> I would like that, for example, when data is received in port 9595 it
> will forward the data to another server in port xxxx.
> Where would I create a TPC Client connection?
> Where would I send the message?
>
> Edgar
>
> -----Original Message-----
> From: twisted-python-bounces at twistedmatrix.com
> [mailto:twisted-python-bounces at twistedmatrix.com] On Behalf Of Christian
> Simms
> Sent: Wednesday, June 20, 2007 11:01 AM
> To: Twisted general discussion
> Subject: Re: [Twisted-Python] Server/Client
>
> On 6/20/07, Delgado, Edgardo CIV NAVAIR 4.1.4.3
> <edgardo.delgado at navy.mil> wrote:
>
>         I would like to build a server that when it gets a message on a
> specific
>         port it will "forward" that message to another port.
>         I.e. "Server1" listens on port 10000. When it gets data on port
> 10000 it
>         will forward the data to "Server2" listening on port 15000.
>
>
> Assuming you're using TCP, you could just create a server listening on a
> port using reactor.listenTCP(port, factory) as detailed here
> <http://twistedmatrix.com/projects/core/documentation/howto/servers.html
> >  and when you receive a message you would create a client using
> reactor.connectTCP(host, port, factory) as detailed here
> <http://twistedmatrix.com/projects/core/documentation/howto/clients.html
> >  to then send the message.
>
> Cheers,
> Christian


Assuming you want to create a new connection every time a client connects to
your port 9595, it's slightly tricky because you can't just forward the data
as soon as you get it, since the connection to the other server may not be
created yet.  A relatively complex way is explained in the Python Cookbook
in article "Hex-dump port-forwarding network proxy
server"<http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/502293>,
where it queues up the data until the outgoing connection is made.  A
simpler way is used in twisted.protocols.portforward.ProxyFactory/ProxyServer,
where it just pauses receiving data until the outgoing connection is made.
I found a Python mailing list
entry<http://mail.python.org/pipermail/python-list/2003-June/212102.html>which
explains how to override the portforward's methods.

Cheers,
Christian
-------------- next part --------------
An HTML attachment was scrubbed...
URL: </pipermail/twisted-python/attachments/20070621/78927286/attachment.html>


More information about the Twisted-Python mailing list