读取所有套接字异步

2024-04-24 12:03:42 发布

您现在位置:Python中文网/ 问答频道 /正文

服务器等待1024字节:

import asyncio


async def handle_client(reader, writer):
    data = await reader.read(1024)
    writer.write("hello from server".encode())
    await writer.drain()
    writer.close()


loop = asyncio.get_event_loop()
loop.create_task(asyncio.start_server(handle_client, 'localhost', 4782))
loop.run_forever()

客户端Gen 2048字节并在服务器上发送:

import socket
sock = socket.socket()
sock.connect(('localhost', 4782))
sock.sendall(("".join([str(i)[-1:] for i in range(2048)])).encode())
data = sock.recv(1024)
sock.close()

麻烦: 如果buff=1020 客户端发送了3000字节 服务器停止客户端并冻结他


Tags: import服务器clientloopasyncio客户端data字节
1条回答
网友
1楼 · 发布于 2024-04-24 12:03:42

我认为很多初学者会对这个问题感到困惑,因为他们在完成之前不完全理解如何读取套接字。答案很简单,但可能不令人满意:

这取决于您使用的协议。

如果您查看HTTP/1.1之类的标准,那么客户端和服务器知道消息何时完成的方式(为了便于解释,简化了-除了一般要点,还有更多内容)是通过Content-Length头和双\r\n转义字符。因此,当客户端向服务器发送内容时,他/她会发送:

GET / HTTP/1.1\r\n
Host: www.example.com\r\n
Connection: close\r\n\r\n

在这种情况下,客户机通过使用HTTP/1.1协议的GET请求根目录/

请注意双\r\n-这是标头和消息的完成,服务器将不会读取超出此范围的套接字,因为不存在Content-Length标头。然后,服务器将使用以下命令进行回复:

HTTP/1.1 200 OK\r\n
Content-Length: 18\r\n\r\n
{"hello": "world"}

这是一个简单的解释,当使用HTTP/1.1时,客户端和服务器都知道要读取套接字多长时间。您可以在网上轻松找到有关该协议的更多信息,并且有一些库可以帮助您创建自己的原始HTTP请求

如果您想编写自己的版本-我不建议在生产中使用自己的协议,除非您真正了解自己在做什么-您可以更简单一点,只需读取套接字,直到到达一个符号(示例)\0,它指示客户端或服务器消息的结束

简言之:协议很重要,如果您没有使用标准协议,您需要弄清楚如何告诉客户机和服务器,直到何时他们应该读取其套接字

相关问题 更多 >