Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to forward a websocket server in localhost with ngrok

I' trying to run a websocket server on local host and forward it to web using ngrok. But couldn't figure it how. These are the original code's from AutobahnPython git repository https://github.com/tavendo/AutobahnPython.

Server code:

from autobahn.twisted.websocket import WebSocketServerProtocol, \
                                       WebSocketServerFactory


class MyServerProtocol(WebSocketServerProtocol):

   def onConnect(self, request):
      print("Client connecting: {0}".format(request.peer))

   def onOpen(self):
      print("WebSocket connection open.")

   def onMessage(self, payload, isBinary):
      if isBinary:
         print("Binary message received: {0} bytes".format(len(payload)))
      else:
         print("Text message received: {0}".format(payload.decode('utf8')))

      ## echo back message verbatim
      self.sendMessage(payload, isBinary)

   def onClose(self, wasClean, code, reason):
      print("WebSocket connection closed: {0}".format(reason))



if __name__ == '__main__':

   import sys

   from twisted.python import log
   from twisted.internet import reactor

   log.startLogging(sys.stdout)

   factory = WebSocketServerFactory("ws://localhost:9000", debug = False)
   factory.protocol = MyServerProtocol

   reactor.listenTCP(9000, factory)
   reactor.run()

Client Code:

from autobahn.twisted.websocket import WebSocketClientProtocol, \
                                       WebSocketClientFactory



class MyClientProtocol(WebSocketClientProtocol):

   def onConnect(self, response):
      print("Server connected: {0}".format(response.peer))

   def onOpen(self):
      print("WebSocket connection open.")

      def hello():
         self.sendMessage(u"Hello, world!".encode('utf8'))
         self.sendMessage(b"\x00\x01\x03\x04", isBinary = True)
         self.factory.reactor.callLater(1, hello)

      ## start sending messages every second ..
      hello()

   def onMessage(self, payload, isBinary):
      if isBinary:
         print("Binary message received: {0} bytes".format(len(payload)))
      else:
         print("Text message received: {0}".format(payload.decode('utf8')))

   def onClose(self, wasClean, code, reason):
      print("WebSocket connection closed: {0}".format(reason))



if __name__ == '__main__':

   import sys

   from twisted.python import log
   from twisted.internet import reactor

   log.startLogging(sys.stdout)

   factory = WebSocketClientFactory("ws://localhost:9000", debug = False)
   factory.protocol = MyClientProtocol

   reactor.connectTCP("127.0.0.1", 9000, factory)
   reactor.run()

This is the changed code:

from autobahn.twisted.websocket import WebSocketClientProtocol, \
                                       WebSocketClientFactory



class MyClientProtocol(WebSocketClientProtocol):

   def onConnect(self, response):
      print("Server connected: {0}".format(response.peer))

   def onOpen(self):
      print("WebSocket connection open.")

      def hello():
         self.sendMessage(u"Hello, world!".encode('utf8'))
         self.sendMessage(b"\x00\x01\x03\x04", isBinary = True)
         self.factory.reactor.callLater(1, hello)

      ## start sending messages every second ..
      hello()

   def onMessage(self, payload, isBinary):
      if isBinary:
         print("Binary message received: {0} bytes".format(len(payload)))
      else:
         print("Text message received: {0}".format(payload.decode('utf8')))

   def onClose(self, wasClean, code, reason):
      print("WebSocket connection closed: {0}".format(reason))



if __name__ == '__main__':

   import sys

   from twisted.python import log
   from twisted.internet import reactor

   log.startLogging(sys.stdout)

   #~ factory = WebSocketClientFactory("ws://localhost:9000", debug = False)
   factory = WebSocketClientFactory("ws://ngrok.com:xxxxx", debug = False)

   factory.protocol = MyClientProtocol

   reactor.connectTCP("ws://ngrok.com", xxxxx, factory)
   reactor.run()

This is the ngrok command: ./ngrok -proto=tcp 9000

What am I doing wrong here?

like image 606
AEla Avatar asked Apr 03 '14 07:04

AEla


People also ask

Does Ngrok work with Websockets?

Using ngrok with WebsocketsWebsocket endpoints work through ngrok's HTTP tunnels without any changes. However, there is currently no support for introspecting websockets beyond the initial 101 Switching Protocols response.

Does Ngrok do port forwarding?

No port forwarding, no dynamic DNS, no VPN. Access IoT devices in the field. Connect to your customers' private-cloud software in seconds.

How do I send a WebSocket message to a server?

The client-side WebSocket object has a . send() method that is used to send a message from the client to the server over the WebSocket connection between them. This . send() method accepts a single argument: the data to be sent to the server.


1 Answers

I tried using

ngrok http 8091

(where 8091 is the port where my WebsocketServer is running using Racthet IO) and it works. I can still connect to the Websocket replacing the http with ws on the connection.

like image 88
Alvaro Flaño Larrondo Avatar answered Oct 11 '22 16:10

Alvaro Flaño Larrondo