也许我把我的套接字编程方式搞混了,但这样的东西不应该工作吗?
srv = TCPServer.open(3333)
client = srv.accept
data = ""
while (tmp = client.recv(10))
data += tmp
end
我已经尝试了几乎所有其他从客户端 TCPSocket“获取”数据的方法,但它们都挂起并且永远不会跳出循环(getc、gets、read 等)。我觉得我忘记了什么。我错过了什么?
为了使服务器编写得很好,您需要:
read(size)
而不是recv(size)
. read
阻塞,直到收到总字节数。recv
直到你收到一个指示通信结束的字节序列。read
,将返回部分数据或 0recv
并将返回 0 大小的数据data.empty?==true
。select
来在一段时间后没有进行通信时获得超时。在这种情况下,您将关闭套接字并假设每个数据都已通信。希望这可以帮助。
嗯,我在堆栈溢出时一直这样做[回答我自己的问题]。也许它会帮助别人。我找到了一种更简单的方法来做我想做的事情:
srv = TCPServer.open(3333)
client = srv.accept
data = ""
recv_length = 56
while (tmp = client.recv(recv_length))
data += tmp
break if tmp.length < recv_length
end
没有任何东西可以写入套接字,因此client.recv(10)
返回 nil 或 false。
尝试:
srv = TCPServer.open(3333)
client = srv.accept
data = ""
while (tmp = client.recv(10) and tmp != 'QUIT')
data += tmp
end