Flask-websocket Emit主动发送消息失败

现在在用flask实现一个简单的webserver,为了与前段进行通信,加入了flask-socketio模块,现在在处理前段发送过来的消息的函数中直接emit的话,前端可以收到消息。但是想主动发送消息的话失败。具体如下:
在这边的话前端是可以接收到emit发送的消息的。
@socketio.on('request_for_response')
defhandle_request(request):
print('receivedsocketmessage:'+json.dumps(request))
#这里可以直接发送,如果单独发送就不可以?
emit('response','ok')
msgTranslate(request)
如果在普通函数里直接调用就会失败,这里的emit始终不能发送消息。
defrecvThread():
whileTrue:
#print("recvThreadstart---")
msgNum=c_long(0)
content=create_string_buffer(1024)
ifrecvMsg(byref(msgNum),content)==0:
print(content)
print("thecontentnumberis%d,thecontentis:%s"%(msgNum.value,content.value))
#必须要全局的才能调用
d=dict(name='djj',age=26)
print(json.dumps(d))
#response(json.dumps(d))
socketio.emit('response')
socketio定义如下
app=Flask(__name__)
app.config['SECRET_KEY']='secret!'
socketio=SocketIO(app,async_mode=async_mode)
前端代码如下:
var$SCRIPT_ROOT={{request.script_root|tojson|safe}};
varsocket=io.connect($SCRIPT_ROOT);
socket.on('connect',function()
{
socket.emit('connected');
});
socket.on('response',function(data)
{
console.log(data);
alert("receiveresponse");
/*
if(data.code=='200'){
alert(data.param);
}
else
{
alert('Error:'+data.param);
}
*/
//alert(data.param);
});
$(document).ready(function(){
$("#btn").click(function(){
socket.emit('request_for_response',JSON.stringify({
'ip':$("#ip").val(),
'cover':$("#cover").val(),
'gate':$("#gate").val(),
}));
});
});
发现一个问题:socketio.emit放在线程里就无法执行,我现在的启动的部分代码是这样的,
if__name__=='__main__':
loadDjjque()
isInit=queInit()
setCharacter(1)
ifisInit==0:
print("--queInitsuccess--")
t=threading.Thread(target=recvThread,name='recvThread')
t.setDaemon(True)
t.start()
socketio.run(app,host='0.0.0.0',port=5555)
但是官方文档写的是:
但对于某些应用程序,服务器需要作为消息的发起者。这可以用于向客户端发送在服务器中发起的事件的通知,例如在后台线程中。可以使用socketio.send()和socketio.emit()方法向所有连接的客户端进行广播:
defsome_function():
socketio.emit('someevent',{'data':42})
请注意,socketio.send()和socketio.emit()与上下文感知send()和emit()不同。还要注意,在上面的用法中没有客户端上下文,所以broadcast=True,不需要指定。
作者:1994宅猫链接:https://www.jianshu.com/p/411...來源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
不知道为什么不可以发送出去??
RISEBY
浏览 1789回答 2
2回答

偶然的你

如果没有@socketio.on('request_for_response')这个装饰器,你的程序就不完整。建议看看看看我的这篇文章——基于flask-socketio的CRUD操作初探
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript