From 78ca6c5c07d3e7582b97fcd4fc1703bbc2479d6d Mon Sep 17 00:00:00 2001 From: Mathieu Broillet Date: Fri, 2 Dec 2022 10:59:19 +0100 Subject: [PATCH] websockets stuff --- jarvis/utils/templates/index.html | 113 +++++++++++++++++++++++++----- jarvis/utils/websocketstest.py | 87 ++++++++++++++++++++--- 2 files changed, 176 insertions(+), 24 deletions(-) diff --git a/jarvis/utils/templates/index.html b/jarvis/utils/templates/index.html index 96ff693..df24580 100644 --- a/jarvis/utils/templates/index.html +++ b/jarvis/utils/templates/index.html @@ -1,28 +1,84 @@ - Socket-Test - - + Flask-SocketIO Test + + - - -

Socket

+ +

Flask-SocketIO Test

+

+ Async mode is: {{ async_mode }}
+ Current transport is:
+ Average ping/pong latency: ms +

+

Send:

- + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + +
+
+ +
-
- +
-

Logs

-
+

Receive:

+
\ No newline at end of file diff --git a/jarvis/utils/websocketstest.py b/jarvis/utils/websocketstest.py index ec8540f..ca37e50 100644 --- a/jarvis/utils/websocketstest.py +++ b/jarvis/utils/websocketstest.py @@ -1,39 +1,110 @@ -from flask import Flask, render_template, session, copy_current_request_context -from flask_socketio import SocketIO, emit, disconnect from threading import Lock +from flask import Flask, render_template, session, request, \ + copy_current_request_context +from flask_socketio import SocketIO, emit, join_room, leave_room, \ + close_room, rooms, disconnect +# Set this variable to "threading", "eventlet" or "gevent" to test the +# different async modes, or leave it set to None for the application to choose +# the best option based on installed packages. async_mode = None + app = Flask(__name__) app.config['SECRET_KEY'] = 'secret!' -socket_ = SocketIO(app, async_mode=async_mode) +socketio = SocketIO(app, async_mode=async_mode) thread = None thread_lock = Lock() @app.route('/') def index(): - return render_template('index.html', async_mode=socket_.async_mode) + return render_template('index.html', async_mode=socketio.async_mode) -@socket_.on('my_event', namespace='/test') -def test_message(message): +@app.route('/test') +def test(): + send_text_to_room("salut c'est serveur", "192.168.1.130") + return "OK" + + +def send_text_to_room(text, room_id): + session['receive_count'] = session.get('receive_count', 0) + 1 + socketio.emit('my_response', {'data': text, 'count': session['receive_count']}, to=room_id) + + +@socketio.event +def my_event(message): session['receive_count'] = session.get('receive_count', 0) + 1 emit('my_response', {'data': message['data'], 'count': session['receive_count']}) -@socket_.on('disconnect_request', namespace='/test') +@socketio.event +def my_broadcast_event(message): + session['receive_count'] = session.get('receive_count', 0) + 1 + emit('my_response', + {'data': message['data'], 'count': session['receive_count']}, + broadcast=True) + + +@socketio.event +def join(message): + join_room(message['room']) + session['receive_count'] = session.get('receive_count', 0) + 1 + emit('my_response', + {'data': 'In rooms: ' + ', '.join(rooms()), + 'count': session['receive_count']}) + + +@socketio.event +def leave(message): + leave_room(message['room']) + session['receive_count'] = session.get('receive_count', 0) + 1 + emit('my_response', + {'data': 'In rooms: ' + ', '.join(rooms()), + 'count': session['receive_count']}) + + +@socketio.on('close_room') +def on_close_room(message): + session['receive_count'] = session.get('receive_count', 0) + 1 + emit('my_response', {'data': 'Room ' + message['room'] + ' is closing.', + 'count': session['receive_count']}, + to=message['room']) + close_room(message['room']) + + +@socketio.event def disconnect_request(): @copy_current_request_context def can_disconnect(): disconnect() session['receive_count'] = session.get('receive_count', 0) + 1 + # for this emit we use a callback function + # when the callback function is invoked we know that the message has been + # received and it is safe to disconnect emit('my_response', {'data': 'Disconnected!', 'count': session['receive_count']}, callback=can_disconnect) +@socketio.event +def my_ping(): + emit('my_pong') + + +@socketio.event +def connect(): + global thread + emit('my_response', {'data': 'Connected', 'count': 0}) + + +@socketio.on('disconnect') +def test_disconnect(): + print('Client disconnected', request.sid) + + if __name__ == '__main__': - socket_.run(app, debug=True, host='0.0.0.0') + socketio.run(app)