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


    geventwebsocket使用方法

    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()
    

    geventwebsocket完成私聊

    服务端:使用一个字典存储所有的已经连接的客户端,通过字典查询,向对方发送信息
    客户端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()
    
  • 相关阅读:
    VBA基础四:数据库链接(WPS2019)
    VBA基础三:循环(DO...LOOP,)
    随机多人红包
    概率抽奖
    七步轻松实现大数据库表的数据转储
    SQL Server中的行列倒置技巧
    把对应表的字段跨表赋值
    sql内日期格式化输出
    事务的用法
    女孩,你为什么不沉住气奋斗
  • 原文地址:https://www.cnblogs.com/luyi84895838/p/11638523.html
Copyright © 2020-2023  润新知