Flask是一个用python开发的网络应用微框架。

http://docs.jinkan.org/docs/flask/​docs.jinkan.org

而flask-SocketIO 为flask应用提供了一个客户端与服务器之间低延迟的双向通信。客户端应用可以用Javascript,C++,Java,Swift或者其它任意的编程语言的socketio官方库的客户端去和服务端创建一个永久的连接。

    from flask import Flask, render_templatefrom flask_socketio import SocketIOapp = Flask(__name__)app.configp['SECRET_KEY'] = 'secret!'socketio = SocketIO(app)if __name__ == '__main__':socketio.run(app)

这就是一个简单的Flask应用。

Flask大量使用装饰器模式,来将用户应用中的各种函数装入Flask框架中。所以学习之前应当对python的装饰器模式的使用熟练掌握。

例如,下面的装饰器socketio.on()实现对接收到的消息'message'的监听,'message'是用户自定义的一个消息种类的名字。也可以改为其他名字。重点是收发要是同一种消息。同时message是用户自定义的数据类。

@socketio.on('message')
def handle_message(message):print('received message: ' + message)

也可以不使用装饰器语法,而是使用socketio.on_event()代替装饰器来进行消息监听:

def my_function_handler(data):pass
socketio.on_event('my event', my_function_handler, namespace='/test')

后端的flask-socketio的创建和运行方式如下:

from flask import Flask
from flask_socketio import SocketIO,emitapp = Flask(__name__)socketio = SocketIO()
socketio.init_app(app)"""
对app进行一些路由设置
"""
@app.route('/')
def index():return render_template('test.html')"""
对socketio进行一些监听设置
"""if __name__ == '__main__':socketio.run(app,debug=True,host='0.0.0.0',port=5000)#这里就不再用app.run而用socketio.run了。socketio.run的参数和app.run也都差不多

使用@app.route('/')装饰器设置路由,@socketio.on设置消息监听。

命名空间namespace使得客户端可以在一个相同的socket上多路复用几个独立的连接。也就是说,同一个物理机可以开启多个进程并使用同一个socket连接到服务器,只需要指定不同的命名空间即可。

@scoketio.on('my event', namespace='/test')
def handle_my_custom_namespace_event(json):print('received json: ' + str(json))

发送消息:

使用send()和emit()发送消息,它们分别用于无名和命名事件。

@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时可以指定namespace来指定命名空间。

@socketio.on('my event')
def handle_my_custom_event(json):emit('my response', ('foo', 'bar', json), namespace='/chat')

发送的消息也可以带有参数'foo'和'bar'。

def ack():print 'message was received!'@socketio.on('my event')
def handle_my_custom_event(json):emit('my response', json, callback=ack)

也可以在发送函数emit()等api中使用回调函数。

@socketio.on('my event')
def handle_my_custom_event(data):emit('my response', data, broadcast=True)

加入broadcast=True参数可以使得send()和emit()广播消息,所有客户端都会收到它。若指定命名空间,则只有连接到命名空间的客户端会收到消息。

使用room可以实现“群聊”功能。(略)

from flask_socketio import Namespace, emitclass MyCustomNamespace(Namespace):def on_connect(self):passdef on_disconnect(self):passdef on_my_event(self, data):emit('my_response', data)socketio.on_namespace(MyCustomNamespace('/test'))

使用基于类的命名空间Namespace可以一次性注册消息的监听处理函数,便于管理以及面向对象编程。现在,服务器接收的任何消息都会由on_+消息名为名字的MyCustomNamespace中的成员函数处理。例如my_event消息会由MyCustomNamespace中的on_my_event处理。

socketIO-client是一个基于python实现的socket.io客户端库,这个socket.io原本是一个js的库(flask_socketio也是),github链接:https://github.com/invisibleroads/socketIO-client,它与flask_socketIO的关系是,对于用Flask-SocketIO实现的后端,客户端需要用SocketIO的官方库实现,语言不限。https://flask-socketio.readthedocs.io/en/latest/

大致使用就是这些,现在比较好奇的问题是,收发消息的时候需要考虑tcp的多个包接收处理吗,因为之前在用Python的twisted的时候用datareceived就需要自己对消息做结尾字符,然后作处理,因为twisted的datareceived会在每个tcp包到达的时候进行调用。还有就是socketIO有没有像twisted一样的对于某一个函数执行延时执行的功能,这个功能真的很强大,在差错处理上十分有用。

参考:

https://www.jianshu.com/p/0032daa111a0

https://blog.csdn.net/weixin_36380516/article/details/80418354

https://pycntech.github.io/flask-SocketIO%E5%AE%98%E6%96%B9%E6%96%87%E6%A1%A3%E7%BF%BB%E8%AF%91-%E8%81%AA%E8%81%AA.html

https://juejin.im/post/5bdad42bf265da392a7e2e0e

flask post json_【python:flask-SocketIO】网络通信框架简单了解相关推荐

  1. flask mysql 1366_2017-11-17 Python Flask Script+mysql环境设置

    [1.初级版] flask-scrpit安装. 使用flask-scrpit可以创建命令,并在Flask的应用上下文中执行,因为这样才能对Flask对象进行修改.Flask Script自带了一些默认 ...

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

    Flask是一个用python开发的网络应用微框架.http://docs.jinkan.org/docs/flask/​docs.jinkan.org 而flask-SocketIO 为flask应 ...

  3. python:web后台框架简单实现

    python:web后台框架 目录 简介:BS开发和http协议 WSGI概述 类flask框架简单实现 response使用及wsgify装饰器 路由 模板原理 jinjia2模板技术 模块化,ja ...

  4. flask post json_使用Flask构建web项目的代码架构以及技术栈模板(一)

    自我简介 无名编码狮,爱好编码,个人blog网站http://www.skj.kim,网站服务器比较辣鸡哈,第一次访问速度比较慢,就用来记录一些CSDN审核不容易通过的博客,底层使用wordpress ...

  5. python flask oauth_基于python flask详述 OAuth 2.0 的运作流程

    OAuth2流程图 OAuth2 对于我来说是一个神秘的东西,我想初步的弄懂中间的整个流程,于是就去google搜索相关的文档资料. 在浏览了参差不齐的各种文章后,简述 OAuth 2.0 的运作流程 ...

  6. python flask html模板,python flask web开发实战 Jinja2模板

    templates/index.html Hello World! templates/user.html Hello, {{ name }}! 渲染模板: from flask import Fla ...

  7. docker flask mysql_Docker下Python Flask+Redis+MySQL+RQ队列简单配置

    本篇博文主要讲解Docker下使用RQ队列的通信配置,主要是网上的部分文章写的不太清楚,特写一篇 作者使用docker-compose.yml文件调度各部分文件Dockerfile,起初是这样写的 v ...

  8. API接口开发其实特简单,Python Flask Web 框架教程来了

    大家好,日常工作中,无论你是数据工程师.数据挖掘工程师,甚至数据分析人员,都不可避免的与他人进行数据交互,API接口提供数据是最常见的形式. 今天我给大家分享 Python Flask Web 框架教 ...

  9. Python Flask教程

    Welcome to Python Flask tutorial. In previous lesson we have learnt about python lambda. Python flas ...

最新文章

  1. dell笔记本电脑驱动_笔记本电脑摄像头打不开,怎么办?总结经验(基于摄像头本身是完好的)...
  2. jzoj3914-人品问题【树形dp】
  3. 论文浅尝 | 神经网络与非神经网络简单知识问答方法的强基线分析
  4. oracle监听 3个配置文件,Oracle 11g 监听 配置修改 说明
  5. accept 阻塞_TCP网络编程中connect()、listen()和accept()三者之间的关系
  6. 了解mysql的undo log
  7. mapreduce对日志数据上下行流量汇总
  8. hive sql分页
  9. 谷歌地图的级别与对应比例尺及分辨率探究
  10. 通过SAXReader解析XML
  11. 软件架构设计说明书该怎么写?
  12. 半导体芯片行业的运作模式(IDM/Fabless/Foundry模式)
  13. win10查看计算机系统版本,如何查看我的电脑是不是win10 1909版本?
  14. qt信号阻塞blockSignals的运用
  15. 从零开始搭建terraria(泰拉瑞亚)服务器
  16. OM302工业DTU对接亚控kingscada,实现水泵站一体化智慧改革
  17. (重点)微服务核心研究之--编排
  18. SSD算法原理与代码(三)
  19. OFFICE中的VBA库的定义
  20. IEEE 软件单元测试标准

热门文章

  1. SAP Spartacus当前产品主数据数据格式的一个例子
  2. Angular里的消息(Message)显示
  3. 如何使用SAP Cloud for Customer OData服务创建Lead
  4. SAP UI5应用访问OData metadata的url和Destination
  5. why we need getCoreClasses()
  6. SAP CRM product determination debug
  7. SAP UI5 Manifest fill logic
  8. SAP UI5 Logon Handler of Frame
  9. SAP Fiori :why my filter for category does not work
  10. IBASE Header change - access sequence