Flask-SocketIO服务端安装及使用代码示例


Posted in Python onNovember 26, 2020

安装Flask-Sockets很容易:

pip install flask-socketio

注意Flask-SocketIO依赖gevent库,目前它仅可以在python2上运行(译者注:python3.6测试也可以)。gevent很快也会对python3支持。

下面是一个Flask-SocketIO在Flask应用上的实现例子:

from flask import Flask, request, jsonify,render_template
from flask_socketio import SocketIO, emit


app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)


@app.route('/')
def index():
  return render_template('test.html')

#触发事件my event:回复只发送此连接
@socketio.on('my_event', namespace='/chat')
def test_message(message):
  print(message)
  emit('my_response', {'data': message['data']})


#触发事件my broadcast event::回复所有链接(广播)
@socketio.on('my_broadcast event', namespace='/chat')
def test_message(message):
  print(message)
  emit('my_response', {'data': message['data']}, broadcast=True)

##################################################################
#自动连接和自动断开触发
@socketio.on('connect', namespace='/chat')
def test_connect():
  print("连接到来")
  emit('my_response', {'data': 'Connected'})

@socketio.on('disconnect', namespace='/chat')
def test_disconnect():
  print("连接断开")
  print('Client disconnected')

if __name__ == '__main__':
  socketio.run(app,host='0.0.0.0',port=8200,debug=True)

对应的test.html,注意一个问题:flask是从与启动文件同级的templates查找模板的。

test.html

官方完整示例

#!/usr/bin/env python
from threading import Lock
from flask import Flask, render_template, session, request, \
  copy_current_request_context
from flask_socketio import SocketIO, emit, join_room, leave_room, \
  close_room, rooms, disconnect

# Set this variable to "threading", "eventlet" or "gevent" to test the
# different async modes, or leave it set to None for the application to choose
# the best option based on installed packages.
async_mode = None

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app, async_mode=async_mode)
thread = None
thread_lock = Lock()

def background_thread():
  """Example of how to send server generated events to clients."""
  count = 0
  while True:
    socketio.sleep(100)
    count += 1
    socketio.emit('my_response',
           {'data': 'Server generated event', 'count': count},
           namespace='/test')

@app.route('/')
def index():
  return render_template('test1.html', async_mode=socketio.async_mode)

@socketio.on('my_event', namespace='/test')
def mtest_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')
def mtest_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')
def join(message):
  print(message)
  join_room(message['room'])
  session['receive_count'] = session.get('receive_count', 0) + 1
  emit('my_response',
     {'data': 'In rooms: ' + ', '.join(rooms()),
     'count': session['receive_count']})

@socketio.on('leave', namespace='/test')
def leave(message):
  print(message)
  leave_room(message['room'])
  session['receive_count'] = session.get('receive_count', 0) + 1
  emit('my_response',
     {'data': 'In rooms: ' + ', '.join(rooms()),
     'count': session['receive_count']})

@socketio.on('close_room', namespace='/test')
def close(message):
  session['receive_count'] = session.get('receive_count', 0) + 1
  emit('my_response', {'data': 'Room ' + message['room'] + ' is closing.',
             'count': session['receive_count']},
     room=message['room'])
  close_room(message['room'])

@socketio.on('my_room_event', namespace='/test')
def send_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')
def test_connect():
  print("连接到来")
  emit('my response', {'data': 'Connected'})

@socketio.on('disconnect', namespace='/test')
def test_disconnect():
  print("连接断开")
  print('Client disconnected')


if __name__ == '__main__':
  socketio.run(app, debug=True,port= 8200)

test1.html

<!DOCTYPE HTML>
<html>
<head>
  <title>Flask-SocketIO Test</title>
  <script src="https://cdn.bootcdn.net/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js" integrity="sha256-yr4fRk/GU1ehYJPAs8P4JlTgu0Hdsp4ZKrx8bDEDC3I=" crossorigin="anonymous"></script>
  <script type="text/javascript" charset="utf-8">
      $(document).ready(function(){
     var socket = io.connect('http://' + document.domain + ':' + location.port + '/test');
       socket.on('my_response', function(msg) {
         $('#log').append('<p>Received: ' + msg.data + '</p>');
    });

      $('form#emit').submit(function(event) {
        socket.emit('my_event', {data: $('#emit_data').val()});
        return false;
      });
      $('form#broadcast').submit(function(event) {
        socket.emit('my_broadcast_event', {data: $('#broadcast_data').val()});
        return false;
      });
      $('form#join').submit(function(event) {
        socket.emit('join', {room: $('#join_room').val()});
        return false;
      });
      $('form#leave').submit(function(event) {
        socket.emit('leave', {room: $('#leave_room').val()});
        return false;
      });
      $('form#send_room').submit(function(event) {
        socket.emit('my_room_event', {room: $('#room_name').val(), data: $('#room_data').val()});
        return false;
      });
      $('form#close').submit(function(event) {
        socket.emit('close_room', {room: $('#close_room').val()});
        return false;
      });
      $('form#disconnect').submit(function(event) {
        socket.emit('disconnect_request');
        return false;
      });
    });
  </script>
