Is there any way to connect Python to a Websocket as a client?

Asked

Viewed 1,213 times

4

Modern browsers own the object Websocket, which allows you to make a connection to a Websocket server, allowing real-time communication.

My question is this::

  • Is there any library, in Python, that would allow me to connect to a Websocket, receiving and sending the data, as if it were the browser?
  • If not, it is possible to make an implementation that allows me to connect to a Websocket server?
  • 2

    It’s been a while since I’ve caught up to play with her, but I think the Twisted has how to do this.

2 answers

4


Yes, there is that (there must be more, maybe enumerate later):

Install via Pip:

pip install websocket-client

An example of use provided:

Note: ws://echo.websocket.org/ is a service for testing

import websocket

try:
    import thread
except ImportError:
    import _thread as thread

import time

def on_message(ws, message):
    print(message)

def on_error(ws, error):
    print(error)

def on_close(ws):
    print("### closed ###")

def on_open(ws):
    def run(*args):
        for i in range(3):
            time.sleep(1)
            ws.send("Hello %d" % i)
        time.sleep(1)
        ws.close()
        print("thread terminating...")
    thread.start_new_thread(run, ())


if __name__ == "__main__":
    websocket.enableTrace(True)
    ws = websocket.WebSocketApp("ws://echo.websocket.org/",
                              on_message = on_message,
                              on_error = on_error,
                              on_close = on_close)
    ws.on_open = on_open
    ws.run_forever()

Just for the sake of code detail, I believe this is for compatibility between Python2.7 and Python3:

try:
    import thread #python2, se falhar vai para o except
except ImportError:
    import _thread as thread #python3 para python3

If not, it is possible to make an implementation that allows me to connect to a Websocket server?

If a lib can do this then yes, it is possible to do this process manually as soon as possible you write explaining about the Handshake so you can give an explanation of how to create your own "client" for Websockets.

Response under construction...

2

I suggest using the aiohttp because it is asynchronous and so does not need threads:

async with session.ws_connect('ws://echo.websocket.org') as ws:
    await ws.send_str('Olá Websocket!')
    async for msg in ws:
        print('Recebi', msg.type, msg.data)
        if msg.type == aiohttp.WSMsgType.TEXT:
            if msg.data == 'Olá Websocket!':
                await ws.close()
                break
            else:
                await ws.send_str(msg.data + '/answer')
        elif msg.type == aiohttp.WSMsgType.ERROR:
            break

Browser other questions tagged

You are not signed in. Login or sign up in order to post.