通过ruby TCP套接字接收大量数据时出现问题

通过ruby TCP套接字接收大量数据时出现问题,ruby,sockets,tcp,Ruby,Sockets,Tcp,我通过TCP套接字发送和接收JSON数据。当数据量较小时(如200字节左右),它可以正常工作。但当它达到大约10KB时,它只接收部分数据。我已经尝试了我能找到的所有不同的TCP套接字检索数据命令(read、gets、gets.chomp、recv),但是我找不到一个适用于所有测试的命令 以下是我现在掌握的代码: socket = TCPSocket.new '10.11.50.xx', 13338 response = socket.recv(1000000000) 我还尝试添加超时,但无法使

我通过TCP套接字发送和接收JSON数据。当数据量较小时(如200字节左右),它可以正常工作。但当它达到大约10KB时,它只接收部分数据。我已经尝试了我能找到的所有不同的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)
我不确定我错过了什么。任何帮助都将不胜感激。

它在Ruby文档中,但我认为
TCPSocket#recv
实际上只是调用
recv
系统调用。这一个(请参见
man2recv
)从内核确定的流中读取一定数量的字节,但决不能超过应用程序指定的数量。要接收更大的“消息”,您需要在循环中调用它

但是有一种更简单的方法:因为
TCPSocket
间接继承了
IO
类,所以您可以免费获得,包括
IO#read
,它可以读取您指定的尽可能多的字节(如果可能)

您还需要实现一种对消息进行分隔的方法:

  • 使用固定长度的消息
  • 在(固定大小)标题中提前发送消息的长度
  • 使用某种终止符,例如空字节

这解决了我的问题。我使用TLV包装器发送响应,并且能够使用长度来确定要读取的字节数。我用了“TCPSocket#read”而不是“TCPSocket#recv”。非常感谢。