</head>
<body>
  <h1>Flask-SocketIO Test</h1>
  <p>Async mode is: <b>{{ async_mode }}</b></p>
  <p>Average ping/pong latency: <b><span id="ping-pong"></span>ms</b></p>
  <h2>Send:</h2>
  <form id="emit" method="POST" action='#'>
    <input type="text" name="emit_data" id="emit_data" placeholder="Message">
    <input type="submit" value="Echo">
  </form>
  <form id="broadcast" method="POST" action='#'>
    <input type="text" name="broadcast_data" id="broadcast_data" placeholder="Message">
    <input type="submit" value="Broadcast">
  </form>
  <form id="join" method="POST" action='#'>
    <input type="text" name="join_room" id="join_room" placeholder="Room Name">
    <input type="submit" value="Join Room">
  </form>
  <form id="leave" method="POST" action='#'>
    <input type="text" name="leave_room" id="leave_room" placeholder="Room Name">
    <input type="submit" value="Leave Room">
  </form>
  <form id="send_room" method="POST" action='#'>
    <input type="text" name="room_name" id="room_name" placeholder="Room Name">
    <input type="text" name="room_data" id="room_data" placeholder="Message">
    <input type="submit" value="Send to Room">
  </form>
  <form id="close" method="POST" action="#">
    <input type="text" name="close_room" id="close_room" placeholder="Room Name">
    <input type="submit" value="Close Room">
  </form>
  <form id="disconnect" method="POST" action="#">
    <input type="submit" value="Disconnect">
  </form>
  <h2>Receive:</h2>
  <div id="log"></div>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python3 实现的人人影视网站自动签到
Jun 19 Python
对numpy 数组和矩阵的乘法的进一步理解
Apr 04 Python
python Spyder界面无法打开的解决方法
Apr 27 Python
python 3.7.0 下pillow安装方法
Aug 27 Python
详解Python 字符串相似性的几种度量方法
Aug 29 Python
利用Python的turtle库绘制玫瑰教程
Nov 23 Python
Django接收照片储存文件的实例代码
Mar 07 Python
Python描述符descriptor使用原理解析
Mar 21 Python
Python过滤掉numpy.array中非nan数据实例
Jun 08 Python
Django用内置方法实现简单搜索功能的方法
Dec 18 Python
还在手动盖楼抽奖?教你用Python实现自动评论盖楼抽奖(一)
Jun 07 Python
浅谈Python数学建模之整数规划
Jun 23 Python
使用OpenCV校准鱼眼镜头的方法
Nov 26 #Python
最新PyCharm 2020.2.3永久激活码(亲测有效)
Nov 26 #Python
Django-celery-beat动态添加周期性任务实现过程解析
Nov 26 #Python
Django celery异步任务实现代码示例
Nov 26 #Python
Django通过设置CORS解决跨域问题
Nov 26 #Python
Django利用elasticsearch(搜索引擎)实现搜索功能
Nov 26 #Python
python模拟点击在ios中实现的实例讲解
Nov 26 #Python
You might like
《PHP编程最快明白》第七讲:php图片验证码与缩略图
2010/11/01 PHP
用PHP的超级变量$_GET获取HTML表单(Form) 数据
2011/05/07 PHP
PHP pear安装配置教程
2016/05/14 PHP
将PHP的session数据存储到数据库中的代码实例
2016/06/24 PHP
一文掌握PHP Xdebug 本地与远程调试(小结)
2019/04/23 PHP
远离JS灾难css灾难之 js私有函数和css选择器作为容器
2011/12/11 Javascript
document.getElementById获取控件对象为空的解决方法
2013/11/20 Javascript
js中继承的几种用法总结(apply,call,prototype)
2013/12/26 Javascript
文本框(input)获取焦点(onfocus)时样式改变的示例代码
2014/01/10 Javascript
js控制文本框只输入数字和小数点的方法
2015/03/10 Javascript
浅谈JavaScript中的字符编码转换问题
2015/07/07 Javascript
js简单正则验证汉字英文及下划线的方法
2016/11/28 Javascript
JavaScript之面向对象_动力节点Java学院整理
2017/06/29 Javascript
layui树形菜单动态遍历的例子
2019/09/23 Javascript
jquery实现商品sku多属性选择功能(商品详情页)
2019/12/20 jQuery
简介JavaScript错误处理机制
2020/08/04 Javascript
openlayers4实现点动态扩散
2020/08/17 Javascript
基于Python函数的作用域规则和闭包(详解)
2017/11/29 Python
Python使用matplotlib绘制正弦和余弦曲线的方法示例
2018/01/06 Python
python leetcode 字符串相乘实例详解
2018/09/03 Python
Python 使用指定的网卡发送HTTP请求的实例
2019/08/21 Python
部署Django到阿里云服务器教程示例
2020/06/03 Python
Python读取二进制文件代码方法解析
2020/06/22 Python
python实现数字炸弹游戏程序
2020/07/17 Python
澳大利亚当地最大的时装生产商:Cue
2018/08/06 全球购物
领先的荷兰线上超市:荷兰之家Holland at Home(支持中文)
2021/01/21 全球购物
Wolford法国官网:奥地利奢侈内衣品牌
2020/08/11 全球购物
如何让Java程序执行效率更高
2014/06/25 面试题
行政管理专业推荐信
2013/11/02 职场文书
小学生我的梦想演讲稿
2014/08/21 职场文书
大学毕业生个人总结
2015/02/28 职场文书
毕业生就业推荐表自我评价
2015/03/02 职场文书
幸福终点站观后感
2015/06/04 职场文书
2019年幼儿园管理条例范本!
2019/07/17 职场文书
sql通过日期判断年龄函数的示例代码
2021/07/16 SQL Server
Android 中的类文件和类加载器详情
2022/06/05 Java/Android