Websocket/TCP proxy with autobahn and twisted
Question: I am trying to write a proxy with autobahn and twisted. When a websocket
client connects I want to open a TCP connection to a server. What I can't seem
to figure out is how to pass data received via the TCP connection back to the
websocket client.

    
    
    #!/usr/bin/env python
    
    from twisted.internet.protocol import ClientFactory
    from twisted.protocols.basic import Int32StringReceiver
    from twisted.internet import reactor
    from twisted.python import log
    from autobahn.websocket import WebSocketServerFactory, \
                                   WebSocketServerProtocol, \
                                   listenWS
    import sys
    
    class ServerClient(Int32StringReceiver):
        structFormat = "!I"
    
        def __init__(self):
            self.filter = "{\"exporterip\": \"1.2.3.4\"}"
    
        def connectionMade(self):
            self.sendString(self.filter)
    
        def stringReceived(self, string):
            print "Received data %s" % (string)
    
    class ServerClientFactory(ClientFactory):
        protocol = ServerClient
    
        def clientConnectionFailed(self, connector, reason):
            print 'connection failed:', reason.getErrorMessage()
            reactor.stop()
    
        def clientConnectionLost(self, connector, reason):
            print 'connection lost:', reason.getErrorMessage()
            reactor.stop()
    
    class WSServerProtocol(WebSocketServerProtocol):
    
    def onOpen(self):
        print "Websocket connection opened"
        tcpfactory = ServerClientFactory()
        reactor.connectTCP('localhost', 9876, tcpfactory)
    
    def onClose(self):
        print "Websocket connection closed"
    
    def onMessage(self, msg, binary):
        print "Websocket message received"
    
    def main():
        log.startLogging(sys.stdout)
    
        wsfactory = WebSocketServerFactory("ws://localhost:9000", debug = False)
        wsfactory.protocol = WSServerProtocol
        listenWS(wsfactory)
    
        reactor.run()
    
    if __name__ == '__main__':
        main()
    


Answer: in your WSServerProtocol class, in the onMessage thread :

    
    
    def onMessage(self, msg, binary):
        self.sendMessage(msg)
    

