Ruby TCP Socket不读取整个输入数据

o4tp2gmn  于 2023-04-20  发布在  Ruby
关注(0)|答案(1)|浏览(85)

我实现了一个简单的TCP服务器,它监听特定的地址和端口:

TCPServer.open(address,port) do |server|
    file = File.open(file_name,"wb")
    while client = server.accept
        while buffer = client.gets()
            puts buffer
            file.write(buffer)
        end
    end
end

当我通过netcat发送短字符串或4096字节以下的字符串时,它会完全读取它们。当消息超过大小时,它会被截断,即使在连接之后,一旦到达eof。
我尝试实现一个TCPServer的替代方案:

one_hundred_kb = 1024 * 100
Socket.tcp_server_loop(address,port) do |connection|
begin
   file = File.open(file_name,"wb")
   # Read data in chunks of 1 hundred kb or less.
   while data = connection.readpartial(one_hundred_kb) do
       puts data
       file.write(data)
   end
   rescue EOFError
       connection.close unless connect.nil?
   end
end

这个解决方案似乎也有与前一个相同的问题。我发现了一个similar thread,它可能会澄清这个问题,但我不能改变客户端发送消息到服务器的方式。
是否有方法更改最大读取大小以及数据被截断且无法恢复的原因?

编辑

正如@Stefan问我的那样,我通过发送一个大于4096字节的非常大的字符串(由一个非常长的1序列和两个尾随的xx组成)来强调我的问题。在服务器端,最终数据被截断,x没有显示。

2o7dmzc5

2o7dmzc51#

您只是有一个错误的印象,即文件被截断,因为您在它被关闭或刷新之前查看了它的内容。

相关问题