如何在Ruby中通过套接字复制文件?

cidc1ykv  于 2023-03-12  发布在  Ruby
关注(0)|答案(1)|浏览(118)

我正在尝试通过套接字复制一个文件。这很好用。但是,脚本永远不会结束。我陷入了一个无休止的while循环,通过套接字阅读数据。提前感谢你。

server = TCPServer.new 5555

Thread.new do
  client = server.accept

  file = File.new('files.zip', 'rb')

  while line = file.read(1024)
    client.write line
  end
end

socket = TCPSocket.new('localhost', 5555)
file = File.new('files_backup.zip', 'wb')
while line = socket.read(1024)
  file.write line
end

我也试过零。

require 'socket'

server = TCPServer.new 5555

Thread.new do
  client = server.accept
  client.write File.binread 'files.zip'
  client.write nil
end

socket = TCPSocket.new('localhost', 5555)
file = File.new('files_backup.zip', 'wb')

while line = socket.read(1024)
  unless line
    break
  end
  file.write line
end

file.close

使用长度作为读取的大小进行更新。

require 'socket'

server = TCPServer.new 5555

Thread.new do
  client = server.accept
  content = File.binread('hackers.zip')
  client.write content.length
  client.write content
end

socket = TCPSocket.new('localhost', 5555)
file = File.new('hackers_backup.zip', 'wb')

length = socket.gets.to_i
content = socket.read length
file.write content
file.close
c2e8gylq

c2e8gylq1#

永远不要告诉脚本停止阅读。read(1024)函数是阻塞的,当套接字打开时,它永远不会返回nil。最简单的修复方法是在发送文件时关闭套接字。当不需要更多数据时,也应该关闭文件以写入数据。

require 'socket'
server = TCPServer.new 5555

Thread.new do
  client = server.accept
  file = File.new('files.zip', 'rb')
  while line = file.read(1024)
    client.write line
  end
  client.close
end

socket = TCPSocket.new('localhost', 5555)
file = File.new('files_backup.zip', 'wb')
while line = socket.read(1024)
  file.write line
end
file.close

如果你想保持连接,你必须有某种协议。也许在通信开始时有一行表示文件长度。然后你可以读取第一行,然后从套接字读取预期的字节数。

require 'socket'
server = TCPServer.new 5555

Thread.new do
  client = server.accept
  file = File.new('files.zip', 'rb')
  client.puts file.size
  while line = file.read(1024)
    client.write line
  end
end

socket = TCPSocket.new('localhost', 5555)
length = socket.gets.to_i
File.open('files_backup.zip', 'wb'){|f| f.write(socket.read(length)) }

加分点是在头中发送校验和,并在接收时验证文件。

相关问题