tornado+websocket+mongodb实现在线视屏文字聊天
最近学了tornado和mongo,所以结合websocket 实现一个聊天功能,从而加深一下相关知识点的印象
1.websocket概览
webscoket是一种全双工通信模式的协议,客户端连接服务端先通过tcp,http转为webscoket协议后,客户端和服务端都可以主动推送消息给另一端,这也是和http协议(服务端只能被动接收消息,无法主动推送消息给客户端)最大的区别。
2.tornado概览
tornado是一种异步网络库的python web框架,最初在 FriendFeed上开发,通过使用非阻塞网络I/O,tornado可以扫描数以万计打开的链接,让它成为给每个用户一个长链接的理想选择。
Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed. By using non-blocking network I/O, Tornado can scale to tens of thousands of open connections, making it ideal for long polling, WebSockets, and other applications that require a long-lived connection to each user.
3.实现在线聊天功能概览
- 判断对方是否在线,保存离线消息,在线时推送过去,并删除离线消息
- 不保存在线消息
- 单点登录模式的聊天
- 同时和多人点对点聊天

4.后端代码
import redis
import tornado.httpserver
import tornado.ioloop
import tornado.web
from motor import motor_tornado
from tornado import websocket
from tornado.gen import coroutine from conf import Config class WebHandler(websocket.WebSocketHandler):
# 在线用户dict
all_user = {} def initialize(self, mongo, redis):
self.mongo = mongo
self.redis = redis @property
def db(self):
return self.mongo.get_database('rgc') @property
def col(self):
return self.db.get_collection('web') def check_origin(self, origin):
return True # 允许WebSocket的跨域请求 @coroutine
def on_message(self, message):
#因为没有登录相关功能,每次传输都 用 # 拼接 发送者,消息,接受者
resu = str.split(message, '#') name = resu[0]
val = resu[1]
to = resu[2]
# 判断对方是否在线
if 'name:{}'.format(to) not in list(self.all_user.keys()):
self.write_message('Out Line')
# 存储消息到db
# if not self.redis.hget('name_list', '{}:{}'.format(name, to)):
# self.redis.hset('name_list', '{}:{}'.format(name, to), 1)
self.col.insert({'name': '{}:{}'.format(name, to), 'msg': val})
else:
# 发送最新消息
self.all_user['name:{}'.format(to)].write_message(val) # 检查是不是第一次上线
if 'name:{}'.format(name) not in list(self.all_user.keys()):
# 给自己发送历史消息
his_one = self.col.find({'name': '{}:{}'.format(to, name)}, {'msg': 1, '_id': 0})
for it in (yield his_one.to_list(100)):
self.write_message(it['msg'])
# 删除历史消息
self.col.delete_many({'name': '{}:{}'.format(to, name)})
# 单点登录聊天
self.all_user.update({'name:{}'.format(name): self})
# 发给自己
self.write_message('send success') def open(self):
pass def on_close(self):
# 当客户端关闭连接时,去除内存中保存的用户,让其离线
key = None
for k, v in self.all_user.items():
if v == self:
key = k
break
if key:
self.all_user.pop(key)
print('{} out line'.format(key)) class HtmlHandler(tornado.web.RequestHandler):
def get(self):
self.render("static/index.html") class StaticHandler(tornado.web.RequestHandler):
def get(self, file_url):
self.render("static/{}".format(file_url)) def make_app():
settings = {'cookie_secret': 'dfdfdfd',
'xsrf_cookies': True,
'debug': True}
other_db = {'mongo': motor_tornado.MotorClient(**Config.get('MONGO_CONF')),
'redis': redis.StrictRedis()}
return tornado.web.Application([
(r'/web', WebHandler, other_db),
(r'/', HtmlHandler),
(r'/static/(.*)', StaticHandler)
], **settings) if __name__ == '__main__':
app = make_app()
http_server = tornado.httpserver.HTTPServer(app)
ip='127.0.0.1'
port = 8000
http_server.bind(8000, ip)
http_server.start(1)
print('server start! http://{}:{}'.format(ip, port))
tornado.ioloop.IOLoop.current().start()
5.前端技术:
前端主要使用到了 MediaSource,Blob 等技术,发送视频大致思路为:先获取视频文件发送给服务端,然后从服务端发送给另一个客户端,客户端进行视频解析后播放出来。
效果展示:(因为开启浏览器视频功能,必须在https环境或者本地回环地址(127.0.0.1)中才可),所以本次效果展示是在本地进行展示
- 谷歌浏览器(因为我是后端开发,前端代码没有做兼容,并且界面有点丑)开启两个网页,输入 http://127.0.0.1:8000/
- 进入界面后,在name里输入自己的姓名,message中输入 发送给对方的消息,to 里面输入 对方名字,然后点击发送

- lucy发送工tom的信息,在发送信息时,系统检测到tom给她发了离线消息,所以一并返回给lucy。

- 视频发送测试,name和to用的还是之前的:

看一下 浏览器控制台 websocket接口的相关内容:


