
在 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 循环来实现。
以下是修改后的服务器代码示例:
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 异常,此时循环会中断,函数退出。
注意事项:
无论选择哪种解决方案,都需要正确处理连接关闭事件。客户端和服务器端都应该能够检测到连接何时关闭,并采取适当的措施,例如重新建立连接或清理资源。
以下是一些处理连接关闭事件的建议:
ConnectionClosedOK 错误是 WebSocket 通信中常见的问题。通过选择合适的解决方案并正确处理连接关闭事件,可以确保 WebSocket 通信的稳定性和可靠性。本文介绍了两种解决方案:客户端循环建立新连接和服务器端保持连接活跃,并提供了相应的代码示例和注意事项。选择哪种方案取决于具体的应用场景和需求。
以上就是解决 WebSocket 连接中的 ConnectionClosedOK 错误的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号