原文转载自「刘悦的技术博客」https://v3u.cn/a_id_158

在之前的一篇文章中:为美多商城(Django2.0.4)添加基于websocket的实时通信,主动推送,聊天室及客服系统,详细介绍了websocket协议以及结合Django如何实现各种功能,本次我们尝试采用Socket.io这个库和Flask来配合使用,完成一个简易的在线客服聊天系统,看看二者有什么区别。

http://Socket.IO 就是一个封装了 Websocket、基于 Node 的 JavaScript 框架,包含 client 的 JavaScript 和 server 的 Node(现在也支持python,go lang等语言)。其屏蔽了所有底层细节,让顶层调用非常简单,另外,http://Socket.IO 还有一个非常重要的好处。其不仅支持 WebSocket,还支持许多种轮询机制以及其他实时通信方式,并封装了通用的接口。这些方式包含 Adobe Flash Socket、Ajax 长轮询、Ajax multipart streaming 、持久 Iframe、JSONP 轮询等。换句话说,当 http://Socket.IO 检测到当前环境不支持 WebSocket 时,能够自动地选择最佳的方式来实现网络的实时通信,这一点就比websocket要智能不少。

我们先进行后端服务的搭建

pip install flask
pip install flask-cors
pip install flask-socketio

分别安装Flask本地,跨域模块,以及socketio模块

适当升级你的pip,注意版本不要过低,下面是本次demo的版本号

Flask                 1.1.1
Flask-Cors            3.0.8
Flask-SocketIO        4.3.0
Flask-SQLAlchemy      2.4.1

随后我们简单写一个flask的入口启动文件 manage.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import pymysql
from flask import request,jsonify
from flask_cors import CORS
from flask_socketio import SocketIO,send,emit
import urllib.parse  pymysql.install_as_MySQLdb()  app = Flask(__name__)  CORS(app,cors_allowed_origins="*")  socketio = SocketIO(app,cors_allowed_origins='*')  @socketio.on('message')
def handle_message(message):  message = urllib.parse.unquote(message)  print(message)  send(message,broadcast=True)  @socketio.on('connect', namespace='/chat')
def test_connect():  emit('my response', {'data': 'Connected'})  @socketio.on('disconnect', namespace='/chat')
def test_disconnect():  print('Client disconnected')  if __name__ == '__main__':  socketio.run(app,debug=True,host="0.0.0.0",port=5000)

这里简单说一下需要注意的地方,实例化socketio对象的时候,要加上cors_allowed_origins来设置跨域,前后端分离项目让人伤脑筋的地方就是浏览器同源策略问题,而跨域最好由server端来单独配置,这样的好处是当多个前端项目同时共用一套微服务接口时,就不用每个前端项目都配置一次跨域了。

我们写了三个基于socketio的视图方法,connect和disconnect顾名思义,当clinet发起连接或者断开时我们可以及时捕获到,而message方法就是前后端进行消息通信的重要方法。

发送消息的时候方法加了一个broadcast参数,这是http://socket.io极具特色的功能,类似广播的效果,可以同时给不同链接的client发送消息,即可以用于聊天,也可以用来做消息推送。

最后需要注意的一点是,client发送消息时,最好用urlencode编码一下,这样可以解决中文乱码问题,而在server端,可以用urllib.parse.unquote()来进行解码操作。

运行命令启动后端服务

python3 manage.py

服务正常启动在5000端口上,就说明后端没有问题了。

随后我们来配置前端(client),前端采用vue2.0框架来驱动,也需要安装http://socket.io模块

npm install vue-socket.io@2.1.0

这里一定要指定版本号来安装,版本是2.1.0,因为该依赖的最新版在vue2.0项目中编译时会报错

在入口文件main.js中引用

import VueSocketio from 'vue-socket.io';  Vue.use(VueSocketio,'http://127.0.0.1:5000');

注意链接的url是后端服务的地址+端口,千万不要加其他url后缀或者命名空间

新建一个index.vue组件来进行模拟用户链接

<template>  <div>  <div v-for="item in log_list"  >  {{item}}  </div>  <input v-model="msg" />  <button @click="send">发送消息</button>  </div>  </template>  <script>  export default {  data () {  return {  msg: "",  log_list:[]  }  },  //注册组件标签  components:{  },  sockets:{  connect: function(){  console.log('socket 连接成功')  },  message: function(val){  console.log('返回:'+val);  this.log_list.push(val);  }
},  mounted:function(){  },  methods:{  send(){  this.$socket.emit('message',encodeURI("用户:"+this.msg));  },  }
}  </script>  <style>  </style>

启动前端服务

npm run dev

访问前端页面 http://localhost:8080 可以看到服务成功链接

这时可以尝试再做一个后台客服的组件页面item.vue,模拟用户和客服分别在不同的电脑进行聊天的场景

<template>  <div>  <div v-for="item in log_list"  >  {{item}}  </div>  <input v-model="msg" />  <button @click="send">发送消息</button>  </div>  </template>  <script>  export default {  data () {  return {  msg: "",  log_list:[]  }  },  //注册组件标签  components:{  },  sockets:{  connect: function(){  console.log('socket 连接成功')  },  message: function(val){  console.log('返回:'+val);  this.log_list.push(val);  }
},  mounted:function(){  },  methods:{  send(){  this.$socket.emit('message',encodeURI("客服:"+this.msg));  },  }
}  </script>  <style>  </style>

