WebSocket is already in CLOSING or CLOSED state解决方案

使用flask + websocket来进行前后端交互的项目

前端发送send的时候,websocket一连接就中断,测试了心跳设置相应时间等各种方法,都没用,最后发现原来是flask的版本太高导致和gevent不兼容

无论前端怎么发送信息,flask的服务器端什么都没有:

服务器端代码:

from geventwebsocket.handler import WebSocketHandler

from gevent.pywsgi import WSGIServer

from geventwebsocket.websocket import WebSocket # 引这个模块为了注释中显示提示用

from flask import Flask, render_template,request
app = Flask(__name__)

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

@app.route('/my_ws')
def my_ws():
    print(request.environ)
    user_socket = request.environ.get('wsgi.websocket') # type:WebSocket
    while 1:
        msg = user_socket.receive()
        print(msg)
        user_socket.send(msg)

if __name__ == '__main__':
    # app.run()
    http_server = WSGIServer(('0.0.0.0',9527),app,handler_class=WebSocketHandler)
    http_server.serve_forever()

前端客户端代码:

<body>

我即将是Websocket

</body>

<script>

    var ws = new WebSocket("ws://127.0.0.1:9527/my_ws")

    ws.onmessage = function (MessageEvent) {

        console.log(MessageEvent.data);

    }

</script>

前端调试的时候老是报错:

 最后将flask一系列的包都降级后,错误消失:

解决流程: 

一开始的flask 的版本是2点多

Flask 降级

pip install Flask==1.1.2

ImportError: cannot import name 'escape' from 'jinja2

pip uninstall Jinja2

from flask) (1.1.0) Requirement already satisfied: Jinja2>=2.10.1

Pip install Jinja2==2.10.1

解决ImportError: cannot import name ‘soft_unicode‘ from ‘markupsafe‘

必须安装这个:pip install markupsafe==2.0.1

werkzeug 2.2.2 requires MarkupSafe>=2.1.1, but you have markupsafe 2.0.1 which is incompatible. 或者 ImportError: cannot import name 'json' from 'itsdangerous' (/Users/hyy/Desktop/项目/venv_37/lib/python3.7/site-packages/itsdangerous/__init__.py)

Pip install itsdangerous==2.0.1

ImportError: cannot import name 'BaseResponse' from 'werkzeug.wrappers' (/Users/hyy/Desktop/项目/venv_37/lib/python3.7/site-packages/werkzeug/wrappers/__init__.py)

Pip show werkzeug

Name: Werkzeug

Version: 2.2.2

继续降级:pip install werkzeug==1.0.1

Uncaught (in promise) Error: A listener indicated an asynchronous response by returning true, but the message channel closed before a response was received

未捕获(在promise中)错误:侦听器返回true表示异步响应,但消息通道在收到响应之前关闭

关闭浏览器的所有插件,这大概率不是项目代码的问题,而是浏览器扩展的问题。曾经出现的异常就是因为我浏览器中安装的Tampermonkey扩展,把该扩展禁用了就可以了,就不会再报这个异常了。

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
websocket是一种用于实时通信的协议,它允许浏览器和服务器之间进行双向通信。当出现“websocket is already in closing or closed state”错误时,意味着websocket已经处于关闭状态或正在关闭过程中。 在正常的websocket通信中,两端可以随时通过发送关闭帧来关闭连接。当其中一端发送关闭帧后,另一端也会收到关闭帧,并开始关闭过程。在关闭过程中,双方将交换关闭帧,并逐渐关闭连接。一旦连接完全关闭,websocket处于关闭状态。 但是,如果在关闭过程中尝试发送数据或者出现其他意外情况,websocket可能会进入异常状态,并抛出“websocket is already in closing or closed state”错误。 可能导致此错误的原因有: 1. 在关闭过程中尝试发送数据。一旦关闭帧被发送,websocket连接将处于关闭过程中,此时不应再进行数据发送。 2. 在连接已经关闭的情况下尝试发送数据。一旦连接完全关闭,websocket将无法再发送数据。 3. 实现代码中的错误。可能有一些代码逻辑错误导致了此错误的出现。 为了解决此问题,我们需要进行以下检查和修复措施: 1. 确保在关闭过程中不再尝试发送数据。可以通过代码控制发送数据的时机,避免在连接关闭的状态下发送数据。 2. 检查代码逻辑,确保没有意外地关闭websocket连接,或者在连接已经关闭后继续进行相关操作。 3. 观察错误发生的环境和时间,查找相关代码并进行排查和修复。 总之,当出现“websocket is already in closing or closed state”错误时,我们应该检查代码中的发送数据时机和关闭连接的逻辑,并修复相关问题,以确保websocket通信的正常进行。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贝叶斯巴达

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值