繁体   English   中英

我如何使用 asyncio sockets 在连接的客户端之间切换

[英]how do i switch between connected clients with asyncio sockets

我正在尝试制作一个套接字服务器,该服务器能够使用 asyncio sockets 连接多个客户端,并且能够轻松地在它通信的客户端之间切换,同时仍然连接所有客户端。 我以为会有某种类型的客户 FD,例如 sockets,但我查看了文档并没有找到任何东西,或者我错过了它。

这是我的服务器代码:

import socket
import asyncio


host = "localhost"

port = 9998

list_of_auths = ['desktop-llpeu0p\\tomiss', 'desktop-llpeu0p\\tomisss',
                 'desktop-llpeu0p\\tomissss', 'desktop-llpeu0p\\tomisssss']

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print('socket initiated.')
confirmed = 'CONFIRMED'
deny = 'denied'
#(so i dont forget) to get recv in async do: var = (await reader.read(4096)).decode('utf-8') if -1 then it will read all
#(so i dont forget) to write sendall do: writer.write(var.encode('utf-8')) should be used with await writer.drain()

async def handle_client(reader, writer):
    idrecv = (await reader.read(255)).decode('utf-8')
    if idrecv in list_of_auths:
        writer.write(confirmed.encode('utf-8'))
    else:
        writer.write(deny.encode('utf-8'))
        writer.close()
    request = None
    while request != 'quit':
        print("second checkpoint")

    writer.close()

async def run_server():
    print("first checkpoint")
    server = await asyncio.start_server(handle_client, host, port)
    async with server:
        await server.serve_forever()
asyncio.run(run_server())

此代码允许多个客户端一次连接; 但是,它只能让我与最后一个连接的人进行通信。

我建议像这样实现它:

class SocketHandler(asyncio.Protocol):
    def __init__(self):
        asyncio.Protocol.__init__(self)
        self.transport = None
        # your other code

    def connection_made(self, transport):
        """ incoming connection """
        self.transport = transport
        # your other code

    def connection_lost(self, exception):
        self.close()
        # your other code

    def data_received(self, data):
        # your code handling incoming data
    

    def close(self):
        try:
            self.transport.close()
        except AttributeError:
            pass


port = 5060
loop = asyncio.get_event_loop()
coro = loop.create_server(SocketHandler, '', port)
server = loop.run_until_complete(coro)
loop.run_forever()

这样,到服务器的每个连接都由SocketHandler的一个实例表示。 每当您在此实例中处理一些数据时,您就知道它是哪个客户端连接。

您还可以通过将SocketHandler的每个实例添加到全局列表ALL_CONNECTIONS = []来维护连接列表:在SocketHandler.connection_made执行ALL_CONNECTIONS.append(self) 如果需要,这将允许向所有连接的客户端发送消息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM