2

While using websocket client to send test messages to a django server, I cannot get a script to work which can both send and receive messages.

The following python script is what I have attempted:

import websocket
import threading
import json
from time import sleep

# handle message event
def on_message(ws, message):
    print("message recieved: %s" % message)

# handle close event
def on_close(ws):
    print("channel closed")

# execute as main script
if __name__ == "__main__":
    websocket.enableTrace(True)
    # new app object connecting to headstation
    ws = websocket.WebSocketApp("ws://192.168.0.106:8000/?testI123", on_message = on_message, on_close = on_close)
    # run in a new thread - kill if script ends
    ws_listener = threading.Thread(target=ws.run_forever())
    ws_listener.daemon = True
    # start second thread
    ws_listener.start()

    # attempt connection 5 times
    timeout = 5
    while not ws.sock.connected and timeout:
        sleep(1)
        timeout -= 1
    # error on timeout
    if (timeout == 0):
        print("Connection to server timed out") 

    print("test 1")
    # periodically send test message to server
    message_num = 0
    while ws.sock.connected:
        # send node id and message
        message = 'hello %d'%message_num
        ws.send(message)
        sleep(1)
        message_num += 1

This connections successfully, indicted by the server, and receives messages sent from the server, but does not send anything.

Periodically, something like this is displayed on the terminal:

send: b'\x8a\x84\xe2\xe9\xa8\xe2\x8f\xdc\xe2\x84'

If I simply use

ws = websocket.WebSocket()
ws.connect(url)
ws.send("hello")

then this works perfectly. Suggesting it is something wrong with my little python script displayed above.

1 Answer 1

1

Found the problem, stupid mistake of course:

 ws_listener = threading.Thread(target=ws.run_forever())

should be:

 ws_listener = threading.Thread(target=ws.run_forever)

without parentheses.

First one passes result of ws.run_forever to the target, second one sets ws.run_forever as the target, which was the intended outcome.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.