zoukankan      html  css  js  c++  java
  • 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>

      展示结果:

               

  • 相关阅读:
    eclipse中文乱码问题解决方案
    修改Tomcat的JDK目录
    Tomcat 5.5 修改服务器的侦听端口
    HTML DOM教程 27HTML DOM Button 对象
    HTML DOM教程 24HTML DOM Frameset 对象
    Navicat for MySQL v8.0.27 的注册码
    HTML DOM教程 25HTML DOM IFrame 对象
    Tomcat 5.5 的下载和安装
    android manifest相关属性
    ubuntu10.04 下 eclipse 小结
  • 原文地址:https://www.cnblogs.com/attila/p/10713901.html
Copyright © 2011-2022 走看看