웹 소켓 제품 (플라스크 기준)

간단한 웹 소켓

from flask import Flask,request
from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer
from geventwebsocket.websocket import WebSocket #语法提示用的

app = Flask(__name__)

#wsgi.websocket socke-> socket链接 可以用来收发消息

@app.route("/ws")
def ws():
    user_socket = request.environ.get("wsgi.websocket") #type:WebSocket
    msg = user_socket.receive()
    print(msg)
    return ":123"

if __name__ == '__main__':
    http_serv = WSGIServer(("0.0.0.0",5000),app,handler_class=WebSocketHandler)
    http_serv.serve_forever()

그럼 당신은 간단한 통화를 할 수 있습니다
그림 삽입 설명 여기
그림 삽입 설명 여기

그렇다면 우리는 그룹 채팅 웹 소켓을 통해 그것을 달성합니까?

우리는 심지어 사람들의 링크까지 모든 소켓을 기록해야하고,하지 자신의 소켓 링크 메시지를 보낼 것 목록을 순환 한 후,이 여기, 사고의 구체적인 방법입니다 코드의 흐름입니다 목록에 추가.

"""
@author: Yxinmiracle
@project: f
@file: s1.py
@time: 2020/3/9 12:30
@desc:

 /*code is far away from bug with the animal protecting

  """

from flask import Flask,request,render_template
from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer
from geventwebsocket.websocket import WebSocket #语法提示用的
import json

app = Flask(__name__)

#wsgi.websocket socke-> socket链接 可以用来收发消息
#拿到socket链接就可以进行通讯了

user_socket_list = []

@app.route("/ws")
def ws():
    user_socket = request.environ.get("wsgi.websocket") #type:WebSocket
    user_socket_list.append(user_socket)
    print(len(user_socket_list))
    while 1:
        try:
            msg = user_socket.receive()
            for socket in user_socket_list:
                if socket != user_socket:
                    #print(msg)
                    socket.send(msg)
        except:
            user_socket_list.remove(user_socket)

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

if __name__ == '__main__':
    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>
<div id="chat" style="width: 500px;height: 500px;">
    <p>发送消息:<input type="text" id="msg"><button onclick="send_msg()">发送</button></p>
</div>
</body>
<script type="text/javascript">
    var ws = new WebSocket("ws://192.168.....:5000/ws");

    ws.onmessage = function (data) {
       // var msg = JSON.parse(data.data);
        console.log(data.data);
        var ptag = document.createElement("p");
        ptag.innerText = data.data;
        document.getElementById("chat").appendChild(ptag);
    };
    
    function send_msg() {
        var msg = document.getElementById("msg").value;
        ws.send(msg);
        document.getElementById("msg").value = '';
    }
</script>
</html>

그렇다면 우리는 하나의 채팅 웹 소켓 그것에 의해 실현되어야 하는가?

그는에, 그의 wsgi.websocket을 이름 레코드를 등록 할 때 우리는이 링크를 통해 사용자를마다했다 :

user_socket_dict = {"nickname":"wsgi.websocket"}

사전 기록하고 디맨드하여 전송을 구현하는이 방법.

여기에 달성하는 코드는 다음과 같습니다

"""
@author: Yxinmiracle
@project: f
@file: s1.py
@time: 2020/3/9 12:30
@desc:

 /*code is far away from bug with the animal protecting

  """

from flask import Flask, request, render_template
from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer
from geventwebsocket.websocket import WebSocket  # 语法提示用的
import json

app = Flask(__name__)

# wsgi.websocket socke-> socket链接 可以用来收发消息
# 拿到socket链接就可以进行通讯了

user_socket_dict = {}


@app.route("/ws/<username>")
def ws(username):
    user_socket = request.environ.get("wsgi.websocket")  # type:WebSocket
    user_socket_dict[username] = user_socket
    print(len(user_socket_dict))
    while 1:
        try:
            msg = user_socket.receive()
            msg = json.loads(msg)
            to_user = msg.get("to_user")
            content = msg.get("msg")
            usocket = user_socket_dict.get(to_user)
            recv_msg = {"from_user": username, "msg": content}
            usocket.send(json.dumps(recv_msg))
        except:
            pass


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


if __name__ == '__main__':
    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>
<p>你的名字是:<input type="text" id="username"></p>
<p>请点击<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 id="chat" style="width: 500px;height: 500px;">
</div>
</body>
<script type="text/javascript">
    var ws = null;

    function open_ws() {
        var username = document.getElementById("username").value;
        ws = new WebSocket("ws://192.168.0...../ws/" + username);
        ws.onmessage = function (data) {
            console.log(data.data);
            var msg = JSON.parse(data.data);
            var ptag = document.createElement("p");
            ptag.innerText = "来自"+msg.from_user+  "的消息" + ":" + msg.msg;
            document.getElementById("chat").appendChild(ptag);
        };
    }

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

이를 그것에 노트의 현재 버전의 웹 소켓 기반

게시 12 개 원래 기사 · 원 찬양 7 · 조회수 167

추천

출처blog.csdn.net/caiyongxin_001/article/details/104754262