flask + websocket实现简单的单聊和群聊
单聊
from flask import Flask,request,render_template
from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer
from geventwebsocket.websocket import WebSocket
import json app = Flask(__name__) user_socket_dict = {} @app.route('/ws/<username>')
def ws(username):
user_socket = request.environ.get('wsgi.websocket') # type:WebSocket
user_socket_dict[username] = user_socket print(len(user_socket_dict),user_socket_dict) while 1:
try:
msg = user_socket.receive()
msg = json.loads(msg)
to_user = msg.get('to_user')
content = msg.get('msg')
usocket = user_socket_dict.get(to_user)
recv_msg = {
'from_user':username,
'msg':content
} usocket.send(json.dumps(recv_msg))
except:
pass @app.route('/chat')
def chat():
return render_template('chat.html') if __name__ == '__main__':
http_serv = WSGIServer(('0.0.0.0',5000),app,handler_class=WebSocketHandler)
http_serv.serve_forever()
python代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>单聊</title>
</head>
<body>
<input type="text" id="username">
<button onclick="open_ws()">连接服务器</button>
<p>给:<input type="text" id="to_user"></p>
<p>发送消息:<input type="text" id="msg"></p>
<button onclick="send_msg()">发送</button>
<div id="chat" style="width: 500px; height: 500px;"></div> <script type="text/javascript">
var ws = null;
function open_ws() {
var username = document.getElementById('username').value;
ws = new WebSocket('ws://192.168.19.34:5000/ws/' + username);
ws.onmessage = function (data) {
var msg = JSON.parse(data.data);
var ptag = document.createElement('p');
ptag.innerText = msg.from_user + ':' + msg.msg;
document.getElementById('chat').appendChild(ptag);
};
} function send_msg() {
var msg = document.getElementById('msg').value;
var to_user = document.getElementById('to_user').value;
var send_obj = {to_user:to_user,msg:msg};
ws.send(JSON.stringify(send_obj));
}
</script>
</body> </html>
页面
群聊
#!/usr/bin/env python
# -*- coding=utf-8 -*-
from flask import Flask,request,render_template
from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer
from geventwebsocket.websocket import WebSocket
import json app = Flask(__name__) user_socket_list = [] @app.route('/ws')
def ws():
user_socket = request.environ.get('wsgi.websocket') # type:WebSocket
user_socket_list.append(user_socket)
print(len(user_socket_list),user_socket_list)
while 1:
try:
msg = user_socket.receive()
for usocket in user_socket_list:
if usocket != user_socket:
usocket.send(msg)
except:
user_socket_list.remove(user_socket) @app.route('/chat')
def chat():
return render_template('ws.html') if __name__ == '__main__':
http_serv = WSGIServer(('0.0.0.0',5000),app,handler_class=WebSocketHandler)
http_serv.serve_forever()
Python代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p>发送消息:<input type="text" id="msg"></p>
<button onclick="send_msg()">发送</button>
<div id="chat" style="width: 500px;height: 500px;"></div>
<script type="text/javascript">
var ws = new WebSocket('ws://192.168.19.34:5000/ws');
ws.onmessage = function (data) {
var ptag = document.createElement('p');
ptag.innerText = data.data;
document.getElementById('chat').appendChild(ptag);
}; function send_msg() {
var msg = document.getElementById('msg').value;
ws.send(msg)
}
</script>
</body>
</html>
页面
flask + websocket实现简单的单聊和群聊的更多相关文章
- SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)
SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=>提升,5个Demo贯彻全篇,感兴趣的玩才是真的学) 官方demo:http://www.asp.net/si ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(三) 之 实现单聊,群聊,发送图片,文件。
上篇讲解了如何搭建聊天服务器,以及客户端js怎么和layui的语法配合.服务器已经连接上了,那么聊天还会远吗? 进入正题,正如上一篇提到的我们用 Client.Group(groupId)的方法向客户 ...
- netty无缝切换rabbitmq、activemq、rocketmq实现聊天室单聊、群聊功能
netty的pipeline处理链上的handler:需要IdleStateHandler心跳检测channel是否有效,以及处理登录认证的UserAuthHandler和消息处理MessageHan ...
- 基于netty实现单聊、群聊功能
学习资料 https://juejin.im/book/5b4bc28bf265da0f60130116/section/5b6a1a9cf265da0f87595521 收获: 转载 1. Nett ...
- Flask实现简单的群聊和单聊
Flask是使用python写的一个简单轻量级的框架,今天我们使用Flask实现一个简单的单聊和群聊功能 . 主要思路 : 前端登录聊天室,聊天室信息包含用户的登录信息,相当于一个登录功能,会把这个信 ...
- Websocket实现群聊、单聊
Websocket 使用的第三方模块:gevent-websocket 群聊 ws群聊.py中的内容 from flask import Flask, request, render_template ...
- nodejs与websocket模拟简单的聊天室
nodejs与websocket模拟简单的聊天室 server.js const http = require('http') const fs = require('fs') var userip ...
- Asp.net SignalR 应用并实现群聊功能 开源代码
ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程.实时 Web 功能是指这样一种功能:当所连接的客户端变得可用时服务 ...
- 一套高可用、易伸缩、高并发的IM群聊架构方案设计实践
本文原题为“一套高可用群聊消息系统实现”,由作者“于雨氏”授权整理和发布,内容有些许改动,作者博客地址:alexstocks.github.io.应作者要求,如需转载,请联系作者获得授权. 一.引言 ...
随机推荐
- 大数据之路【第十四篇】:数据挖掘--推荐算法(Mahout工具)
数据挖掘---推荐算法(Mahout工具) 一.简介 Apache顶级项目(2010.4) Hadoop上的开源机器学习库 可伸缩扩展的 Java库 推荐引擎(协同过滤).聚类和分类 二.机器学习介绍 ...
- 【leetcode】347. Top K Frequent Elements
题目地址:https://leetcode.com/problems/top-k-frequent-elements/ 从一个数组中求解出现次数最多的k个元素,本质是top k问题,用堆排序解决. 关 ...
- AJAX调用数据,滚动到底部
最近一个小项目里面,需要使用AJAX去拉取数据,并且直接显示最后一条信息,也就是滚动到底部.实现脚本如下: var scrollHeight = $('.txtBox3').prop("sc ...
- BZOJ1060或洛谷1131 [ZJOI2007]时态同步
BZOJ原题链接 洛谷原题链接 看上去就觉得是一道树形\(\mathtt{DP}\),不过到头来我发现我写了一个贪心.. 显然对越靠近根(记为\(r\))的边进行加权贡献越大,且同步的时间显然是从根到 ...
- mybatis逆向生成dao mapper和example.java文件
mabatis插件 <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>myba ...
- Spring MVC之@ControllerAdvice详解
本文链接:https://blog.csdn.net/zxfryp909012366/article/details/82955259 对于@ControllerAdvice,我们比较熟知的用法是 ...
- 复杂sql语句之单字段分类count计数和多字段count计数
SELECT AF_DEPARTMENT, dept.FULLNAME, SUM(CASE AF_CLASSIFY WHEN THEN ELSE END) AS 'o_standard', (COUN ...
- C# vb .net实现相机视图效果滤镜
在.net中,如何简单快捷地实现Photoshop滤镜组中的相机视图效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第 ...
- 使用Bootstrap的popover标签中嵌入插件,并且为插件注册事件实现Ajax与后台交互
下午研究了一下bootstrap的popover写了个例子.如果项目很多地方都需要用到可以考虑封装成插件. javascript代码: <script type="text/javas ...
- 个人项目(java实现)
一.github地址:https://github.com/Moyjing/Moy 二.psp表格 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实 ...