お手軽ファイル転送

From Usipedia
Jump to: navigation, search

※実用的には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
Namespaces
Variants
Views
Actions
Categories