Flask-SocketIO服务端安装及使用代码示例
安装Flask-Sockets很容易:
pipinstallflask-socketio
注意Flask-SocketIO依赖gevent库,目前它仅可以在python2上运行(译者注:python3.6测试也可以)。gevent很快也会对python3支持。
下面是一个Flask-SocketIO在Flask应用上的实现例子:
fromflaskimportFlask,request,jsonify,render_template fromflask_socketioimportSocketIO,emit app=Flask(__name__) app.config['SECRET_KEY']='secret!' socketio=SocketIO(app) @app.route('/') defindex(): returnrender_template('test.html') #触发事件myevent:回复只发送此连接 @socketio.on('my_event',namespace='/chat') deftest_message(message): print(message) emit('my_response',{'data':message['data']}) #触发事件mybroadcastevent::回复所有链接(广播) @socketio.on('my_broadcastevent',namespace='/chat') deftest_message(message): print(message) emit('my_response',{'data':message['data']},broadcast=True) ################################################################## #自动连接和自动断开触发 @socketio.on('connect',namespace='/chat') deftest_connect(): print("连接到来") emit('my_response',{'data':'Connected'}) @socketio.on('disconnect',namespace='/chat') deftest_disconnect(): print("连接断开") print('Clientdisconnected') if__name__=='__main__': socketio.run(app,host='0.0.0.0',port=8200,debug=True)
对应的test.html,注意一个问题:flask是从与启动文件同级的templates查找模板的。
test.html
官方完整示例
#!/usr/bin/envpython fromthreadingimportLock fromflaskimportFlask,render_template,session,request,\ copy_current_request_context fromflask_socketioimportSocketIO,emit,join_room,leave_room,\ close_room,rooms,disconnect #Setthisvariableto"threading","eventlet"or"gevent"totestthe #differentasyncmodes,orleaveitsettoNonefortheapplicationtochoose #thebestoptionbasedoninstalledpackages. async_mode=None app=Flask(__name__) app.config['SECRET_KEY']='secret!' socketio=SocketIO(app,async_mode=async_mode) thread=None thread_lock=Lock() defbackground_thread(): """Exampleofhowtosendservergeneratedeventstoclients.""" count=0 whileTrue: socketio.sleep(100) count+=1 socketio.emit('my_response', {'data':'Servergeneratedevent','count':count}, namespace='/test') @app.route('/') defindex(): returnrender_template('test1.html',async_mode=socketio.async_mode) @socketio.on('my_event',namespace='/test') defmtest_message(message): print(message) session['receive_count']=session.get('receive_count',0)+1 #print(message) #print(message['data']) emit('my_response', {'data':message['data'],'count':session['receive_count']}) @socketio.on('my_broadcast_event',namespace='/test') defmtest_broadcast_message(message): print(message) session['receive_count']=session.get('receive_count',0)+1 emit('my_response', {'data':message['data'],'count':session['receive_count']}, broadcast=True) @socketio.on('join',namespace='/test') defjoin(message): print(message) join_room(message['room']) session['receive_count']=session.get('receive_count',0)+1 emit('my_response', {'data':'Inrooms:'+','.join(rooms()), 'count':session['receive_count']}) @socketio.on('leave',namespace='/test') defleave(message): print(message) leave_room(message['room']) session['receive_count']=session.get('receive_count',0)+1 emit('my_response', {'data':'Inrooms:'+','.join(rooms()), 'count':session['receive_count']}) @socketio.on('close_room',namespace='/test') defclose(message): session['receive_count']=session.get('receive_count',0)+1 emit('my_response',{'data':'Room'+message['room']+'isclosing.', 'count':session['receive_count']}, room=message['room']) close_room(message['room']) @socketio.on('my_room_event',namespace='/test') defsend_room_message(message): session['receive_count']=session.get('receive_count',0)+1 emit('my_response', {'data':message['data'],'count':session['receive_count']}, room=message['room']) ################################################################## #自动连接和自动断开触发 @socketio.on('connect',namespace='/test') deftest_connect(): print("连接到来") emit('myresponse',{'data':'Connected'}) @socketio.on('disconnect',namespace='/test') deftest_disconnect(): print("连接断开") print('Clientdisconnected') if__name__=='__main__': socketio.run(app,debug=True,port=8200)
test1.html
Flask-SocketIOTest $(document).ready(function(){ varsocket=io.connect('http://'+document.domain+':'+location.port+'/test'); socket.on('my_response',function(msg){ $('#log').append(' Received:'+msg.data+'
'); }); $('form#emit').submit(function(event){ socket.emit('my_event',{data:$('#emit_data').val()}); returnfalse; }); $('form#broadcast').submit(function(event){ socket.emit('my_broadcast_event',{data:$('#broadcast_data').val()}); returnfalse; }); $('form#join').submit(function(event){ socket.emit('join',{room:$('#join_room').val()}); returnfalse; }); $('form#leave').submit(function(event){ socket.emit('leave',{room:$('#leave_room').val()}); returnfalse; }); $('form#send_room').submit(function(event){ socket.emit('my_room_event',{room:$('#room_name').val(),data:$('#room_data').val()}); returnfalse; }); $('form#close').submit(function(event){ socket.emit('close_room',{room:$('#close_room').val()}); returnfalse; }); $('form#disconnect').submit(function(event){ socket.emit('disconnect_request'); returnfalse; }); });Flask-SocketIOTest
Asyncmodeis:{{async_mode}}
Averageping/ponglatency:
ms Send:
Receive:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。