我正在尝试通过套接字复制一个文件。这很好用。但是,脚本永远不会结束。我陷入了一个无休止的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
1条答案
按热度按时间c2e8gylq1#
永远不要告诉脚本停止阅读。
read(1024)
函数是阻塞的,当套接字打开时,它永远不会返回nil。最简单的修复方法是在发送文件时关闭套接字。当不需要更多数据时,也应该关闭文件以写入数据。如果你想保持连接,你必须有某种协议。也许在通信开始时有一行表示文件长度。然后你可以读取第一行,然后从套接字读取预期的字节数。
加分点是在头中发送校验和,并在接收时验证文件。