效果是这样的:

整个流程还是相对简单的,比起django的dwebsocket模块,http://socket.io显然更加灵活和方便,如果需要做一些主动推送任务,也可以利用http://socket.io的广播功能,其原理和实时聊天是一样的。

原文转载自「刘悦的技术博客」 https://v3u.cn/a_id_158

flask manage port_后端Python3+Flask结合Socket.io配合前端Vue2.0实现简单全双工在线客服系统...相关推荐

  1. python 在线客服_后端Python3+Flask结合Socket.io配合前端Vue2.0实现简单全双工在线客服系统...

    在之前的一篇文章中:为美多商城(Django2.0.4)添加基于websocket的实时通信,主动推送,聊天室及客服系统,详细介绍了websocket协议以及结合Django如何实现各种功能,本次我们 ...

  2. 网页在线客服系统-im及时聊天工具socket代码

    //断开链接,关系客户端 /** * @Author  chenzhenhui <971688607@qq.com> * @Copyright  2020~2030 http://www. ...

  3. 项目接入即时聊天客服系统(环信系统)PHP后端操作

    环信工作原理: 一.由于环信没有直接的接口来主动调取本项目中的用户数据,所有用户信息必须在环信服务器上注册对应信息成为环信的用户:(这样才能当用户进入聊天时显示其基本信息,如:名称.昵称.电话.邮箱等 ...

  4. flask manage port_nginx+uwsgi+python+flask环境搭建

    环境的准备 # yum -y install gcc gcc-c++ zlib zlib-devel openssl openssl-devel pcre pcre-devel GeoIP gd li ...

  5. html5在线客服源码 websocket c# socket 实现,可扩展 im 即时通讯 完整的源代码,在线聊天

    在线客服系统源代码,客户端使用 websocket实现,服务器端使用C#实现,服务器端源码完全开在线客服系统源代码,客户端使用 websocket实现,服务器端使用C#实现,完整的源代码.可扩展性强根 ...

  6. 一款支持公众号后端数据同步带分销在线客服物流追踪的小程序商城源码

    近年来,社交电商成为热门话题,拼多多又给社交电商点了一把火.有人说拼多多帮助腾讯补上了电商短板,也有人说拼多多模式只能短期存在,没办法和阿里.京东相提并论.无论怎样,拼多多的3亿用户足矣值得我们深入探 ...

  7. 小程序客服功能php后端文档,小程序添加在线客服功能

    小程序添加客服功能 (学习视频分享:编程视频) 一.需要在小程序中加入一个客服消息按钮 小程序接入微信「客服消息」功能模块,开发者只需要调用按钮,触发微信的客服消息功能即可,不需要自行在小程序中实现. ...

  8. 使用Node.js+Socket.IO搭建WebSocket实时应用

    Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新.它有着广泛的应用场景,比如在线聊天室.在线客服系统.评论系统.WebIM等. 作 ...

  9. nodejs socket.io 聊天室

    阅读目录 需求分析 Node.js Socket.IO 安装Node.js 搭建WebSocket服务端 服务端代码实现 客户端代码实现 Web领域的实时推送技术,也被称作Realtime技术.这种技 ...

最新文章

  1. word文档基本编辑功能_【读者培训】Word在编辑长文档时的基本应用
  2. GIS项目中数据开源、工具开源、开发开源的解决方案
  3. Python调用MySQL模块初试
  4. [转]创建一个JavaScript弹出DIV窗口层的效果
  5. 关于winodows下编程c++遇到的引用文件路径问题
  6. linux网络编程之posix 线程(三):posix 匿名信号量与互斥锁 示例生产者--消费者问题
  7. 如何用程序实现对IE中scripts的控制(禁止和允许)
  8. Exchange 2013 MAPI over HTTP
  9. Doris之故障恢复(重点)
  10. Pycharm远程调试服务器程序
  11. 哪些计算机的应用需采用多媒体技术,计算机多媒体技术的应用现状与发展前景...
  12. 联想服务器控制口登录地址_常用设备管理口默认用户名密码汇总
  13. 共轴双桨直升机飞行原理介绍
  14. PowerDesign使用
  15. it试用评估_it员工转正自我评价
  16. pacman安装ubuntu_pacman命令 – 软件包管理器
  17. 借助HttpCombiner让你的网站加速
  18. php 极光短信发送 api
  19. Bazel编译教程(基础篇)
  20. Kubernetes详解(三十七)——PV与PVC

热门文章

  1. jboss7.1.安装配置
  2. /bin/bash: jar: command not found(
  3. Matlab面向对象编程
  4. 记录hadoop HDFS与hadoop YARN无法访问问题
  5. Redis如何实现刷抖音不重复-布隆过滤器(Bloom Filter)
  6. SweetAlert用法
  7. springmvc框架原理分析
  8. AutoLayout屏幕适配
  9. 错误:this is incompatible with sql_mode=only_full_group_by
  10. 《软件需求》阅读笔记之一