为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

RISEBY 2019-05-23 20:12:08
现在在用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...來源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。不知道为什么不可以发送出去??
查看完整描述

2 回答

?
偶然的你

TA贡献1841条经验 获得超3个赞

如果没有@socketio.on('request_for_response')这个装饰器,你的程序就不完整。
建议看看看看我的这篇文章——基于flask-socketio的CRUD操作初探
                            
查看完整回答
反对 回复 2019-05-23
  • 2 回答
  • 0 关注
  • 1788 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信