• WebSocket群聊与单聊


    一 . WebSocket实现群聊

      py文件代码

    # py文件
    from flask import Flask, render_template, request
    from geventwebsocket.handler import WebSocketHandler
    from geventwebsocket.websocket import WebSocket
    from geventwebsocket.exceptions import WebSocketError
    from gevent.pywsgi import WSGIServer  
    
    app = Flask(__name__)
    
    user_socket_list = []
    
    @app.route('/index')
    def index():
        return render_template('index.html')
    
    @app.route('/my/ws')
    def my_ws():
        # 当前端声明WebSocket的时候才有wsgi.websocket
        user_socket = request.environ.get('wsgi.websocket')  # type:WebSocket   # 为了让下面user_socket点的时候有提示
        user_socket_list.append(user_socket)
        print(len(user_socket_list), user_socket_list)
    
        while 1:
            try:   # 下面用图解释为什么要try
                msg = user_socket.receive()  # 阻塞等待发送信息
            except WebSocketError:
                user_socket_list.remove(user_socket)
                return 'GoodBye'
            for user in user_socket_list:
                if user == user_socket:
                    continue
                try:
                    user.send(msg)
                except:
                    continue
    
    if __name__ == '__main__':
        # 用下面这种方法启动是为了识别并支持websocket
        http_server = WSGIServer(('0.0.0.0', 9527), app, handler_class=WebSocketHandler)
        http_server.serve_forever()

      html代码

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>index</title>
    </head>
    <body>
    <p><input type="text" id="message">
        <button onclick="send_message()">发送</button>
    </p>
    <div id="chat_list">
    
    </div>
    </body>
    <script type="application/javascript">
        var ws = new WebSocket('ws://127.0.0.1:9527/my/ws');
        ws.onmessage = function (MessageEvent) {   //当接收到消息的时候执行MessageEvent函数
            var p = document.createElement('p');   // 创建一个p标签
            p.innerText = MessageEvent.data;    // 给p标签里面添加数据
            document.getElementById('chat_list').appendChild(p);  // 把p标签添加到div标签里面
        };
    
        function send_message() {
            var message = document.getElementById('message').value;
            ws.send(message)
        }
    </script>
    </html>

      不try的时候

         

      

      try之后  

      

    二 . 单聊

      py文件

    import json
    from flask import Flask, render_template, request
    from geventwebsocket.handler import WebSocketHandler
    from geventwebsocket.websocket import WebSocket
    from geventwebsocket.exceptions import WebSocketError
    from gevent.pywsgi import WSGIServer
    
    app = Flask(__name__)
    user_socket_dict = {}
    
    @app.route('/home')
    def index():
        return render_template('home.html')
    
    @app.route('/my/ws/<username>')
    def my_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()  # 阻塞等待消息
                # print(msg, type(msg))
                msg_dict = json.loads(msg)
                to_user = msg_dict.get('to_user')
                to_user_socket = user_socket_dict.get(to_user)
                to_user_socket.send(msg)
            except WebSocketError:
                user_socket_dict.pop(username)
                return 'GoodBye'
    
    if __name__ == '__main__':
        http_server = WSGIServer(('0.0.0.0', 9527), app, handler_class=WebSocketHandler)
        http_server.serve_forever()

      html文件

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
    <p>发送者<input type="text" id="username">
        <button onclick="open_chat()">开始聊天</button>  <!--onclick就是点击执行里面函数-->
    </p>
    <p>接受者 <input type="text" id="to_user"></p>
    <p>
        消息 <input type="text" id="message">
        <button onclick="SendMessage()">发送</button>      
    </p>
    <div id="chat_list">
    
    </div>
    </body>
    <script type="application/javascript">
        var ws = null;   //声明一个全局变量
        function open_chat() {
            var username = document.getElementById('username').value;
            ws = new WebSocket('ws://127.0.0.1:9527/my/ws/' + username);
            ws.onopen = function () {   // onopen函数就是当你连接开始时执行
                alert('欢迎' + username + '来到午夜激情聊天室!')
            };
            ws.onmessage = function (MessageEvent) {
                var chat = JSON.parse(MessageEvent.data);
                var p = document.createElement('p');
                p.style.cssText = '270px;text-align: left';
                p.innerText = chat.from_user + '->' + chat.message;
                document.getElementById('chat_list').appendChild(p);
            };
            ws.onclose = function () {  // onclose函数就是如果断开连接了执行函数
                // 断开连接
                console.log('已经断开连接');
            };
        }
    
        function SendMessage() {
            var message = document.getElementById('message').value;
            var from_user = document.getElementById('username').value;
            var to_user = document.getElementById('to_user').value;
            var send_str = {
                from_user: from_user,
                to_user: to_user,
                message: message
            };
            ws.send(JSON.stringify(send_str));
            var p = document.createElement('p');
            p.style.cssText = '270px;text-align:right';
            p.innerText = send_str.message + '<-大帅比';
            document.getElementById('chat_list').appendChild(p);
        }
    </script>
    </html>

      展示结果:

               

  • 相关阅读:
    linux Chrome 安装
    jQuery.extend 函数详解
    Ubuntu Linux 下文件名乱码(无效的编码)的快速解决办法
    Django——model字段类型 2
    Django 中的用户认证
    Expression<Func<T, bool>>与Func<T, bool>的区别
    根据funID,personID获取最新规划包项目相关信息
    SET ANSI_NULLS ON 在T-SQL中是什么意思
    SQL Server 2008中如何为XML字段建立索引
    PowerDesigner 建模后如何导入到数据库
  • 原文地址:https://www.cnblogs.com/attila/p/10713901.html
Copyright © 2020-2023  润新知