每当服务器关闭连接时,客户端就直接退出,并且 case elif msg.type == aiohttp.WSMsgType.CLOSE:
永远不会执行。
客户端代码:
import asyncio
import aiohttp
async def main():
async with aiohttp.ClientSession() as session:
async with session.ws_connect('http://127.0.0.1:8080/ws') as ws:
msg = input()
await ws.send_str(msg)
async for msg in ws:
print(msg)
if msg.type == aiohttp.WSMsgType.TEXT:
print(msg.data)
elif msg.type == aiohttp.WSMsgType.ERROR:
break
elif msg.type == aiohttp.WSMsgType.CLOSE:
print("Connection closed")
exit(0)
msg = input()
await ws.send_str(msg)
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
服务器代码:
import weakref
import aiohttp
from aiohttp import web, WSCloseCode
async def websocket_handler(request):
ws = web.WebSocketResponse()
await ws.prepare(request)
request.app['websockets'].add(ws)
try:
async for msg in ws:
print(msg)
if msg.type == aiohttp.WSMsgType.TEXT:
if msg.data == 'close':
await ws.close()
else:
await ws.send_str(msg.data + '/answer')
elif msg.type == aiohttp.WSMsgType.ERROR:
print('ws connection closed with exception %s' %
ws.exception())
finally:
request.app['websockets'].discard(ws)
print('websocket connection closed')
return ws
async def on_shutdown(app):
print(app['websockets'])
for ws in set(app['websockets']):
await ws.close(code=WSCloseCode.GOING_AWAY,
message='Server shutdown')
app = web.Application()
app['websockets'] = weakref.WeakSet()
app.add_routes([web.get('/ws', websocket_handler)])
app.on_shutdown.append(on_shutdown)
web.run_app(app)
此外,当我在服务器端按下 Ctrl+C,突然退出服务器时,我相信它应该通过关闭客户端的关闭方法,但 on_shutdown 方法既不执行,客户端也没有检测到它。