我正在尝试将下面的echo server IRC聊天终端转换为asyncio,但我不认为太多关于trio的信息,因为它是新的,但是这个到asyncio的翻译是什么?
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)发布于 2021-05-15 17:00:14
多亏了anyio,你不需要修改太多代码就能让它在异步环境下工作;)
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 :)
发布于 2021-05-14 17:55:32
我会这样说:
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“后缀可以理解的较低级别的传输/协议层。
https://stackoverflow.com/questions/67526038
复制相似问题