2016-05-05 3 views
1

Je travaille sur une application python. L'implémentation de base nécessite qu'un Raspberry Pi soit connecté à un serveur principal et partage des messages. Le serveur exécutera une application python pour analyser les données et retourner les informations au Raspberry Pi.Python et Socket.IO - App se bloque après la connexion

J'implémente ce système avec python-socketio pour la partie serveur et socketio.client pour le code Raspberry Pi.

Mon problème est que je suis capable de me connecter au serveur et de recevoir un message de réponse, mais le programme se bloque du côté client.

Code Mon serveur est:

import socketio 
import eventlet 
from flask import Flask 

# Define Socket.IO server and application wrapper 
sio = socketio.Server() 
app = Flask(__name__) 

@sio.on('connect', namespace = '/test') 
def connect(sid, environ): 
    print 'New Connection ' + sid 
    sio.emit("server_response", sid, room = sid, namespace = '/test') 

@sio.on('message', namespace = '/test') 
def message(sid, data): 
    print 'message ' + sid + " " + data 
    sio.emit("server_reply", data = "Hello", room = sid, namespace = '/test') 

@sio.on('disconnect', namespace = '/test') 
def disconnect(sid): 
    print 'disconnect ' + sid 

if __name__ == '__main__': 
    # Wrap Flask application with Socket.IO's middleware 
    app = socketio.Middleware(sio, app) 

    # Deploy as an eventlet WSGI server 
    eventlet.wsgi.server(eventlet.listen(('',8000)), app) 

En ce qui concerne la partie client J'utilise ce code:

from socketIO_client import SocketIO, BaseNamespace 
global sio 
global testNamespace 
global myId 

class testNamespace(BaseNamespace): 

    def on_server_response(self, userID): 
     myId = userID 
     print "Socket connection accepted" 
     print "I was assigned the id: " + myId 

    def on_server_reply(self, data): 
     print "message response: " + data 

if __name__ == "__main__": 
    # Establish the connection 
    sio = SocketIO('localhost', 8000) 
    testNamespace = sio.define(testNamespace, '/test') 

    print "Going to emit message" 
    testNamespace.emit("message", "Hello") 

    sio.wait() 

Pour une raison quelconque, je reçois la réponse du serveur avec l'ID attribué mais le programme n'atteint jamais la ligne

print "Going to emit message" 

J'ai d'abord pensé que c'était quelque chose lié à l'espace de noms mais puisque l'instruction d'impression ne se produit jamais je ne comprends pas ce que je fais mal.

EDIT

J'ai remarqué que si on_server_response je tente d'émettre le message Bonjour à

self.emit("message", "Hello") 

Je suis en mesure d'envoyer le message au serveur et obtenir la réponse est . Ce que je ne comprends pas maintenant c'est comment on peut émettre des événements sur le programme principal, en dehors de la définition de la classe.

Répondre

1

J'ai trouvé le même problème et ouvert un problème sur SocketIO_client.

https://github.com/invisibleroads/socketIO-client/issues/117

est ici une solution qui remplace la partie problématique dans une sous-classe. Ensuite, il suffit d'utiliser ce SocketIOClient au lieu de SocketIO

from socketIO_client import SocketIO 

class SocketIOClient(SocketIO): 
    """ 
    Fix for library bug 
    """ 

    def _should_stop_waiting(self, for_connect=False, for_callbacks=False): 
     if for_connect: 
      for namespace in self._namespace_by_path.values(): 
       is_namespace_connected = getattr(
        namespace, '_connected', False) 
       #Added the check and namespace.path 
       #because for the root namespaces, which is an empty string 
       #the attribute _connected is never set 
       #so this was hanging when trying to connect to namespaces 
       # this skips the check for root namespace, which is implicitly connected 
       if not is_namespace_connected and namespace.path: 
        return False 
      return True 
     if for_callbacks and not self._has_ack_callback: 
      return True 
     return super(SocketIO, self)._should_stop_waiting()