首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在asyncio中python-trio echo server - multiple client的确切版本是什么?

在asyncio中python-trio echo server - multiple client的确切版本是什么?
EN

Stack Overflow用户
提问于 2021-05-14 04:46:07
回答 2查看 64关注 0票数 0

我正在尝试将下面的echo server IRC聊天终端转换为asyncio,但我不认为太多关于trio的信息,因为它是新的,但是这个到asyncio的翻译是什么?

代码语言:javascript
复制
import trio
from itertools import count
from datetime import datetime

PORT = 9999
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)
            print("echo_server {}: received data {!r}".format(self.ident, data))
            if not data:
                print("echo_server {}: connection closed".format(self.ident))
                return
            print("echo_server {}: sending data {!r}".format(self.ident, data))
            await self.stream.send_all('success'.encode())


class Server:

    def __init__(self):
        self.protocols = []

    async def receive_connection(self, server_stream):
        print('{} - {} CONNECTED.'.format(datetime.now(), dir(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)
EN

回答 2

Stack Overflow用户

发布于 2021-05-15 17:00:14

多亏了anyio,你不需要修改太多代码就能让它在异步环境下工作;)

代码语言:javascript
复制
import anyio
from itertools import count
from datetime import datetime

PORT = 9999
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):
        async with self.stream:
            data = await self.stream.receive(BUFSIZE)
            print("echo_server {}: received data {!r}".format(self.ident, data))
            if not data:
                print("echo_server {}: connection closed".format(self.ident))
                return
            print("echo_server {}: sending data {!r}".format(self.ident, data))
            await self.stream.send('success'.encode())


class Server:

    def __init__(self):
        self.protocols = []

    async def receive_connection(self, server_stream):
        print('{} - {} CONNECTED.'.format(datetime.now(), dir(server_stream)))
        sp: ServerProtocol = ServerProtocol(server_stream)
        self.protocols.append(sp)
        await sp.listen()


async def main():
    listener = await anyio.create_tcp_listener(local_port=PORT)
    await listener.serve(Server().receive_connection)


anyio.run(main)

你一定要看看anyio :)

票数 3
EN

Stack Overflow用户

发布于 2021-05-14 17:55:32

我会这样说:

代码语言:javascript
复制
import asyncio
from itertools import count

PORT = 9999
BUFSIZE = 16384
CONNECTION_COUNTER = count()

class ServerProtocol:
    def __init__(self, read, write):
        self.ident = next(CONNECTION_COUNTER)
        self.read = read
        self.write = write

    async def listen(self):
        while True:
            data = await self.read.read(BUFSIZE)
            print("echo_server {}: received data {!r}".format(self.ident, data))
            if not data:
                print("echo_server {}: connection closed".format(self.ident))
                return
            print("echo_server {}: sending data {!r}".format(self.ident, data))
            self.write.write('success'.encode())
            await self.write.drain()

class Server:
    def __init__(self):
        self.protocols = []

    async def receive_connection(self, read, write):
        sp: ServerProtocol = ServerProtocol(read, write)
        self.protocols.append(sp)
        await sp.listen()

async def main():
    server = await asyncio.start_server(Server().receive_connection, '127.0.0.1', PORT)
    async with server:
        await server.serve_forever()

asyncio.run(main())

请注意,我保留了您的名字ServerProtocol,但请记住,“协议”类在asyncio中有不同的含义。该代码使用异步“流”层(很像三个原始的层),而不是从类名中的"protocol“后缀可以理解的较低级别的传输/协议层。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67526038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档