python网络通信框架_【python:flask-SocketIO】网络通信框架简单了解
Flask是一個(gè)用python開發(fā)的網(wǎng)絡(luò)應(yīng)用微框架。http://docs.jinkan.org/docs/flask/?docs.jinkan.org
而flask-SocketIO 為flask應(yīng)用提供了一個(gè)客戶端與服務(wù)器之間低延遲的雙向通信。客戶端應(yīng)用可以用Javascript,C++,Java,Swift或者其它任意的編程語言的socketio官方庫的客戶端去和服務(wù)端創(chuàng)建一個(gè)永久的連接。
from flask import Flask, render_template
from flask_socketio import SocketIO
app = Flask(__name__)
app.configp['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)
if __name__ == '__main__':
socketio.run(app)
這就是一個(gè)簡單的Flask應(yīng)用。
Flask大量使用裝飾器模式,來將用戶應(yīng)用中的各種函數(shù)裝入Flask框架中。所以學(xué)習(xí)之前應(yīng)當(dāng)對python的裝飾器模式的使用熟練掌握。
例如,下面的裝飾器socketio.on()實(shí)現(xiàn)對接收到的消息'message'的監(jiān)聽,'message'是用戶自定義的一個(gè)消息種類的名字。也可以改為其他名字。重點(diǎn)是收發(fā)要是同一種消息。同時(shí)message是用戶自定義的數(shù)據(jù)類。
@socketio.on('message')
def handle_message(message):
print('received message: ' + message)
也可以不使用裝飾器語法,而是使用socketio.on_event()代替裝飾器來進(jìn)行消息監(jiān)聽:
def my_function_handler(data):
pass
socketio.on_event('my event', my_function_handler, namespace='/test')
后端的flask-socketio的創(chuàng)建和運(yùn)行方式如下:
from flask import Flask
from flask_socketio import SocketIO,emit
app = Flask(__name__)
socketio = SocketIO()
socketio.init_app(app)
"""
對app進(jìn)行一些路由設(shè)置
"""
@app.route('/')
def index():
return render_template('test.html')
"""
對socketio進(jìn)行一些監(jiān)聽設(shè)置
"""
if __name__ == '__main__':
socketio.run(app,debug=True,host='0.0.0.0',port=5000)
#這里就不再用app.run而用socketio.run了。socketio.run的參數(shù)和app.run也都差不多
使用@app.route('/')裝飾器設(shè)置路由,@socketio.on設(shè)置消息監(jiān)聽。
命名空間namespace使得客戶端可以在一個(gè)相同的socket上多路復(fù)用幾個(gè)獨(dú)立的連接。也就是說,同一個(gè)物理機(jī)可以開啟多個(gè)進(jìn)程并使用同一個(gè)socket連接到服務(wù)器,只需要指定不同的命名空間即可。
@scoketio.on('my event', namespace='/test')
def handle_my_custom_namespace_event(json):
print('received json: ' + str(json))
發(fā)送消息:
使用send()和emit()發(fā)送消息,它們分別用于無名和命名事件。
@socketio.on('message')
def handle_message(message):
send(message, namespace='/chat')
@socketio.on('my event')
def handle_my_custom_event(json):
emit('my response', json, namespace='/chat')
使用emit時(shí)可以指定namespace來指定命名空間。
@socketio.on('my event')
def handle_my_custom_event(json):
emit('my response', ('foo', 'bar', json), namespace='/chat')
發(fā)送的消息也可以帶有參數(shù)'foo'和'bar'。
def ack():
print 'message was received!'
@socketio.on('my event')
def handle_my_custom_event(json):
emit('my response', json, callback=ack)
也可以在發(fā)送函數(shù)emit()等api中使用回調(diào)函數(shù)。
@socketio.on('my event')
def handle_my_custom_event(data):
emit('my response', data, broadcast=True)
加入broadcast=True參數(shù)可以使得send()和emit()廣播消息,所有客戶端都會(huì)收到它。若指定命名空間,則只有連接到命名空間的客戶端會(huì)收到消息。
使用room可以實(shí)現(xiàn)“群聊”功能。(略)
from flask_socketio import Namespace, emit
class MyCustomNamespace(Namespace):
def on_connect(self):
pass
def on_disconnect(self):
pass
def on_my_event(self, data):
emit('my_response', data)
socketio.on_namespace(MyCustomNamespace('/test'))
使用基于類的命名空間Namespace可以一次性注冊消息的監(jiān)聽處理函數(shù),便于管理以及面向?qū)ο缶幊獭,F(xiàn)在,服務(wù)器接收的任何消息都會(huì)由on_+消息名為名字的MyCustomNamespace中的成員函數(shù)處理。例如my_event消息會(huì)由MyCustomNamespace中的on_my_event處理。
socketIO-client是一個(gè)基于python實(shí)現(xiàn)的socket.io客戶端庫,這個(gè)socket.io原本是一個(gè)js的庫(flask_socketio也是),github鏈接:https://github.com/invisibleroads/socketIO-client,它與flask_socketIO的關(guān)系是,對于用Flask-SocketIO實(shí)現(xiàn)的后端,客戶端需要用SocketIO的官方庫實(shí)現(xiàn),語言不限。https://flask-socketio.readthedocs.io/en/latest/
大致使用就是這些,現(xiàn)在比較好奇的問題是,收發(fā)消息的時(shí)候需要考慮tcp的多個(gè)包接收處理嗎,因?yàn)橹霸谟肞ython的twisted的時(shí)候用datareceived就需要自己對消息做結(jié)尾字符,然后作處理,因?yàn)閠wisted的datareceived會(huì)在每個(gè)tcp包到達(dá)的時(shí)候進(jìn)行調(diào)用。還有就是socketIO有沒有像twisted一樣的對于某一個(gè)函數(shù)執(zhí)行延時(shí)執(zhí)行的功能,這個(gè)功能真的很強(qiáng)大,在差錯(cuò)處理上十分有用。
參考:
總結(jié)
以上是生活随笔為你收集整理的python网络通信框架_【python:flask-SocketIO】网络通信框架简单了解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 《JavaScript 高级程序设计》精
 - 下一篇: 集团企业数据信息系统建设方案