zoukankan      html  css  js  c++  java
  • web_socket

    web_socket+Flask实现网页版聊天

    服务器端:

    import json
    
    from flask import Flask,request,render_template
    
    from geventwebsocket.handler import WebSocketHandler
    from gevent.pywsgi import WSGIServer
    from geventwebsocket.websocket import WebSocket
    
    
    app = Flask(__name__)
    
    user_socket_dict = {}
    # user_socket_dict = []
    
    @app.route('/conn_ws/<user>')
    def ws_app(user):
        # print(request.environ) 
      ''' ws:// {'GATEWAY_INTERFACE': 'CGI/1.1', 'SERVER_SOFTWARE': 'gevent/1.4 Python/3.7', 'SCRIPT_NAME': '', 'wsgi.version': (1, 0), 'wsgi.multithread': False, 'wsgi.multiprocess': False, 'wsgi.run_once': False, 'wsgi.url_scheme': 'http', 'wsgi.errors': <_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'>, 'SERVER_NAME': 'changtao', 'SERVER_PORT': '9527', 'REQUEST_METHOD': 'GET', 'PATH_INFO': '/conn_ws', 'QUERY_STRING': '', 'SERVER_PROTOCOL': 'HTTP/1.1', 'REMOTE_ADDR': '192.168.11.181', 'REMOTE_PORT': '58068', 'HTTP_HOST': '192.168.11.181:9527', 'HTTP_CONNECTION': 'Upgrade', 'HTTP_PRAGMA': 'no-cache', 'HTTP_CACHE_CONTROL': 'no-cache', 'HTTP_USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36', 'HTTP_UPGRADE': 'websocket', 'HTTP_ORIGIN': 'http://localhost:63342', 'HTTP_SEC_WEBSOCKET_VERSION': '13', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate', 'HTTP_ACCEPT_LANGUAGE': 'zh-CN,zh;q=0.9,en;q=0.8', 'HTTP_SEC_WEBSOCKET_KEY': 'p1otMQwA0qQcMd3FEJ5Kaw==', 'HTTP_SEC_WEBSOCKET_EXTENSIONS': 'permessage-deflate; client_max_window_bits', 'wsgi.input': <gevent.pywsgi.Input object at 0x0000023F6943A588>, 'wsgi.input_terminated': True, 'wsgi.websocket_version': '13', 'wsgi.websocket': <geventwebsocket.websocket.WebSocket object at 0x0000023F69377AD8>, 'werkzeug.request': <Request 'http://192.168.11.181:9527/conn_ws' [GET]>} ''' user_socket = request.environ.get("wsgi.websocket") # type:WebSocket # user_socket_dict.append(user_socket) user_socket_dict[user] = user_socket print(len(user_socket_dict), user_socket_dict) while True: msg = user_socket.receive() 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) # for i in user_socket_dict: # i.send(msg) @app.route("/") def index(): return render_template("my_ws.html") if __name__ == '__main__': http_serv = WSGIServer(("0.0.0.0", 9527), app, handler_class=WebSocketHandler) # 如果不是http请求,就交给WebSocketHandler http_serv.serve_forever()

      

    前端:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <p><input type="text" id="nick"><button onclick="login()">登陆聊天室</button></p>
    <p>发送给谁:<input type="text" id="to_user"></p>
    <p>
        消息:<input type="text" id="send_msg">
        <button id="send_btn" onclick="send()">发送消息</button>
    </p>
    <div id="show_msg">
    
    </div>
    </body>
    <script type="text/javascript">
        var ws = null;
        {#var ws = new WebSocket("ws://192.168.11.181:9527/conn_ws");#}
        {#ws.onmessage=function (messageEvent) {#}
        {#    console.log(messageEvent.data);};#}
        {#var ws = new WebSocket("ws://192.168.11.181:9527/conn_ws");#}
        function login() {
            var nick = document.getElementById("nick").value;
            ws = new WebSocket("ws://192.168.11.181:9527/conn_ws/"+nick);
            ws.onmessage = function (messageEvent) {
                console.log(messageEvent.data);
                var ptag = document.createElement("p");
    
                var message = JSON.parse(messageEvent.data);
    
                ptag.innerText =message.from_user + " : " + message.message ;
                {#ptag.innerText =message.message;#}
                document.getElementById("show_msg").appendChild(ptag);
            };}
        function send() {
            var message = document.getElementById("send_msg").value;
            var send_str = {
                from_user:document.getElementById("nick").value,
                to_user:document.getElementById("to_user").value,
                message:message
            };
            var json_send_str = JSON.stringify(send_str);
            ws.send(json_send_str);
            var ptag = document.createElement("p");
            ptag.innerText =document.getElementById("nick").value + " : " + message;
            document.getElementById("show_msg").appendChild(ptag);
        }
    
    </script>
    </html>
    

      

  • 相关阅读:
    python 垃圾回收装置
    文件夹同步/备份软件推荐 (SyncToy/FreeFileSync/Compare Advance/GoodSync/Allway Sync/Compare Advance)
    WCF的ABC
    NPOI导出多表头Execl(通过html表格遍历表头)
    分布式应用处理方式
    再探ASP.NET 5(转载)
    应聘.net开发工程师常见的面试题(五)
    应聘.net开发工程师常见的面试题(四)
    应聘.net开发工程师常见的面试题(二)(转载)
    应聘.net开发工程师常见的面试题(一)(转载)
  • 原文地址:https://www.cnblogs.com/changtao/p/10580926.html
Copyright © 2011-2022 走看看