2010-03-09 30 views
4

也许我已经把我的套接字编程方式混淆了,但不应该像这样工作?Ruby TCPServer套接字

srv = TCPServer.open(3333) 
client = srv.accept 

data = "" 
while (tmp = client.recv(10)) 
    data += tmp 
end 

我已经试过几乎“获得”从客户的TCPSocket数据的所有其他方法,但它们都挂永不中断循环的(GETC,获取,阅读等)。我觉得我忘记了一些东西。我错过了什么?

回答

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 
+3

您希望发送的序列中的最后一个块可能正好是'recv_length'的大小,并且循环将再次运行(错误)。 – clyfe 2010-03-09 21:56:38

1

有是CA被写入插座等等,client.recv(10)返回零或假的什么都没有。尝试:
SRV = TCPServer.open(3333) 客户端= srv.accept

data = "" 
while (tmp = client.recv(10) and tmp != 'QUIT') 
    data += tmp 
end 
8

为了使服务器写得很好,你将需要:

  • 提前知道将传达的数据量:在这种情况下,您可以使用方法read(size)而不是recv(size)。直到接收到总字节数为止。
  • 有一个终止序列:在这种情况下,您在recv上保持一个循环,直到您收到指示通信结束的字节序列。
  • 让客户端在完成通讯后关闭套接字:在这种情况下,read将返回部分数据或0,而recv将返回0大小的数据data.empty?==true
  • 定义通信超时:您可以使用功能select以在特定时间段之后未通信完成时发生超时。在这种情况下,您将关闭套接字并假设每个数据都已通信。

希望这会有所帮助。