也许我已经把我的套接字编程方式混淆了,但不应该像这样工作?Ruby TCPServer套接字
srv = TCPServer.open(3333)
client = srv.accept
data = ""
while (tmp = client.recv(10))
data += tmp
end
我已经试过几乎“获得”从客户的TCPSocket数据的所有其他方法,但它们都挂永不中断循环的(GETC,获取,阅读等)。我觉得我忘记了一些东西。我错过了什么?
也许我已经把我的套接字编程方式混淆了,但不应该像这样工作?Ruby TCPServer套接字
srv = TCPServer.open(3333)
client = srv.accept
data = ""
while (tmp = client.recv(10))
data += tmp
end
我已经试过几乎“获得”从客户的TCPSocket数据的所有其他方法,但它们都挂永不中断循环的(GETC,获取,阅读等)。我觉得我忘记了一些东西。我错过了什么?
嗯,我一直这样做堆栈溢出[回答我自己的问题]。也许它会帮助别人。我发现了一个更简单的方法去这样做什么,我试图做的事:
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
有是CA被写入插座等等,client.recv(10)
返回零或假的什么都没有。尝试:
SRV = TCPServer.open(3333) 客户端= srv.accept
data = ""
while (tmp = client.recv(10) and tmp != 'QUIT')
data += tmp
end
为了使服务器写得很好,你将需要:
read(size)
而不是recv(size)
。直到接收到总字节数为止。recv
上保持一个循环,直到您收到指示通信结束的字节序列。read
将返回部分数据或0,而recv
将返回0大小的数据data.empty?==true
。select
以在特定时间段之后未通信完成时发生超时。在这种情况下,您将关闭套接字并假设每个数据都已通信。希望这会有所帮助。
您希望发送的序列中的最后一个块可能正好是'recv_length'的大小,并且循环将再次运行(错误)。 – clyfe 2010-03-09 21:56:38