8768 sujets

Développement web côté serveur, CMS

Bonjour,

J'ai un soucis avec mes Websockets j'utilise la méthode disconnect de la bibliothèque flask-websocketio qui est censé déconnecté mon client et sa me reconnecte le client je comprend vraiment pas pourquoi.

voici mon code

#!/usr/bin/python

from gevent import monkey
monkey.patch_all()

import time
from threading import Thread
from flask import Flask, render_template, session, request
from flask.ext.socketio import SocketIO, emit, join_room, leave_room, \
    close_room, disconnect

app = Flask(__name__)
app.debug = True
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)
thread = None
disconnected = True
maxclients = 4
nbofclients = 0
hostip = "192.168.1.40"
port = 5001



def background_thread():
    """Example of how to send server generated events to clients."""
    count = 0
    global disconnected
    while disconnected == True:
        time.sleep(1)
        #count += 1
        #socketio.emit('my response',
        #              {'data': 'Server generated event', 'count': count},
        #              namespace='/test')
    print "Sorti du Thread"

@app.route('/')
def index():
    global maxclients
    global nbofclients
    if nbofclients<maxclients:
    	global thread
    	if thread is None:
        	thread = Thread(target=background_thread)
        	thread.start()
    	nbofclients += 1
    	print 'Client '+str(nbofclients)+' connected'
		
    	return render_template('index.html')
    else:       
	
    	return render_template('indexfull.html')
    	pass


@socketio.on('my event', namespace='/test')
def test_message(message):
    session['receive_count'] = session.get('receive_count', 0) + 1
    print message['data']+" // received"
    emit('my response',
         {'data': message['data'], 'count': session['receive_count']})


@socketio.on('my broadcast event', namespace='/test')
def test_broadcast_message(message):
    session['receive_count'] = session.get('receive_count', 0) + 1
    print message['data']+" // broadcast received"
    emit('my response',
         {'data': message['data'], 'count': session['receive_count']},
         broadcast=True)


@socketio.on('join', namespace='/test')
def join(message):
    join_room(message['room'])
    session['receive_count'] = session.get('receive_count', 0) + 1
    emit('my response',
         {'data': 'In rooms: ' + ', '.join(request.namespace.rooms),
          'count': session['receive_count']})


@socketio.on('leave', namespace='/test')
def leave(message):
    leave_room(message['room'])
    session['receive_count'] = session.get('receive_count', 0) + 1
    emit('my response',
         {'data': 'In rooms: ' + ', '.join(request.namespace.rooms),
          'count': session['receive_count']})


@socketio.on('close room', namespace='/test')
def close(message):
    session['receive_count'] = session.get('receive_count', 0) + 1
    emit('my response', {'data': 'Room ' + message['room'] + ' is closing.',
                         'count': session['receive_count']},
         room=message['room'])
    close_room(message['room'])


@socketio.on('my room event', namespace='/test')
def send_room_message(message):
    session['receive_count'] = session.get('receive_count', 0) + 1
    emit('my response',
         {'data': message['data'], 'count': session['receive_count']},
         room=message['room'])


@socketio.on('disconnect request', namespace='/test')
def disconnect_request():
    session['receive_count'] = session.get('receive_count', 0) + 1
    emit('my response',
         {'data': 'Disconnected!', 'count': session['receive_count']})
    

    global disconnected 
    disconnected = False
    print('Client disconnected')
    disconnect()


@socketio.on('connect', namespace='/test')
def test_connect():
    emit('my response', {'data': 'Connected', 'count': 0})


@socketio.on('disconnect', namespace='/test')
def test_disconnect():
    print('Client disconnected')


if __name__ == '__main__':
    socketio.run(app, host=hostip, port=port)


