gevent-websocket初識


初試

from flask import Flask, request
from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer

app = Flask(__name__)
@app.route('/')
def index():
user_socket = request.environ.get("wsgi.websocket") # type:WebSocket
try:
while True:
msg = user_socket.receive()
if msg == "quit":
return ''
print(msg)
user_socket.send(json.dumps({"msg": msg}))
except WebSocketError as e:
print(e)
return 'Finished'
if __name__ == '__main__': 
  http_server = WSGIServer(('0.0.0.0',5010), app, handler_class=WebSocketHandler) 
  http_server.serve_forever()

html部分

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="x-ua-compatible" content="IE=edge">
    <title>Title</title>
</head>
<body>
    <script type="text/javascript">
        let ws = new WebSocket("ws://127.0.0.1:5010/");
        ws.onmessage = function (data) {
            let msg = JSON.parse(data.data);
            console.log(msg)
        }
    </script>
</body>
</html>

結果

 

websocket群聊

from flask import Flask, request, render_template
from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer
from geventwebsocket.exceptions import WebSocketErrorimport json

app = Flask(__name__)

user_socket_list = []

@app.route('/')
def index():
    return render_template('ws.html')


@app.route('/chat')
def chat():
    user_socket = request.environ.get("wsgi.websocket")  # type:WebSocket
    user_socket_list.append(user_socket)
    print(len(user_socket_list), user_socket_list)
    try:
        while True:
            msg = user_socket.receive()
            for socket in user_socket_list:
                if socket != user_socket_list:
                    socket.send(json.dumps({"msg": msg})) # " 服務器信息: " +
    except WebSocketError as e:
        print(e)
        user_socket_list.remove(user_socket)
        return ''


if __name__ == '__main__':
    http_server = WSGIServer(('192.168.56.1', 5000), app, handler_class=WebSocketHandler)
    http_server.serve_forever()

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="x-ua-compatible" content="IE=edge">
    <title>Title</title>
</head>
<body>
<div class="container">
    <div><p>發送消息:<input type="text" id="msg"><button onclick="send_msg()">發送</button></p></div>
    <div id="chat" style="width: 500px; height: 500px"></div>
</div>
    <script type="text/javascript">
        let ws = new WebSocket("ws://192.168.56.1:5000/chat");
        ws.onmessage = function (data) {
            let msg = JSON.parse(data.data);
            console.log(msg);
            let ptage = document.createElement("p");
            ptage.innerText = msg.msg;
            document.getElementById("chat").appendChild(ptage);
        };
        function send_msg() {
            let msg = document.getElementById("msg").value;
            console.log(msg);
            ws.send(msg);
        }
    </script>
</body>
</html>

 

 

 websocket單聊

 

from flask import Flask, request, render_template
from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer
from geventwebsocket.exceptions import WebSocketError
import json

app = Flask(__name__)
user_socket_dic = {}


@app.route('/')
def index():
    return render_template('pk.html')


@app.route('/pk/<username>')
def pk(username):
    user_socket = request.environ.get("wsgi.websocket")  # type:WebSocket
    user_socket_dic[username] = user_socket
    print(len(user_socket_dic), user_socket_dic)
    try:
        while True:
            msg = json.loads(user_socket.receive())
            to_user = msg.get('to_user')
            print(to_user)
            if to_user:
                to_msg = {"from_user":username, "msg": msg.get('msg')}
                user_socket_dic.get(to_user).send(json.dumps(to_msg))
                print(to_msg)
            else:
                user_socket.send("10001")

    except WebSocketError as e:
        user_socket_list.remove(user_socket)
        return ''

if __name__ == '__main__':
http_server = WSGIServer(('192.168.56.1', 5000), app, handler_class=WebSocketHandler)
http_server.serve_forever()
 

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="x-ua-compatible" content="IE=edge">
    <title>Title</title>
</head>
<body>
<div class="container">
    <div>
        <p>登陸我的socket:<input type="text" id="username"><button onclick="open_ws()">連接</button></p>
        <p>目標用戶:<input type="text" id="to_user"></p>
        <p>發送消息:<input type="text" id="msg"><button onclick="send_msg()">發送</button></p>
    </div>
    <div id="chat" style="width: 500px; height: 500px"></div>
</div>

<script type="text/javascript">
    let ws = null;
    function open_ws() {
        let username = document.getElementById("username").value;
        ws = new WebSocket("ws://192.168.56.1:5000/pk/" + username);
        ws.onmessage = function (data) {
            let content = JSON.parse(data.data);
            let ptage = document.createElement("p");

            ptage.innerText = content.from_user + "," + content.msg;
            document.getElementById("chat").appendChild(ptage);
        };
    }

    function send_msg() {
        let msg = document.getElementById("msg").value;
        let to_user = document.getElementById("to_user").value;
        let data = {to_user:to_user, msg:msg};
        ws.send(JSON.stringify(data));
    }
</script>

</body>
</html>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM