通过ruby TCP套接字接收大量数据时出现问题
我通过TCP套接字发送和接收JSON数据。当数据量较小时(如200字节左右),它可以正常工作。但当它达到大约10KB时,它只接收部分数据。我已经尝试了我能找到的所有不同的TCP套接字检索数据命令(read、gets、gets.chomp、recv),但是我找不到一个适用于所有测试的命令 以下是我现在掌握的代码:通过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) 我还尝试添加超时,但无法使
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
,它可以读取您指定的尽可能多的字节(如果可能)
您还需要实现一种对消息进行分隔的方法:
- 使用固定长度的消息
- 在(固定大小)标题中提前发送消息的长度
- 使用某种终止符,例如空字节