可以看到所有的交流都是在一个 websocket连接中,双方可以互发消息
项目代码所在地: https://github.com/Rgcsh/tornado_websocket
tornado+websocket+mongodb实现在线视屏文字聊天的更多相关文章
- PS学习之制作音乐视屏
素材: 新建画布 插入图片素材 调整和画布一样大小 喜欢彩色的 可以加照片滤镜 喜欢黑白的可以加黑白滤镜 也可以添加自己喜欢的文字 在窗口中选择时间轴 创建视屏时间轴 图中标记得就是每秒能播放30张 ...
- Node.js+websocket+mongodb实现即时聊天室
ChatRoom Node.js+websocket+mongodb实现即时聊天室 A,nodejs简介:Node.js是一个可以让javascript运行在服务器端的平台,它可以让javascrip ...
- 【学习笔记】兄弟连LINUX视屏教程(沈超 李明)
发现自己的linux水平楞个瓜皮,找个视屏教程学习一哈 1 linux系统简介 1.1 UNIX和Linux发展史 unix发展历史:1969年,美国贝尔实验室的肯.汤普森开发出unix系统,1971 ...
- Tornado WebSocket简单聊天
Tornado实现了对socket的封装:tornado.web.RequestHandler 工程目录: 1.主程序 manage.py import tornado.web import torn ...
- Python使用websocket调用语音识别,语音转文字
@ 目录 0. 太长不看系列,直接使用 1. Python调用标贝科技语音识别websocket接口,实现语音转文字 1.1 环境准备: 1.2 获取权限 1.2.1 登录 1.2.2 创建新应用 1 ...
- python tornado websocket 实时日志展示
一.主题:实时展示服务器端动态生成的日志文件 二.流程: 1. 客户端浏览器与服务器建立websocket 链接,服务器挂起保存链接实例,等待新内容触发返回动作 2. 日志服务器脚本循环去发现新内容, ...
- python tornado websocket 多聊天室(返回消息给部分连接者)
python tornado 构建多个聊天室, 多个聊天室之间相互独立, 实现服务器端将消息返回给相应的部分客户端! chatHome.py // 服务器端, 渲染主页 --> 聊天室建立web ...
- wndows程序设计之书籍知识与代码摘录-获取视屏显示器像素等参数GetsystemMetrics
以下的代码段用于获取视屏显示器的高度宽度,以像素为单位. int sxScreen, cyScreen; cxScreen = GetSystemMetrics (SM_CXSCREEN); cySc ...
- Android中使用SurfaceView+MediaPlayer+自定义的MediaController实现自定义的视屏播放器
效果图如下: (PS本来是要给大家穿gif动态图的,无奈太大了,没法上传) 功能实现:暂停,播放,快进,快退,全屏,退出全屏,等基本功能 实现的思路: 在主布局中放置一个SurfaceView,在Su ...
随机推荐
- MySQL 规范
一.数据库命令规范 二.数据库基本设计规范 三.数据库字段设计规范 四.索引设计规范 五.常见索引列建议 六.如何选择索引列的顺序 七.避免建立冗余索引和重复索引 八.优先考虑覆盖索引 九.索引SET ...
- python学习线路
第一章:计算机基础 https://www.cnblogs.com/koukouku/p/10646025.html 1.1 计算机认识 1.2操作系统 1.3 计算机的运算(进制) 1.4解释器/编 ...
- UT源码105032014093
需求描述: 设计佣金问题的程序 commission方法是用来计算销售佣金的需求,手机配件的销售商,手机配件有耳机(headphone).手机壳(Mobile phone shell).手机贴膜(Ce ...
- 使用gulp和browser-sync实现浏览器自动刷新
安装gulp (前提是已经安装了node) 全局安装: npm install -g gulp 本项目安装: npm install gulp --save-dev 安装browser-sync 全局 ...
- SSH配置
什么是SSH: SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定:SSH 为建立在应用层和传输层基础上的安全协议.SSH ...
- python numpy模块使用笔记(更新)
np.arange(int a) 生成一个一维array,元素个数是a个,元素是0到a-1 注意arange不能直接生成多维array np.arange(int a).reshape(int b,i ...
- Python实例之抓取淘宝商品数据(json型数据)并保存为TXT
本实例实现了抓取淘宝网中以‘python’为关键字的搜索结果,经详细查看数据存储于html文档中的js脚本中,数据类型为JSON 具体实现代码如下: import requests import re ...
- 两个队列实现栈&两个栈实现队列(JAVA)
1,两个栈实现队列 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路:栈的特点时先进后出,队列的特点是先进先出. 若此时有两个队列stack1,st ...
- 使用C#的aforge类库识别验证码实例
一: 验证码处理 1. 一般处理原则 这种验证码为什么说跟没有一样,第一点:字体规范工整,第二点:不旋转扭曲粘连,第三点:字体颜色单一,下面看处理步骤. 这里要注意的是,aforge只接受像素格式为 ...
- How to detect, enable and disable SMBv1, SMBv2, and SMBv3 in Windows and Windows Server
转自:https://support.microsoft.com/en-us/help/2696547/detect-enable-disable-smbv1-smbv2-smbv3-in-windo ...