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 相关文章推荐
发布你的Python模块详解
Sep 15 Python
Python的标准模块包json详解
Mar 13 Python
python中协程实现TCP连接的实例分析
Oct 14 Python
Python3实现的旋转矩阵图像算法示例
Apr 03 Python
Python网络爬虫之爬取微博热搜
Apr 18 Python
Python使用pyautocad+openpyxl处理cad文件示例
Jul 11 Python
Django 对象关系映射(ORM)源码详解
Aug 06 Python
python如何调用字典的key
May 25 Python
python如何求100以内的素数
May 27 Python
python golang中grpc 使用示例代码详解
Jun 03 Python
Python collections.deque双边队列原理详解
Oct 05 Python
pycharm 关闭search everywhere的解决操作
Jan 15 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
PHP5 操作MySQL数据库基础代码
2009/09/29 PHP
PHP查询MySQL大量数据的时候内存占用分析
2011/07/22 PHP
PHP面向对象程序设计之类常量用法实例
2014/08/20 PHP
用 Composer构建自己的 PHP 框架之使用 ORM
2014/10/30 PHP
使用PHP生成二维码的方法汇总
2015/07/22 PHP
PHP使用缓存即时输出内容(output buffering)的方法
2015/08/03 PHP
PHP脚本自动识别验证码查询汽车违章
2016/12/20 PHP
详解PHP版本兼容之openssl调用参数
2018/07/25 PHP
PHP实现的策略模式示例
2019/03/20 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
围观tangram js库
2010/12/28 Javascript
js数值计算时使用parseInt进行数据类型转换(jquery)
2014/10/07 Javascript
JS实现在网页中弹出一个输入框的方法
2015/03/03 Javascript
JavaScript中Number.MAX_VALUE属性的使用方法
2015/06/04 Javascript
实现placeholder效果的方案汇总
2015/06/11 Javascript
基于javascript实现的购物商城商品倒计时实例
2016/12/11 Javascript
JavaScript表单验证的两种实现方法
2017/02/11 Javascript
Angular.JS中的this指向详解
2017/05/17 Javascript
使用vue-router切换页面时实现设置过渡动画
2019/10/31 Javascript
详解ECMAScript2019/ES10新属性
2019/12/06 Javascript
Vue 同步异步存值取值实现案例
2020/08/05 Javascript
python利用hook技术破解https的实例代码
2013/03/25 Python
Python MD5加密实例详解
2017/08/02 Python
基于python select.select模块通信的实例讲解
2017/09/21 Python
redis之django-redis的简单缓存使用
2018/06/07 Python
Python解析json时提示“string indices must be integers”问题解决方法
2019/07/31 Python
解决django FileFIELD的编码问题
2020/03/30 Python
python利用faker库批量生成测试数据
2020/10/15 Python
css3 响应式媒体查询的示例代码
2019/09/25 HTML / CSS
交通事故检查书范文
2014/01/30 职场文书
学校运动会广播稿
2014/10/11 职场文书
2014年环境整治工作总结
2014/12/10 职场文书
二手车转让协议书
2015/01/29 职场文书
放假通知格式
2015/04/14 职场文书
恋恋笔记本观后感
2015/06/16 职场文书
MySql新手入门的基本操作汇总
2021/05/13 MySQL