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.应作者要求,如需转载,请联系作者获得授权. 一.引言 ...
随机推荐
- Spring 通过@Import实现Bean的注册
今天看到一个神奇的用法, Spring可以通过@Import导入实现了ImportBeanDefinitionRegistrar接口的类来注册那个类. ImportBeanDefinitionRegi ...
- kafka 如何保证数据不丢失
一般我们在用到这种消息中件的时候,肯定会考虑要怎样才能保证数据不丢失,在面试中也会问到相关的问题.但凡遇到这种问题,是指3个方面的数据不丢失,即:producer consumer 端数据不丢失 b ...
- 【C语言】 strlen()入参空指针导致段错误
背景: 在工作中调试sqlite3相关代码的时候,调用printf()打印sqlite3_exec()的执行日志:因为sqlite3_exec()保存日志的参数传入时为NULL,且没有执行错误,所以再 ...
- C++ STL学习总结
1.vector //最好给它一个初始化大小 #include <iostream> #include <vector> using namespace std; int ma ...
- 【读书笔记】胡说IC
- SSM整合学习 四
事务管理 一:初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个 ...
- zbar android sdk源码编译
zbar,解析条码和二维码的又一利器,zbar代码是用c语言编写的,如果想在Android下使用zbar类库,就需要使用NDK将zbar编译成.so加载使用,zbar编译好的Android SDK可以 ...
- python_dict json读写文件
命令汇总: json.dumps(obj) 将python数据转化为json Indent实现缩进,ensure_ascii 是否用ascii解析 json.loads(s) 将json数据转换为py ...
- 关于使用KubeSphere中的docker配置Harbor仓库http访问docker login登陆报错的解决办法
# 先进入harbor目录中,停止harbor docker-compose stop # 然后修改docker相关文件 # 第一种方式:修改/etc/docker/daemon.json { &qu ...
- C# 读取Oracle数据库视图数据异常问题处理
会出现类似现在这种提示的错误 System.Data.OracleClient 需要 Oracle 客户端软件 version 8.1.7 或更高版本 情况1.开发过程中遇到这种问题解决 由于.net ...