ホームページ >バックエンド開発 >Python チュートリアル >EventMachineを使ってHTTPサーバーにファイルダウンロード機能を追加するRuby入門

EventMachineを使ってHTTPサーバーにファイルダウンロード機能を追加するRuby入門

高洛峰
高洛峰オリジナル
2017-03-04 16:13:481622ブラウズ

アイデア:

ruby eventsmachine と em-http-server gem を使用して、ファイルのダウンロード機能を提供する単純な HttpServer を完成させます。
ファイルを送信する場合、最初にヘッダーが組み立てられ、次に EM の FileStreamer が組み立てられます。 FileStreamer と呼ばれます。

コード:

require 'rubygems'
require 'eventmachine'
require 'em-http-server'
 
class HTTPHandler < EM::HttpServer::Server
 attr_accessor :filename, :filesize, :path
 
 def process_http_request
  #send file async
  if @http_request_method.to_s =~ /GET/ && @http_request_uri.to_s.end_with?(filename)
   send_data "HTTP/1.1 200 OK\n"
   send_data "Server: XiaoMi\n"
   send_data "Connection: Keep-Alive\n"
   send_data "Keep-Alive: timeout=15\n"
   send_data "Content-Type: application/octet-stream\n"
   send_data "Content-Disposition: filename=&#39;#{filename}&#39;\n"
   send_data "Content-Length: #{filesize}\n"
   send_data "\n"
 
   streamer = EventMachine::FileStreamer.new(self, path)
   streamer.callback {
    # file was sent successfully
    close_connection_after_writing
   }
  else
   response = EM::DelegatedHttpResponse.new(self)
   response.status = 200
   response.content_type &#39;text/html&#39;
   response.content = "Package HttpServer<br>usage: wget http://www.php.cn/:port/#{filename}"
   response.send_response
  end
 end
 
end
 
EM::run do
 path = &#39;/tmp/aaa.tar.gz&#39;
 EM::start_server("0.0.0.0", 8080, HTTPHandler) do |conn|
  conn.filename = File.basename(path)
  conn.filesize = File.size(path)
  conn.path = path
 end
end

PS:eventmachineのインストールエラーについて
Windowsにeventmachineをインストールすると、常にエラーが報告されます:

Building native extensions. This could take a while...
ERROR: Error installing eventmachine:
    ERROR: Failed to build gem native extension.

または別のエラー:

りー

Google で長い間検索した結果、2 つの解決策が見つかりました:

1.eventmachine の以前のバージョンを使用します

このプロンプトが表示され続けますが、以下の大きなエラーがあります。これはすべて C のコンパイル エラーです。オンラインでは2つの方法があります
(1)

ERROR: Error installing ruby-debug:
      The &#39;linecache&#39; native gem requires installed build tools.
   
  Please update your PATH to include build tools or download the DevKit
  from &#39;http://rubyinstaller.org/downloads&#39; and follow the instructions
  at &#39;http://github.com/oneclick/rubyinstaller/wiki/Development-Kit&#39;

これは下位バージョンをインストールするようです
(2)gem install

gem install eventmachine-win32

これはベータ1.0.0をインストールするようです。


2. devkit をアップグレードします

確認したところ、上記の具体的な解決策はありませんが、考えられる問題の理由は 2 つあります:
(1) C コンパイル環境がない
(2) スペースがある
上記のエラーログを見ると、コンパイル環境に問題がある可能性があることがわかりました。それで探しました。
私の Ruby はワンクリック インストーラーを使用してインストールされました。バージョンは 1.8.6-p398 です。
rubyinstallerのアドオンページでDevKitを見つけました。
DevKit の説明を見てみましょう:

//RubyGems でクールなネイティブを構築したい場合もあります
//C ベースの拡張機能をスコークせずに作成できます。
//DevKit は誰ですか!
これが私が考えていることのようです。必要 。

エラーの理由は、eventmachine をインストールするときにビルド ツールが必要ですが、それらがシステムで利用できないことです。エラー メッセージには解決策も示されています:
(1) http://rubyinstaller.org/downloads/ に移動して、開発キット – DevKit-tdm-32-4.5.1-20101214-1400-sfx.exe をダウンロードします
(2) ) http://github.com/oneclick/rubyinstaller/wiki/Development-Kit/ に従って開発キットをインストールします

主なインストール手順は次のとおりです:
古いバージョンの開発キットが既にオリジナルのバージョンにインストールされている場合システム、削除します
ダウンロード 上記の開発キットは、ダウンロードしたファイルを指定されたディレクトリ (c:/devkit など) に解凍します。 (注: ディレクトリにはスペースを含めることはできません)
ruby dk.rb を実行し、プロンプトに従って、ruby dk.rb init と Ruby dk.rb install をそれぞれ実行して、ruby を強化します

を実行できます

 eventmachine --pre

成功したかどうかをテストします。

インストール手順に従って、DevKit のインストールを完了します。これは非常に簡単です。


次に、eventmachine を再度インストールします:

gem install rdiscount –platform=ruby

eventmachine を使用して HTTP サーバーにファイルのダウンロード機能を追加する Ruby の詳細については、PHP 中国語 Web サイトの関連記事に注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。