I am wanting to run a program in Python that sends a message every second via web sockets to a Tornado server. I have been using the example on websocket-client;
This example does not work, because
def on_message(ws, message):
def on_error(ws, error):
print "### closed ###"
if __name__ == "__main__":
ws = websocket.WebSocketApp("ws://echo.websocket.org/", on_message = on_message, on_error = on_error, on_close = on_close)
ws.on_open = on_open
#do other actions here... collect data etc.
for i in range(100):
ws.send("Hello %d" % i)
There's an example in their github page that does exactly that. It seems like you started out of that example and took the code that sends messages every second out of the on_open and pasted it after the run_forever call, that BTW runs until the socket is disconnected.
Maybe you are having issues with the basic concepts here. There's always going to be a thread dedicated to listening to the socket (in this case the main thread that enters a loop inside the run_forever waiting for messages). If you want to have some other thing going on you'll need another thread.
Below is a different version of their example code, where instead of using the main thread as the "socket listener", another thread is created and the run_forever runs there. I see it as a bit more complicated since you have to write code to assure the socket has connected while you could use the on_open callback, but maybe it will help you understand.
import websocket import threading from time import sleep def on_message(ws, message): print message def on_close(ws): print "### closed ###" if __name__ == "__main__": websocket.enableTrace(True) ws = websocket.WebSocketApp("ws://echo.websocket.org/", on_message = on_message, on_close = on_close) wst = threading.Thread(target=ws.run_forever) wst.daemon = True wst.start() conn_timeout = 5 while not ws.sock.connected and conn_timeout: sleep(1) conn_timeout -= 1 msg_counter = 0 while ws.sock.connected: ws.send('Hello world %d'%msg_counter) sleep(1) msg_counter += 1