日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python网络通信框架_【python:flask-SocketIO】网络通信框架简单了解

發(fā)布時(shí)間:2023/12/10 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python网络通信框架_【python:flask-SocketIO】网络通信框架简单了解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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或者其它任意的編程語(yǔ)言的socketio官方庫(kù)的客戶端去和服務(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è)簡(jiǎn)單的Flask應(yīng)用。

Flask大量使用裝飾器模式,來(lái)將用戶應(yīng)用中的各種函數(shù)裝入Flask框架中。所以學(xué)習(xí)之前應(yīng)當(dāng)對(duì)python的裝飾器模式的使用熟練掌握。

例如,下面的裝飾器socketio.on()實(shí)現(xiàn)對(duì)接收到的消息'message'的監(jiān)聽(tīng),'message'是用戶自定義的一個(gè)消息種類的名字。也可以改為其他名字。重點(diǎn)是收發(fā)要是同一種消息。同時(shí)message是用戶自定義的數(shù)據(jù)類。

@socketio.on('message')

def handle_message(message):

print('received message: ' + message)

也可以不使用裝飾器語(yǔ)法,而是使用socketio.on_event()代替裝飾器來(lái)進(jìn)行消息監(jiān)聽(tīng):

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)

"""

對(duì)app進(jìn)行一些路由設(shè)置

"""

@app.route('/')

def index():

return render_template('test.html')

"""

對(duì)socketio進(jìn)行一些監(jiān)聽(tīng)設(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)聽(tīng)。

命名空間namespace使得客戶端可以在一個(gè)相同的socket上多路復(fù)用幾個(gè)獨(dú)立的連接。也就是說(shuō),同一個(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ā)送消息,它們分別用于無(wú)名和命名事件。

@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來(lái)指定命名空間。

@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可以一次性注冊(cè)消息的監(jiān)聽(tīng)處理函數(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客戶端庫(kù),這個(gè)socket.io原本是一個(gè)js的庫(kù)(flask_socketio也是),github鏈接:https://github.com/invisibleroads/socketIO-client,它與flask_socketIO的關(guān)系是,對(duì)于用Flask-SocketIO實(shí)現(xiàn)的后端,客戶端需要用SocketIO的官方庫(kù)實(shí)現(xiàn),語(yǔ)言不限。https://flask-socketio.readthedocs.io/en/latest/

大致使用就是這些,現(xiàn)在比較好奇的問(wèn)題是,收發(fā)消息的時(shí)候需要考慮tcp的多個(gè)包接收處理嗎,因?yàn)橹霸谟肞ython的twisted的時(shí)候用datareceived就需要自己對(duì)消息做結(jié)尾字符,然后作處理,因?yàn)閠wisted的datareceived會(huì)在每個(gè)tcp包到達(dá)的時(shí)候進(jìn)行調(diào)用。還有就是socketIO有沒(méi)有像twisted一樣的對(duì)于某一個(gè)函數(shù)執(zhí)行延時(shí)執(zhí)行的功能,這個(gè)功能真的很強(qiáng)大,在差錯(cuò)處理上十分有用。

參考:

總結(jié)

以上是生活随笔為你收集整理的python网络通信框架_【python:flask-SocketIO】网络通信框架简单了解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。