Flask 实现 WebSocket 通讯---群聊和私聊
一、WebSocket介绍
WebSocket是一种在单个TCP连接实现了服务端和客户端进行双向文本或二进制数据通信的一种通信的协议。
一次请求 - 服务器收到请求 开始和客户端握手 - 保持长连接 - 数据实时 - 连接永远保持
优点:长连接 并且不影响 收发请求
缺点:连接保持,是需要资源的
二、 Flask 实现 WebSocket的基本用法
from geventwebsocket.server import WSGIServer # 我要WSGI为我提供服务
from geventwebsocket.handler import WebSocketHandler # WSGI 遇到 WS协议的时候,处理方式
from geventwebsocket.websocket import WebSocket # 语法提示
# 基于 Flask + geventwebsocket
from flask import Flask,request,render_template app = Flask(__name__) if __name__ == '__main__':
# app.run()
# 启动服务
http_serv = WSGIServer(("0.0.0.0", 7856),application=app, handler_class=WebSocketHandler)
http_serv.serve_forever()
三、Python + Flask 实现 WebSocket 通讯
1、实现简单群聊
后端代码 my_ws_ql.py:
from geventwebsocket.server import WSGIServer # 我要WSGI为我提供服务
from geventwebsocket.handler import WebSocketHandler # WSGI 遇到 WS协议的时候,处理方式
from geventwebsocket.websocket import WebSocket # 语法提示
# 基于 Flask + geventwebsocket
from flask import Flask,request,render_template app = Flask(__name__) # 存储访问的连接
user_socket_list = [] @app.route('/ws')
def my_ws_func():
user_socket = request.environ.get('wsgi.websocket') # type:WebSocket
#
user_socket_list.append(user_socket)
# web + socket
print(user_socket)
# 浏览器发起的http请求 None
# 用前端js发送的ws请求 <geventwebsocket.websocket.WebSocket object at 0x0000000003ADF2B8>
while 1:
msg = user_socket.receive() # 等待接收客户端发送过来的消息
for i in user_socket_list:
# # 剔除自己的连接(不给自己推送自己发的消息,这样自己就看不到自己发的消息只能看到其他人发的)
# if i == user_socket:
# continue
# 当循环到死链接时会抛出异常,这里捕捉一下,出现异常直接continue
try:
# 给其他连接推送消息
i.send(msg)
except:
continue
print(msg) @app.route('/group_chat')
def group_chat():
return render_template('group_chat.html') if __name__ == '__main__':
# app.run()
http_serv = WSGIServer(("0.0.0.0", 7856),application=app, handler_class=WebSocketHandler)
http_serv.serve_forever()
前端模板代码 group_chat.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p>发送消息>>> <input type="text" id="message"><button onclick="send_msg()">发送</button></p>
<div id="message_list" style="width:500px;"> </div>
</body>
<script type="text/javascript">
var ws = new WebSocket("ws://192.168.15.37:7856/ws");
// 当ws 收到消息时执行 onmessage 属性
ws.onmessage = function (event) {
console.log(event.data);
// 创建p标签,将接收到的消息加入p标签中
var ptag = document.createElement("p");
ptag.innerText = event.data;
// 将创建的p标签添加到页面中
var divtag = document.getElementById('message_list');
divtag.appendChild(ptag);
}; function send_msg() {
// 发送消息的函数
var msg = document.getElementById('message').value;
ws.send(msg);
}
</script>
</html>
2.实现简单的单独通讯
my_ws.py
import json from geventwebsocket.server import WSGIServer # 我要WSGI为我提供服务
from geventwebsocket.handler import WebSocketHandler # WSGI 遇到 WS协议的时候,处理方式
from geventwebsocket.websocket import WebSocket # 语法提示
from flask import Flask, render_template, request app = Flask(__name__) # user_socket_dict = {"ZWQ":<geventwebsocket.websocket.WebSocket object at 0x000002699374A730>,
# "清风徐来":<geventwebsocket.websocket.WebSocket object at 0x000002699374A5F8>} user_socket_dict = {} @app.route('/ws/<nickname>')
def my_ws_func(nickname): user_socket = request.environ.get("wsgi.websocket") # type: WebSocket
user_socket_dict[nickname] = user_socket
print(len(user_socket_dict), user_socket_dict)
# web + socket
# print(user_socket)
while 1:
msg = user_socket.receive() # 等待接收客户端发送过来的消息
print(msg)
msg = json.loads(msg) # Dict
"""
Dict
{
to_user:ZWQ
from_user:清风徐来
message: "我是清风徐来发给ZWQ的一条消息"
}
"""
to_user_socket = user_socket_dict.get(msg.get("to_user")) # 获取发送地址
msg_json = json.dumps(msg)
to_user_socket.send(msg_json) @app.route('/private_chat')
def privatre_chat():
return render_template('private_chat.html') if __name__ == '__main__':
http_ws = WSGIServer(("0.0.0.0",7856), application=app,handler_class=WebSocketHandler)
http_ws.serve_forever()
模板代码 private_chat.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p>登录名 :<input type="text" id="nick"> <button onclick="login()">登录</button></p>
<p> 给 <input type="text" id="to_user"> </p>
<p> 发送消息: <input type="text" id="message"><button onclick="send_msg()">发送</button> </p>
<div id="message_list" style="width: 500px">
</div>> </body>
<script type="text/javascript">
var ws = null; function send_msg() {
var msg = document.getElementById('message').value;
var to_user = document.getElementById('to_user').value;
var nick = document.getElementById('nick').value;
var msg_obj = {
to_user:to_user,
from_user:nick,
msg:msg
};
var msg_json = JSON.stringify(msg_obj);
ws.send(msg_json);
} function login() {
var nick = document.getElementById("nick").value;
ws = new WebSocket("ws://192.168.15.33:7856/ws/"+nick);
// 收到消息执行onmessage属性
ws.onmessage = function (event) {
data_obj = JSON.parse(event.data); // 将JSON数据反序列化
var ptag = document.createElement('p');
ptag.innerText = data_obj.from_user + ":" + data_obj.msg;
var divtag = document.getElementById('message_list');
divtag.appendChild(ptag);
}
} </script>
</html>
Flask 实现 WebSocket 通讯---群聊和私聊的更多相关文章
- websocket实现群聊和单聊(转)
昨日内容回顾 1.Flask路由 1.endpoint="user" # 反向url地址 2.url_address = url_for("user") 3.m ...
- 一例完整的websocket实现群聊demo
前言 业余我都会花一些时间在tcp.http和websocket等领域的学习,现在觉得有点收获,所以把一个基于websocket的群聊功能的例子提供给大家玩玩.当然这是一个很完整的例子,包括webso ...
- Flask+WebSocket实现群聊与单聊功能
在开始我们的程序代码之前,先来了解一下相关的基础知识: 1.什么是websocket? (1)WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议.WebSocket ...
- Websocket实现群聊、单聊
Websocket 使用的第三方模块:gevent-websocket 群聊 ws群聊.py中的内容 from flask import Flask, request, render_template ...
- websocket实现群聊
server # @File: 群聊 from flask import Flask, render_template, request from geventwebsocket.handler im ...
- Flask实现简单的群聊和单聊
Flask是使用python写的一个简单轻量级的框架,今天我们使用Flask实现一个简单的单聊和群聊功能 . 主要思路 : 前端登录聊天室,聊天室信息包含用户的登录信息,相当于一个登录功能,会把这个信 ...
- Android中脱离WebView使用WebSocket实现群聊和推送功能
WebSocket是Web2.0时代的新产物,用于弥补HTTP协议的某些不足,不过他们之间真实的关系是兄弟关系,都是对socket的进一步封装,其目前最直观的表现就是服务器推送和聊天功能.更多知识参考 ...
- WebSocket群聊与单聊
一 . WebSocket实现群聊 py文件代码 # py文件 from flask import Flask, render_template, request from geventwebsock ...
- spring websocket 和socketjs实现单聊群聊,广播的消息推送详解
spring websocket 和socketjs实现单聊群聊,广播的消息推送详解 WebSocket简单介绍 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了.近年来,随 ...
随机推荐
- .net体系与java体系
对于.NET Framework体系结构,参考了"你必须知道的.NET"并”借用“别人的经典体系结构图从宏观上说明一下我的理解. 图1 简单的说下几个名词: CLR: 通用语言运行 ...
- 怎样完整地离线更新并升级基于 Debian 的操作系统
不久之前我已经向你展示了如何在任意离线的 Ubuntu 和 Arch Linux 操作系统上安装软件. 今天,我们将会看看如何完整地离线更新并升级基于 Debian 的操作系统. 和之前所述方法的不同 ...
- Java数据结构和算法(一)概念
Java数据结构和算法(一)概念 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 一.逻辑结构 数据之间的相互关系称为逻辑结构 ...
- KOBAS
1. What is KOBAS 3.0? KOBAS (KEGG Orthology Based Annotation System) is a web server for gene/protei ...
- 判定map中是否存在某元素
判断某key是否存在可以使用map的count方法来间接判定 count接受一个参数key值,返回map中key值为给定值的元素总数 map<int, string> i_to_s_map ...
- OSC和GitHub中项目公钥和管理公钥
对于开源托管网站GitHub大家应该不陌生吧,以前一直设置的是github上面的ssh公钥,一直没有发生什么问题,今天在遇到一个问题:git同时把代码push到两个远程仓库.所以就在github和os ...
- 【科普】Web(瓦片)地图的工作原理
[译者按:在看MapBox Guides文档时,看到这篇 How do web maps work?,这篇文档通俗易懂地阐述了Web地图是如何工作的,其实更偏向讲瓦片地图的工作原理,鉴于之前很多人不了 ...
- IOS11下fixed中input光标错位问题
项目遇到了这个问题,故作了个临时解决方案,暂时没有想到更好的方法,查阅了网上的方案,也没有找到完美的解决方案. 方案思路: ①弹窗打开时,阻止 body 滚动,禁用 touchmove ,同时记录当前 ...
- MFC中添加新的对话框
MFC工程中,除了系统自动生成的一些对话框之外,还需要根据自己的需求,添加新的对话框.这里总结下自己最近使用的方法. 首先,找到Resource View中自己新建的工程,然后右键,选择Add Cla ...
- HDU6026 Deleting Edges 2017-05-07 19:30 38人阅读 评论(0) 收藏
Deleting Edges Time ...