启动管理多个TCP连接的三重奏服务器的正确方法



我最近使用django的混合物完成了一个项目,并扭曲并意识到我需要的东西过于杀伤,这基本上只是我的服务器通过TCP插座进行通信的一种方式。我转向三重奏,到目前为止,我喜欢我所看到的,因为它更加直接(对于我需要的东西(。话虽如此,我只是想确定自己做正确的方法。

我遵循教授基础知识的教程,但我需要一个可以一次处理多个客户端的服务器。为此,我提出了以下代码

import trio
from itertools import count
PORT = 12345
BUFSIZE = 16384
CONNECTION_COUNTER = count()

class ServerProtocol:
    def __init__(self, server_stream):
        self.ident = next(CONNECTION_COUNTER)
        self.stream = server_stream
    async def listen(self):
        while True:
            data = await self.stream.receive_some(BUFSIZE)
            if data:
                print('{} Receivedt {}'.format(self.ident, data))
                # Process data here

class Server:
    def __init__(self):
        self.protocols = []
    async def receive_connection(self, server_stream):
        sp: ServerProtocol = ServerProtocol(server_stream)
        self.protocols.append(sp)
        await sp.listen()

async def main():
    await trio.serve_tcp(Server().receive_connection, PORT)
trio.run(main)

我在这里的问题似乎是每个ServerProtocol在每个周期内运行listen,而不是等待收到数据。

我感觉自己正在使用三人错误,在这种情况下,我缺少三人的最佳实践吗?

您的整体结构对我来说很好。跳出我的问题是:

    while True:
        data = await self.stream.receive_some(BUFSIZE)
        if data:
            print('{} Receivedt {}'.format(self.ident, data))
            # Process data here

receive_some提供的保证是:如果另一侧已经关闭了连接,则立即返回一个空字节串。否则,它会等到有一些数据返回,然后将其返回为非空字节。

因此,您的代码应该正常工作...直到另一端关闭连接。然后,它开始进行无限循环,在该循环中不断检查数据,重新获得一个空字节串(data = b""(,因此if data: ...块不运行,并且立即循环再次进行。

>

解决此问题的一种方法(最后3行是新的(:

    while True:
        data = await self.stream.receive_some(BUFSIZE)
        if data:
            print('{} Receivedt {}'.format(self.ident, data))
            # Process data here
        else:
            # Other side has gone away
            break

最新更新