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.