美文网首页
基于WebSocket开发简易群聊系统

基于WebSocket开发简易群聊系统

作者: 乔治大叔 | 来源:发表于2020-07-09 18:10 被阅读0次

    一、什么是WebSocket?

    WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
    WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输
    在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。
    具体原理可以看我之前文章传送门(使用WebSocket进行全双工通信)

    二、代码实现

    整体是基于flask框架之上开发的,gevent包中WSGIServer代替flask的werkzeug,geventwebsocket.handler 导入WebSocketHandler,这两个是重点。

    http_serv = WSGIServer(('0.0.0.0', 5000), app, handler_class=WebSocketHandler)
        http_serv.serve_forever()
    

    后台的全部代码

    from flask import Flask, request, render_template
    from geventwebsocket.websocket import WebSocket
    from gevent.pywsgi import WSGIServer
    from geventwebsocket.handler import WebSocketHandler
    
    app = Flask(__name__)
    app.config['debug'] = True
    
    user_socket_list = []
    
    @app.route('/')
    def index():
        return render_template('index.html')
    
    @app.route('/ws')
    def ws():
        user_socket = request.environ.get("wsgi.websocket") #type:WebSocket
        if user_socket:
            user_socket_list.append(user_socket)
            print(len(user_socket_list), user_socket_list)
        while True:
            msg = user_socket.receive()
            for usersocket in user_socket_list:
                try:
                    if user_socket != usersocket:
                        usersocket.send(msg)
                except:
                    continue
    
    
    
    if __name__ == '__main__':
        # app.run()
        http_serv = WSGIServer(('0.0.0.0', 5000), app, handler_class=WebSocketHandler)
        http_serv.serve_forever()
    

    前端代码比较简单,

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h1>WebSocket测试</h1>
    <p>{{ messages }}</p>
    <input type="text" id="send_text">
    <button id="send" onclick="send_msg()">发送</button>
    <div style="border: 2px solid; width: 500px; height: 800px" id="text_div">
    </div>
    </body>
    <script type="text/javascript">
        var ws = new WebSocket("ws://127.0.0.1:5000/ws");
        ws.onmessage = function (data) {
            var text_div = document.getElementById("text_div");
            var add_msg = "<p>" + data.data + "</p>";
            text_div.innerHTML += add_msg;
        };
        function send_msg() {
            var msg = document.getElementById("send_text").value;
            var text_div = document.getElementById("text_div");
            var add_msg = "<p>" + msg + "</p>";
            text_div.innerHTML += add_msg;
            ws.send(msg)
        }
    </script>
    </html>
    

    相关文章

      网友评论

          本文标题:基于WebSocket开发简易群聊系统

          本文链接:https://www.haomeiwen.com/subject/hkiscktx.html