关闭页面特效

flask使用geventwebsocket完成小型聊天系统

 


1|0geventwebsocket使用方法


websocket状态

1:连接打开 2:客户端主动关闭连接 3:连接关闭(由服务器发起) 0:连接中...

socket的异步回调

var ws = new WebSocket("ws://127.0.0.1:9527/ws"); // onopen连接成功时,执行 ws.onopen=function () { ws.send('110') } // #onmessage接收到消息时执行 ws.onmessage=function (evenMessage) { console.log("接收成功") console.log(evenMessage.data) }

geventwebsocket完成群聊

模块导入

from geventwebsocket.handler import WebSocketHandler #ws协议请求处理 from geventwebsocket.server import WSGIServer #替换Flask 原有的WSGI from geventwebsocket.websocket import WebSocket #语法提示 from flask import Flask, request #Flask,request 模块

Flask项目的改写(创建一个websocket服务器)

app=Flask(__name__) if __name__ == '__main__': http_src=WSGIServer(('0.0.0.0',9527),app,handler_class=WebSocketHandler) http_src.serve_forever() #开始监听 WSGIServer((ip地址,端口号),flask实例化的app,handler_class=WebSocketHandler) handler_class 指定连接方式,默认为WSGIHandler

在Flask视图函数拿到客户端发送的内容

@app.route("/") def index(): sock=request.environ.get('wsgi.websocket') #type:WebSocket # 拿到客户端的socket对象 while 1: #循环一直接收客户端连接,如无循环,接收一次连接就会关闭 msg=sock.receive() #拿到客户端发送的内容 sock.send(msg) #将客户端发送的东西再返回给客户端 print(msg)

在html文件通过script完成信息的发送

<script type="application/javascript"> var ws = new WebSocket("ws://127.0.0.1:9527/"); // 使用回调函数,在连接成功时,执行代码 ws.onopen=function () { ws.send("hello 怪怪") }; //使用回调函数,在客户端接收到消息时执行代码 ws.onmessage=function (MassageEven) { console.log("我接收到了"); console.log(MassageEven.data) //打印接收到的信息 } </script>

逻辑代码

服务端:使用一个列表存储所有的已经连接的客户端,通过循环列表,向所有人发送信息 客户端html:通过点击事件,将输入用户名的内容和输入的框的内容拼接好后,发送给后端,后端返回后通过jq显示在页面

html代码

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> 您的用户名: <input type="text" id="username"> 您想要发送的内容: <input type="text" id="send_text"> <input type="submit" id="tn"> <h1>性感太白在线luo聊</h1> <div id="kuang"> </div> </body> <script src="jquery.js"></script> <script type="application/javascript"> var ws = new WebSocket("ws://127.0.0.1:9527/"); //使用回调函数,在客户端接收到消息时执行代码 ws.onmessage=function (MassageEven) { // console.log("我接收到了"); // console.log(MassageEven.data); //打印接收到的信息 $('#kuang').append(MassageEven.data); //当收到服务端的信息时,将信息添加到客户端页面 }; $('#tn').click(function () { //当点击发送按钮后,将输入的内容发送 var name=$("#username").val(); var text=$("#send_text").val(); ws.send("<p>"+name+" : "+text+"</p>"); //拼接用户名和发送内容 $("#send_text").val("") //清空输入框 }) </script> </html>

服务端代码

from geventwebsocket.handler import WebSocketHandler from geventwebsocket.server import WSGIServer from geventwebsocket.websocket import WebSocket from flask import Flask, request app=Flask(__name__) li=[] #使用一个列表存储所有的已经连接的客户端 @app.route("/") def index(): sock = request.environ.get('wsgi.websocket') # type:WebSocket # 拿到客户端的socket对象 li.append(sock) print(li) while 1: try: msg = sock.receive() # 拿到客户端发送的内容 except: li.remove(sock) break for so in li: #通过循环,向所有人发送信息 # if so ==sock: # continue try: so.send(msg) print(msg) except: continue return "sss" if __name__ == '__main__': http_src=WSGIServer(('0.0.0.0',9527),app,handler_class=WebSocketHandler) http_src.serve_forever()

1|1geventwebsocket完成私聊


服务端:使用一个字典存储所有的已经连接的客户端,通过字典查询,向对方发送信息 客户端html:通过点击事件,将输入用户名的内容和输入的框的内容拼接好后,发送给后端,后端返回后通过jq显示在页面

html代码

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> 用户名: <input type="text" id="username"> <input type="submit" id="tn" value="登陆聊天室"> <br> <br><input type="text" id="sender"> 发送 <input type="text" id="text"> <input type="submit" id="send" value="发送"> <h1>与太白的那些不可说的悄悄话</h1> <div id="nr"> </div> </body> <script src="jquery.js"></script> <script> var ws =null; var username=null; $('#tn').click(function () { username=$('#username').val(); ws = new WebSocket("ws://127.0.0.1:9527/"+username); ws.onopen=function () { alert("欢迎"+username+"登陆聊天室") }; ws.onmessage=function (MassageEven) { console.log(MassageEven.data) $('#nr').append(MassageEven.data) } }); $('#send').click(function () { var sender =$('#sender').val(); var text =$('#text').val(); var send_msg={"username":username,"sender":sender,'text':text}; console.log(send_msg); ws.send(JSON.stringify(send_msg)) }) </script> </html>

服务端代码

from geventwebsocket.handler import WebSocketHandler from geventwebsocket.server import WSGIServer from geventwebsocket.websocket import WebSocket from flask import Flask, request import json app=Flask(__name__) sock_dic={} @app.route("/<username>") def index(username): sock=request.environ.get('wsgi.websocket') #type:WebSocket sock_dic[username]=sock while 1: msg=sock.receive() msg=json.loads(msg) uname=msg['username'] text=msg['text'] text="<p>"+uname+" : " +text+"</p>" sender=msg['sender'] try: sock_dic[sender].send(text) sock_dic[uname].send(text) except: sock_dic[uname].send("对方未上线或....") return "200 ok" if __name__ == '__main__': http_src=WSGIServer(('0.0.0.0',9527),app,handler_class=WebSocketHandler) http_src.serve_forever()

__EOF__

作  者LuYi
出  处https://www.cnblogs.com/luyi84895838/p/11638523.html
关于博主:编程路上的小学生,热爱技术,喜欢专研。评论和私信会在第一时间回复。或者直接私信我。
版权声明:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!

posted @   路一  阅读(684)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
1
0
关注
跳至底部
点击右上角即可分享
微信分享提示