2013-09-26 38 views
2

我通过TCP套接字发送和接收JSON数据。当数据量较小时,它可以正常工作,如200字节左右。但是当它达到大约10 KB时,它只接收部分数据。我试过所有不同的TCP套接字检索数据命令,我可以找到(读取,获取,gets.chomp,recv),但我无法找到一个适用于我所有测试的工具。通过ruby TCP接收大量数据的问题Socket

这里是我现在的代码:

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

我也尝试添加了超时,但我无法得到它的工作:

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

我不知道我错过了什么。任何帮助,将不胜感激。

回答

2

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

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

您还西港岛线需要实现的方式来界定您的消息:

  • 使用固定长度的消息
  • 发送消息的长度前面的(固定大小)头
  • 使用某种终结者,例如NULL字节
+1

这解决了我的问题。我使用TLV封装器发送了响应,并能够使用该长度来确定要读取的字节数。我用'TCPSocket#read'代替'TCPSocket#recv'。谢谢! – rmsimpsonau