lua 套接字接收未知长度的字符串

lua socket receive string of unknown length

我有一个套接字服务器,它监听命令并响应它们。响应的长度并不总是相同。在 python 以下代码运行良好,即使来自服务器的响应小于 1024 字节。

import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("localhost", 9999))
sock.sendall(bytes("command\n", 'utf-8'))
print(sock.recv(1024))

现在我想将其转换为等效的 lua 代码。这是我的尝试:

socket = require("socket")
sock = socket.connect("localhost", 9999)
sock:send("command\n")
s, status, partial = sock:receive(1024)
print(s)

不幸的是,如果发送的字节少于 1024 字节,则接收调用会阻塞。 python客户端如何发现传输结束,为什么lua客户端还在等待?

Lua receive 是阻塞的,而 python recv 如果至少有 1 个字节是非阻塞的。底层 tcp 协议不保证读取超过 1 个字节。所以,如果您在 python 内收到完整的回复,那纯属运气。另一方面,Lua 需要正好 1024 字节并等待直到服务器发送 1024 或套接字关闭。

TCP 是一种流式传输协议。您需要某种长度指示符或消息结束标记,例如换行符,您可以这样写 lua:

s = sock:receive('*l')