客户端未在 aiohttp websockets

时间:2021-01-18 04:09:23

标签: python websocket aiohttp

每当服务器关闭连接时,客户端就直接退出,并且 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 方法既不执行,客户端也没有检测到它。

0 个答案:

没有答案
相关问题