通过ruby TCP Socket接收大量数据的问题

时间:2013-09-26 20:17:12

标签: ruby sockets tcp

我通过TCP套接字发送和接收JSON数据。当数据量较小时(例如200字节左右),它可以正常工作。但当它达到大约10 KB时,它只接收部分数据。我已经尝试了所有可以找到的不同TCP套接字检索数据命令(read,gets,gets.chomp,recv),但我找不到适用于我所有测试的命令。

以下是我现在的代码:

socket = TCPSocket.new '10.11.50.xx', 13338
response = socket.recv(1000000000)

我也尝试过添加超时但我无法让它工作:

socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_RCVTIMEO, 1)

我不确定我错过了什么。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

Ruby文档中的badly documented,但我认为TCPSocket#recv实际上只是调用recv系统调用。那个(请参阅man 2 recv)从内核确定的流中读取多个字节,尽管从不超过应用程序指定的数量。要接收更大的“消息”,您需要循环调用它。

但是有一种更简单的方法:因为TCPSocket间接地从IO类继承,你可以免费获得all of its methods,包括IO#read,其读取的字节数与你指定(如果可能的话)。

您还需要实现一种分隔邮件的方法:

  • 使用固定长度的消息
  • 在(固定大小)标题
  • 中预先发送消息的长度
  • 使用某种终结器,例如一个空字节