Et le HTML
<!DOCTYPE HTML>
<html>
<head>
    <title>Flask-SocketIO Test</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.2.min.js"></script>
    <script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/socket.io/0.9.16/socket.io.min.js"></script>
    <script type="text/javascript" charset="utf-8">
        $(document).ready(function(){
            var socket = io.connect('http://192.168.1.40:5000/test');
			
			socket.on('connect', function() {
				socket.emit('my event', {data: 'I\'m connected!'});
			});

            // event handler for server sent data
            // the data is displayed in the "Received" section of the page
            socket.on('my response', function(msg) {
                $('#log').append('<br>Received #' + msg.count + ': ' + msg.data);
            });
            // handlers for the different forms in the page
            // these send data to the server in a variety of ways
            $('form#emit').submit(function(event) {
                socket.emit('my event', {data: $('#emit_data').val()});
                return false;
            });
            $('form#broadcast').submit(function(event) {
                socket.emit('my broadcast event', {data: $('#broadcast_data').val()});
                return false;
            });
            $('form#join').submit(function(event) {
                socket.emit('join', {room: $('#join_room').val()});
                return false;
            });
            $('form#leave').submit(function(event) {
                socket.emit('leave', {room: $('#leave_room').val()});
                return false;
            });
            $('form#send_room').submit(function(event) {
                socket.emit('my room event', {room: $('#room_name').val(), data: $('#room_data').val()});
                return false;
            });
            $('form#close').submit(function(event) {
                socket.emit('close room', {room: $('#close_room').val()});
                return false;
            });
            $('form#disconnect').submit(function(event) {
                socket.emit('disconnect');
                return false;
            });
        });
    </script>
</head>
<body>
    <h1>Flask-SocketIO Test</h1>
    <h2>Send:</h2>
    <button>Connexion</button>
    <form id="emit" method="POST" action='#'>
        <input type="text" name="emit_data" id="emit_data" placeholder="Message">
        <input type="submit" value="Echo">
    </form>
    <form id="broadcast" method="POST" action='#'>
        <input type="text" name="broadcast_data" id="broadcast_data" placeholder="Message">
        <input type="submit" value="Broadcast">
    </form>
    <form id="join" method="POST" action='#'>
        <input type="text" name="join_room" id="join_room" placeholder="Room Name">
        <input type="submit" value="Join Room">
    </form>
    <form id="leave" method="POST" action='#'>
        <input type="text" name="leave_room" id="leave_room" placeholder="Room Name">
        <input type="submit" value="Leave Room">
    </form>
    <form id="send_room" method="POST" action='#'>
        <input type="text" name="room_name" id="room_name" placeholder="Room Name">
        <input type="text" name="room_data" id="room_data" placeholder="Message">
        <input type="submit" value="Send to Room">
    </form>
    <form id="close" method="POST" action="#">
        <input type="text" name="close_room" id="close_room" placeholder="Room Name">
        <input type="submit" value="Close Room">
    </form>
    <form id="disconnect" method="POST" action="#">
        <input type="submit" value="Disconnect">
    </form>
    <h2>Receive:</h2>
    <div id="log"></div>
</body>
</html>

Modifié par Philigane (13 Oct 2015 - 21:09)
Bonjour,

J'ai un peu surfé un sur la documentation ... Mais je n'ai rien trouvé d'explicite.

A mon avis la librairie coté client (socket.io.js) se reconnecte automatiquement lors d'une perte de connexion (dans ton cas quand tu ferme le socket coté serveur - et non pas pour une perte de réseaux)

Pour en être sûr, (sous GNU/Linux) utilise tcpdump et analyse les requêtes sur ton réseaux...

Je pense que pour fermer une connexion initié depuis le serveur, il faut que le serveur envoi l'ordre au client de faire un disconnect (un handler command)
Peut être existe-t-il un paramètre auto-connect pour l'object socket.io

edit:
Pour le paramètre autoConnect => http://socket.io/blog/socket-io-1-1-0/
Mais je ne pense pas que tu souhaite inhiber cette fonctionnalité.
Modifié par Safina (13 Oct 2015 - 21:45)
Merci de ta réponse. Je pense effectivement tester le fait de couper la connection sur le client également.

Je vais aussi regarder ton lien voir ce qu'il y a. Merci.

EDIT : au final du fait que la communication avec le client java était trop complexe j'ai utilisé la bibliothèque SimpleWebSocket en python tout aussi simple, qui fonctionne bien.

Merci !
Modifié par Philigane (14 Oct 2015 - 11:03)
bzh a écrit :
A mon avis c'est du spam, sepecat.

Tout à fait d'accord, et vu la date du sujet initial, c'est sans objet... mais c'est un petit plaisir du dimanche matin Smiley cligne