服务器等待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字节 服务器停止客户端并冻结他
我认为很多初学者会对这个问题感到困惑,因为他们在完成之前不完全理解如何读取套接字。答案很简单,但可能不令人满意:
这取决于您使用的协议。
如果您查看HTTP/1.1之类的标准,那么客户端和服务器知道消息何时完成的方式(为了便于解释,简化了-除了一般要点,还有更多内容)是通过
Content-Length
头和双\r\n
转义字符。因此,当客户端向服务器发送内容时,他/她会发送:在这种情况下,客户机通过使用
HTTP/1.1
协议的GET
请求根目录/
请注意双
\r\n
-这是标头和消息的完成,服务器将不会读取超出此范围的套接字,因为不存在Content-Length
标头。然后,服务器将使用以下命令进行回复:这是一个简单的解释,当使用HTTP/1.1时,客户端和服务器都知道要读取套接字多长时间。您可以在网上轻松找到有关该协议的更多信息,并且有一些库可以帮助您创建自己的原始HTTP请求
如果您想编写自己的版本-我不建议在生产中使用自己的协议,除非您真正了解自己在做什么-您可以更简单一点,只需读取套接字,直到到达一个符号(示例)
\0
,它指示客户端或服务器消息的结束简言之:协议很重要,如果您没有使用标准协议,您需要弄清楚如何告诉客户机和服务器,直到何时他们应该读取其套接字
相关问题 更多 >
编程相关推荐