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