我有一个套接字服务器,它监听命令并响应它们。答复的长度并不总是相同。在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客户端仍在等待?
答案 0 :(得分:1)
Lua接收是阻塞的,而如果至少有1个字节,则python recv是非阻塞的。底层tcp协议不保证读取超过1个字节。所以,如果你在python中收到整个响应,这只是运气。另一方面,Lua预计只有1024个字节并等待服务器发送1024或套接字关闭。
TCP是一种流媒体协议。你需要某种长度指示符或消息结束标记,比如换行符,你可以用lua写一下:
s = sock:receive('*l')