Flask基于websocket的简单聊天室
1、安装gevent-websocket
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ gevent-websocket
2、chat.py文件内容如下:
from flask import Flask,request,render_template
import json
from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer
from geventwebsocket.websocket import WebSocket user_dict = {} chat_app = Flask(__name__)
@chat_app.route('/ws/<username>')
def ws_chat(username):
user_socket = request.environ.get('wsgi.websocket') # type:WebSocket
user_dict[username]=user_socket
while 1:
msg = user_socket.receive() # 等待接收客户端发来的数据
msg_dict = json.loads(msg)
msg_dict['from_user'] = username
to_user = msg_dict.get('to_user')
if to_user == "": # 如果用户名是空表示群发
for uname, uwebsocket in user_dict.items():
if uname == username: # 群发时不用给自己发
continue
uwebsocket.send(json.dumps(msg_dict))
continue
to_user_socket = user_dict.get(to_user)
if not to_user_socket: # 判断用户字典中是否存在用户的websocket连接
continue
try:
msg_dict['from_user'] = msg_dict['from_user'] + '@私聊我'
to_user_socket.send(json.dumps(msg_dict))
except:
user_dict.pop(to_user) @chat_app.route('/webchat')
def webchat():
return render_template('public_chat.html') if __name__ == '__main__':
server = WSGIServer(('0.0.0.0',9527),chat_app,handler_class=WebSocketHandler)
server.serve_forever()
3、web_chat.html文件部分内容如下:
<p>你的名字:<input type="text" id="username">
<button onclick="open_ws()">登陆聊天室</button>
</p>
<form onsubmit="return false;">
<h3>WebSocket 聊天室:</h3>
<textarea id="responseText" style="width: 500px; height: 300px;"></textarea>
<br>
给:<input type="text" id="to_user">消息内容:<input type="text" id="message">
<input type="button" value="发送消息" onclick="send_msg()">
<input type="button" onclick="javascript:document.getElementById('responseText').value=''"
value="清空聊天记录">
</form>
4、js代码如下:
<script type="application/javascript">
var ws = null;
function open_ws() {
var username = document.getElementById('username').value;
ws = new WebSocket("ws://192.168.16.239:9527/ws/" + username);
ws.onopen = function () {
alert("登陆成功");
}; ws.onmessage = function (eventMessage) {
// 显示消息记录
var chat = JSON.parse(eventMessage.data);
console.log(chat);
var chat_content = document.getElementById('responseText');
chat_content.value = chat_content.value + "\n" + chat.from_user + " : " + chat.chat;
};
} function send_msg() {
// 发送消息
var to_user = document.getElementById("to_user").value;
var msg = document.getElementById("message").value;
var send_str = {
to_user: to_user,
chat: msg
};
ws.send(JSON.stringify(send_str));
var chat_content = document.getElementById("responseText");
chat_content.value = chat_content.value + "\n" + "我: " + msg;
}
</script>
最终的效果图如下:

