我通过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)
我不确定我错过了什么。任何帮助将不胜感激。
答案 0 :(得分:2)
Ruby文档中的badly documented,但我认为TCPSocket#recv
实际上只是调用recv
系统调用。那个(请参阅man 2 recv
)从内核确定的流中读取多个字节,尽管从不超过应用程序指定的数量。要接收更大的“消息”,您需要循环调用它。
但是有一种更简单的方法:因为TCPSocket
间接地从IO
类继承,你可以免费获得all of its methods,包括IO#read
,其读取的字节数与你指定(如果可能的话)。
您还需要实现一种分隔邮件的方法: