2016-05-05 11 views
1

Ich arbeite an einer Python-App. Für die grundlegende Implementierung muss ein Raspberry Pi mit einem Hauptserver verbunden sein und Nachrichten freigeben. Der Server wird eine Python-App ausführen, um Daten zu analysieren und Informationen an den Raspberry Pi zurückzugeben.Python und Socket.IO - App hängt nach der Verbindung

Ich implementiere dieses System mit python-socketio für den Server-Teil und socketio.client für den Raspberry Pi-Code.

Mein Problem ist, dass ich eine Verbindung zum Server herstellen kann und eine Antwortnachricht erhalten kann, aber dann hängt das Programm auf der Clientseite.

Code Meines Servers ist:

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) 

Wie für den Client-Teil ich diesen Code bin mit:

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() 

Aus irgendeinem Grund habe ich den Server-Antwort mit der ID zugewiesen, aber dann das Programm erreicht nie die Zeile

print "Going to emit message" 

Ich dachte zunächst, es war etwas mit dem Namespace verwandt Aber da Druckanweisungen nie vorkommen, verstehe ich nicht, was ich falsch mache.

EDIT

Ich habe bemerkt, dass, wenn on_server_response ich versuchen, die Nachricht Hallo zu emittieren mit

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

Ich bin in der Lage, die Nachricht an den Server zu senden und bekommen es Antworten . Was ich jetzt nicht verstehe ist wie man Ereignisse außerhalb der Klassendefinition auf dem Hauptprogramm ausgeben kann.

Antwort

1

Ich habe das gleiche Problem gefunden und ein Problem auf SocketIO_client geöffnet.

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

Hier ist eine Lösung, die den problematischen Teil in einer Unterklasse überschreibt. Dann verwenden Sie einfach diesen SocketIOClient anstelle von 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() 
Verwandte Themen