【问题标题】:Problems receiving large amount of data through ruby TCP Socket通过ruby TCP Socket接收大量数据的问题
【发布时间】:2013-09-26 20:17:11
【问题描述】:

我正在通过 TCP 套接字发送和接收 JSON 数据。当数据量较小时,它可以正常工作,例如 200 字节左右。但是当它达到大约 10 KB 时,它只接收部分数据。我已经尝试了所有我能找到的不同的 TCP 套接字检索数据命令(读取、获取、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 sockets tcp


    【解决方案1】:

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

    但是有一个更简单的方法:因为TCPSocket 间接继承自IO 类,所以你可以免费获得all of its methods,包括IO#read,它会读取你指定的尽可能多的字节(如果可能的话)。

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

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

    【讨论】:

    • 这解决了我的问题。我使用 TLV 包装器发送响应,并且能够使用长度来确定要读取的字节数。我使用了“TCPSocket#read”而不是“TCPSocket#recv”。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 2013-07-14
    • 2010-09-24
    • 1970-01-01
    • 2011-05-30
    相关资源
    最近更新 更多