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; /** ...
随机推荐
- win10上安装ubunt18双系统过程中出现mmx64.efi not found问题
安装Ubuntu18过程中,从u盘启动ubunt安装,出现mmx64.efi not found问题 如下图: 制作好ubunt启动盘之后在EFI/BOOT下会看到两个文件,将其中grubx64.ef ...
- Ubuntu14 关机重启、版本、网络、防火墙
关机.重启: 立即关机:halt.poweroff.shutdown -h now 延迟关机:shutdown -h 10 十分钟后关机 立即重启:reboot.shutdown -r now 延迟 ...
- Nginx类
nginx常见错误页面有哪些?对于其解决方法是什么? 404 bad request 请求失败,请求所希望得到的资源未被在服务器上发现.没有信息能够告诉用户这个状况到底是暂时的还是永久的.假如服务器知 ...
- Docker介绍及安装(一)
一.Docker简介 1.1 docker介绍 Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的cgroup,namespace,以及 AUFS 类的 ...
- Minimum Barrier Salient Object Detection at 80 FPS 论文阅读笔记
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...
- 201871010105-曹玉中《面向对象程序设计(java)》第十五周学习总结
201871010105-曹玉中<面向对象程序设计(java)>第十五周学习总结 项目 内容 这个作业属于哪个过程 https://www.cnblogs.com/nwnu-daizh/ ...
- 201871010108-高文利《面向对象程序设计(java)》第八周学习总结
项目 内容 这个作业属于哪个课程 <任课教师博客主页链接> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地址> ht ...
- onchange onpropertychange 和 oninput 事件的区别
onchange 事件在内容改变(两次内容有可能还是相等的)且失去焦点时触发. onpropertychange 事件却是实时触发,即每增加或删除一个字符就会触发,通过 js 改变也会触发该事件,但是 ...
- arduino控制SIM900A模块
https://item.taobao.com/item.htm?spm=a1z09.2.0.0.5fc02e8dncAF2p&id=604968021102&_u=i1qf7bf5f ...
- <Array> 41 134
41. First Missing Positive 思路是把1放在数组第一个位置 nums[0],2放在第二个位置 nums[1],即需要把 nums[i] 放在 nums[nums[i] - 1] ...