Flask基于websocket的简单聊天室的更多相关文章
- Netty 系列八(基于 WebSocket 的简单聊天室).
一.前言 之前写过一篇 Spring 集成 WebSocket 协议的文章 —— Spring消息之WebSocket ,所以对于 WebSocket 协议的介绍就不多说了,可以参考这篇文章.这里只做 ...
- workerman-chat(PHP开发的基于Websocket协议的聊天室框架)(thinkphp也是支持socket聊天的)
workerman-chat(PHP开发的基于Websocket协议的聊天室框架)(thinkphp也是支持socket聊天的) 一.总结 1.下面链接里面还有一个来聊的php聊天室源码可以学习 2. ...
- 分享基于 websocket 网页端聊天室
博客地址:https://ainyi.com/67 有一个月没有写博客了,也是因为年前需求多.回家过春节的原因,现在返回北京的第二天,想想,应该也要分享技术专题的博客了!! 主题 基于 websock ...
- .NET Core 基于Websocket的在线聊天室
什么是Websocket 我们在传统的客户端程序要实现实时双工通讯第一想到的技术就是socket通讯,但是在web体系是用不了socket通讯技术的,因为http被设计成无状态,每次跟服务器通讯完成后 ...
- C#基于Socket的简单聊天室实践
序:实现一个基于Socket的简易的聊天室,实现的思路如下: 程序的结构:多个客户端+一个服务端,客户端都是向服务端发送消息,然后服务端转发给所有的客户端,这样形成一个简单的聊天室功能. 实现的细节: ...
- 用swoole和websocket开发简单聊天室
首先,我想说下写代码的一些习惯,第一,任何可配置的参数或变量都要写到一个config文件中.第二,代码中一定要有日志记录和完善的报错并记录报错.言归正传,swoole应该是每个phper必须要了解的, ...
- 基于WebSocket的简易聊天室
用的是Flash + WebSocket 哦~ Flask 之 WebSocket 一.项目结构: 二.导入模块 pip3 install gevent-websocket 三.先来看一个一对一聊天的 ...
- 基于GUI的简单聊天室01
运用了Socket编程,gui,流的读入和写出,线程控制等 思路: 1.首先是在客户端中先建立好聊天的GUI 2.建立服务器端,设置好端口号(用SocketServer),其中需要两个boolean变 ...
- 基于GUI的简单聊天室03
上一版本,客户端关闭后会出现“socket close”异常问题,这个版本用捕捉异常来解决,实际上只是把异常输出的语句改为用户退出之类,并没真正解决 服务器类 package Chat03; /** ...
随机推荐
- apache配置项
环境:apache2.24 apache 官方文档:http://httpd.apache.org/docs/2.4/ 全部指令索引: http://httpd.apache.org/docs/ ...
- React 受控组件和非受控组件
需求用户名自动获取 onChange用户状态发生改变 就获取值 就是时时获取值 使用onChange 点击按钮 获取密码 只要绑定了点击事件 就可以获取值 通过 let usercont=event. ...
- 多线程(四)多线程同步_Critical Section临界区
临界区是指一个小代码段,在代码能够执行前,它必须独占对某些共享资源的访问权.和使用mutex一样,它们都是以原子操作方式来对共享资源进行访问. 临界区又叫关键代码段,与上一篇的mutex互斥体实现的功 ...
- Linux简单命令的使用
1.linux上怎么快速删除一个目录在linux中删除一个目录很简单,很多人还是习惯用rmdir,不过一旦目录非空,就陷入深深的苦恼之中,现在使用rm -rf命令即可解决.直接rm就可以了,不过要加两 ...
- 03-numpy-笔记-expand_dims
>>> x = np.array([[1,2,3],[4,5,6]]) >>> x.shape (2, 3) >>> np.expand_dims ...
- 创建maven父子项目(九)
一.父子-聚合项目 通过 maven 可以创建父子-聚合项目. 所谓的父子项目,即有一个父项目,有多个子项目.这些子项目,在业务逻辑上,都归纳在这个父项目下,并且一般来说,都会有重复的jar包共享.所 ...
- 5 Ways AI is Transforming the Finance Industry
https://marutitech.com/ways-ai-transforming-finance/ As global technology has evolved over the years ...
- Linux性能优化实战学习笔记:第五十讲
一.上节回顾 上一节,我以 ksoftirqd CPU 使用率高的问题为例,带你一起学习了内核线程 CPU 使用率高时的分析方法.先简单回顾一下. 当碰到内核线程的资源使用异常时,很多常用的进程级性能 ...
- 前端工程化 - 剖析npm的包管理机制
转自https://juejin.im/post/5df789066fb9a0161f30580c 现如今,前端开发的同学已经离不开 npm 这个包管理工具,其优秀的包版本管理机制承载了整个繁荣发展的 ...
- 实战django(二)--登录实现记住我
上节初步实现了登录和注册模块,这节我们进一步实现“记住我”功能. 大体功能分为以下模块: 1.在登录时如果勾选记住我,那么就将用户username存进cookie中,跳转到index页面: 2.此时, ...