【问题标题】:Why is my WebSocket automatically closing using Flask?为什么我的 WebSocket 使用 Flask 会自动关闭?
【发布时间】:2017-07-20 17:33:41
【问题描述】:

我已经使用烧瓶设置了一个非常基本的 websocket 服务器。

websocket.py

from flask import Flask
from flask_uwsgi_websocket import GeventWebSocket
app = Flask(__name__)
ws = GeventWebSocket(app)
@app.route('/')
def index():
    return render_template('index.html')
@ws.route('/foobar')
def echo(wscon):
    msg = wscon.receive()
    if msg is not None:
        wscon.send(msg)
if __name__ == '__main__':
    app.run(gevent=1000, host='0.0.0.0', port=9090)

index.html

<html>
    <head>
        <script language="Javascript">
            var s = new WebSocket("ws://192.168.3.49:9090/foobar");
            s.onopen = function() {
                alert("connected !!!");
                s.send("js send to server");
            };
            s.onmessage = function(e) {
                alert("recv message")
                var bb = document.getElementById('blackboard')
                var html = bb.innerHTML;
                bb.innerHTML = html + '<br/>' + e.data;
            };

            s.onerror = function(e) {
                alert('error');
                alert(e);
            }

            s.onclose = function(e) {
                alert("connection closed");
            }

            function invia() {
                var value = document.getElementById('testo').value;
                alert(value);
                s.send(value);
            }
        </script>
    </head>
    <body>
        <h1>WebSocket</h1>
        <input type="text" id="testo"/>
        <input type="button" value="invia" onClick="invia();"/>
        <div id="blackboard" style="width:640px;height:480px;background-color:black;color:white;border: solid 2px red;overflow:auto">
        </div>
    </body>

当我访问http://ip:9090时,我得到了打击信息:

已连接!!!

接收消息

连接关闭

为什么 websocket 会自动关闭?而且偶尔会出错

[uwsgi-http 密钥:192.168.3.49:9090 client_addr:192.168.3.1 client_port: 9177] hr_instance_read(): 连接被对等方重置 [插件/http/http.c 第 646 行]

【问题讨论】:

    标签: javascript python flask websocket


    【解决方案1】:

    似乎您正在尝试使用 echo gevent 服务器。 Example code

    您需要通过循环保持连接运行。修改如下:

    @ws.route('/foobar')
    def echo(ws):
        while True:
            msg = ws.receive()
            print(msg)
            if msg is not None:
                ws.send(msg)
            else:
                return
    

    【讨论】:

      猜你喜欢
      • 2013-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多