お手軽ファイル転送
From Usipedia
※実用的にはnetcatやscpを使った方がいいです
あくまでも学習用スクリプトとしてご利用下さい.
Contents |
使い方
netcatを用いたファイルの送受信方法と似ています.
受信側
ruby ft.rb <適当なポート番号>
送信側
ruby ft.rb <相手のホスト> <相手のポート番号> <送りたいファイルへのパス>
実行例
[192.168.0.10] から [192.168.0.15:1234] に、ft.rb があるフォルダの up フォルダの中にある wahaa.jpg を送る場合。
後者は次のコマンドを実行して待機していて下さい.
ruby ft.rb 1234
前者が次のコマンドを実行すれば送信完了です.
ruby ft.rb 192.168.0.15 1234 up/wahaa.jpg
スクリプト
ft.rb
require "socket" def send_file(host, port, name) puts "#{name} を送信中です..." open(name, "rb") do |file| size = File.size(name) sock = TCPSocket.open(host, port) sock.puts "PUT_FILE #{name} #{size}" sock.write(file.read) sock.close end puts "#{name} の送信が完了しました" end def receive_file(port) s0 = TCPServer.open(port) puts "#{port} 番のポートで受信を開始しました" while true Thread.start(s0.accept) do |sock| puts "[#{sock.peeraddr[3]}:#{sock.peeraddr[1]}] からの接続を了承しました" while /^PUT_FILE\s+(\S+)\s+(\d+)$/ =~ sock.gets.chop! name, size = File.basename($1), $2 puts "#{name} を受信中です..." open("#{name}", "wb") do |file| file.write(sock.read(size.to_i)) end puts "#{name} の受信が完了しました" end puts "[#{sock.peeraddr[3]}:#{sock.peeraddr[1]}] からの接続が拒否されました" sock.close end end end host, port, file_name = ARGV if port && file_name send_file(host, port, file_name) else port = host receive_file(port) end
参考
- 原信一郎,まつもとゆきひろ 『Rubyプログラミング入門』 オーム社
- file-transfer.rb