Tornado network connectivity on demand?

I am creating a tornado web socket and want to use it to send log data over my network. This seems like normal, but:

(1) Can I send data from the client to the server arbitrarily after establishing a connection, or do I need to establish a new connection and use the on_open method to print / work with the sent message each time?

(2) In my client specifically (link): why is ws.close () not called? It does not seem to be happening. How can I end the connection then?

(3) Is there a better way to identify other clients related to connection.request.remote_ip?

Code: Server

import tornado.ioloop
import tornado.web
import tornado.websocket

host = "localhost:2000"

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("<h3>HELLO</h3>")

class EchoWebSocket(tornado.websocket.WebSocketHandler):
    connections = set()
    ips         = set()

    def open(self):
        self.connections.add(self)
        self.ips.add(self.request.remote_ip)
        print("[MASTER]: WebSocket opened by {}".format(self.request.remote_ip))

    def on_message(self, message):
        print("[CLIENT {}]: {}".format(self.request.remote_ip, message))
        [con.write_message("[MASTER]: {}".format(message)) for con in self.connections]

    def on_close(self):
        self.connections.remove(self)
        self.ips.remove(self.request.remote_ip)
        print("[MASTER]: WebSocket closed - Client {}".format(self.request.remote_ip))

def setup():
        return tornado.web.Application([(r"/", MainHandler),
                                        (r"/ws", EchoWebSocket)])

if __name__ == "__main__":
    s = tornado.httpserver.HTTPServer(setup())
    s.listen(2000)
    print("------------- INFO -------------\nStarted Server at {}\nSocket available at /ws".format(host))
    tornado.ioloop.IOLoop.current().start()

Customer:

from tornado.websocket import websocket_connect
import tornado
import time

url = "ws://localhost:2000/ws"

class Client(object):
    def __init__(self, url, log=None):
        self.url = url
        self.ioloop = tornado.ioloop.IOLoop.current()
        self.conn = None
        self.log = log

    def start(self):
        websocket_connect(
                        self.url,
                        self.ioloop,
                        callback=self.on_connected,
                        on_message_callback=self.on_message)
        self.ioloop.start()

    def on_connected(self, f):
        try:
            self.conn = f.result()
            self.conn.write_message("Client #1 connected")
        except Exception as e:
            print("[ERROR]: {}".format(e))
            self.conn.write_message("ERROR: {}".format(e))
            self.ioloop.stop()

    def on_message(self, message):
        if message is None:
            print("[ERROR]: No message received")
            self.conn.write_message("[ERROR]: No message received")
            self.ioloop.stop()
        else:
            print(message)

    def close():
        self.conn.close()

if __name__ == '__main__':
    ws = Client(url)
    ws.start()
    ws.close()
+4
source share

Source: https://habr.com/ru/post/1684064/


All Articles