我正在开发一个 python 应用程序。基本实现需要 Raspberry Pi 连接到主服务器并共享消息。服务器将运行一个 python 应用程序来分析数据并将信息返回给 Raspberry Pi。
我正在使用 python-socketio 作为服务器部分,使用 socketio.client 作为 Raspberry Pi 代码来实现这个系统。
我的问题是我能够连接到服务器并收到响应消息,但随后程序挂在客户端。
我的服务器代码是:
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)
至于客户端部分,我正在使用此代码:
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()
出于某种原因,我得到了带有分配 ID 的服务器响应,但是程序永远不会到达该行
print "Going to emit message"
我最初认为这与命名空间有关,但由于打印指令从未发生,我不明白我做错了什么。
编辑
我注意到如果 on_server_response 我尝试发出消息 Hello with
self.emit("message", "Hello")
我能够将消息发送到服务器并得到回复。我现在不明白的是,如何在类定义之外的主程序上发出事件。