0

0

解决 WebSocket 连接中的 ConnectionClosedOK 错误

心靈之曲

心靈之曲

发布时间:2025-08-07 18:18:01

|

197人浏览过

|

来源于php中文网

原创

解决 websocket 连接中的 connectionclosedok 错误

在 WebSocket 通信中,遇到 ConnectionClosedOK 错误通常意味着服务器在处理完一个请求后主动关闭了连接。本文将围绕这一问题,提供两种解决方案,并深入探讨如何在客户端和服务器端处理连接关闭事件,确保 WebSocket 通信的稳定性和可靠性。

客户端:循环建立新连接

问题的根源在于服务器在处理完客户端的第一个请求后关闭了连接。一种简单的解决方案是在客户端每次发送请求时都建立一个新的 WebSocket 连接。

以下是修改后的客户端代码示例:

import time
import json
import asyncio
import websockets
import nest_asyncio
nest_asyncio.apply()


async def get_data(websocket, key):
    order = {'key' : key}
    json_data = json.dumps(order)
    await websocket.send(json_data)
    res = await asyncio.wait_for(websocket.recv(), timeout=10)
    res = json.loads(res)
    return res


async def main():
    i = 0
    uri = "ws://localhost:8765"
    while i < 10:
        async with websockets.connect(uri, timeout=15, ping_timeout=None, ping_interval=None) as websocket:
            i = i + 1
            print(f'counter {i}')
            res = await get_data(websocket, 'key')
            print(f"res: {res}")
            time.sleep(3)  # slow down for tests

    print('main exit')


if __name__ == "__main__":
    asyncio.get_event_loop().run_until_complete(main())

在这个修改后的版本中,我们将 websockets.connect 放在一个 async with 语句块中,并且在 while 循环内。这意味着每次循环都会建立一个新的连接,并在请求完成后关闭。使用 async with 语句可以确保即使在发生异常的情况下,连接也能被正确关闭。

注意事项:

  • 频繁建立和关闭连接可能会增加服务器的负载,因此这种方法适用于请求频率不高的情况。
  • 如果需要保持长时间的连接,请考虑使用服务器端保持连接活跃的方案。

服务器端:保持连接活跃

另一种解决方案是修改服务器代码,使其在处理完一个请求后不关闭连接,而是保持连接活跃,等待客户端的下一个请求。这可以通过在服务器端的请求处理函数中使用 while 循环来实现。

以下是修改后的服务器代码示例:

PHP5学习对象教程
PHP5学习对象教程

PHP5学习对象教程由美国人古曼兹、贝肯、瑞桑斯编著,简张桂翻译,电子工业出版社于2007年12月1日出版的关于PHP5应用程序的技术类图书。该书全面介绍了PHP 5中的新功能、编程方法及设计模式,还分析阐述了PHP 5中新的数据库连接处理、错误处理和XML处理等机制,帮助读者系统了解、熟练掌握和高效应用PHP。

下载
import json
import asyncio
import websockets
import nest_asyncio
nest_asyncio.apply()


async def handle_request(websocket):
    while True:
        try:
            message = await websocket.recv()
            data = json.loads(message)

            order = {'key' : data['key'], 'val1' : 1.0, 'val2' : 2.0 }
            json_data = json.dumps(order)
            await websocket.send(json_data)
        except websockets.ConnectionClosedOK:
            break
    print("handle_request")


async def main():
    async with websockets.serve(handle_request, "localhost", 8765, ping_interval=None):
        print('world running...')
        await asyncio.Future()  # run forever
    print('world done')


if __name__ == "__main__":
    asyncio.run(main())

在这个修改后的版本中,handle_request 函数包含一个 while True 循环,它会持续监听客户端发送的消息。当客户端关闭连接时,会抛出 websockets.ConnectionClosedOK 异常,此时循环会中断,函数退出。

注意事项:

  • 服务器需要一种机制来判断客户端何时完成所有请求并关闭连接。可以使用特定的消息或超时机制来实现。
  • 需要处理客户端断开连接的情况,例如使用 try...except 块捕获 websockets.ConnectionClosedOK 异常。

处理连接关闭事件

无论选择哪种解决方案,都需要正确处理连接关闭事件。客户端和服务器端都应该能够检测到连接何时关闭,并采取适当的措施,例如重新建立连接或清理资源。

以下是一些处理连接关闭事件的建议:

  • 客户端: 在循环建立新连接的方案中,async with 语句会自动处理连接关闭。如果使用其他方式建立连接,需要手动关闭连接,并处理可能发生的异常。
  • 服务器端: 在保持连接活跃的方案中,使用 try...except 块捕获 websockets.ConnectionClosedOK 异常,并在异常处理程序中执行清理操作。

总结

ConnectionClosedOK 错误是 WebSocket 通信中常见的问题。通过选择合适的解决方案并正确处理连接关闭事件,可以确保 WebSocket 通信的稳定性和可靠性。本文介绍了两种解决方案:客户端循环建立新连接和服务器端保持连接活跃,并提供了相应的代码示例和注意事项。选择哪种方案取决于具体的应用场景和需求。

相关专题

更多
while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

93

2023.09.25

Golang WebSocket与实时通信开发
Golang WebSocket与实时通信开发

本专题系统讲解 Golang 在 WebSocket 开发中的应用,涵盖 WebSocket 协议、连接管理、消息推送、心跳机制、群聊功能与广播系统的实现。通过构建实际的聊天应用或实时数据推送系统,帮助开发者掌握 如何使用 Golang 构建高效、可靠的实时通信系统,提高并发处理与系统的可扩展性。

20

2025.12.22

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

54

2026.01.19

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

25

2026.01.23

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

29

2026.01.23

yy漫画官方登录入口地址合集
yy漫画官方登录入口地址合集

本专题整合了yy漫画入口相关合集,阅读专题下面的文章了解更多详细内容。

117

2026.01.23

漫蛙最新入口地址汇总2026
漫蛙最新入口地址汇总2026

本专题整合了漫蛙最新入口地址大全,阅读专题下面的文章了解更多详细内容。

178

2026.01.23

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

16

2026.01.23

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

70

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号