Ruby使用eventmachine为HTTP服务器添加文件下载功能


Posted in Python onApril 20, 2016

思路:
使用ruby eventmachine和em-http-server gem,完成一个简单的提供文件下载功能的HttpServer;
使用了EM的FileStreamer来异步发送文件,发送文件时先组装了header,然后调用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='#{filename}'\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 'text/html'
   response.content = "Package HttpServer<br>usage: wget http://host:port/#{filename}"
   response.send_response
  end
 end
 
end
 
EM::run do
 path = '/tmp/aaa.tar.gz'
 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.

或者另外一种:

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

后来经过了漫长的Google,找到了2个solution:

1.用更低版本的eventmachine
 
这个提示一直不断,下面还有一大难错误,都是C的编译错误后来网上找了两个方法
(1)

gem install eventmachine-win32

这个貌似安装的是较低版本的
(2)gem install

eventmachine --pre

这个貌似安装的是 beta 1.0.0的。

 
2.升级devkit
 
看了一下,上面没有提具体的解决方案,但是给出了问题产生的两个可能原因:
(1)没有C编译环境
(2)路径当中有空格
看看上面的错误日志,发现可能就是编译环境的问题。于是找了一下。
我的ruby是用one-click installer装的,版本是1.8.6-p398。
在rubyinstaller的addon页面,找到了DevKit。
看了一下DevKit的说明:

//Sometimes you just want RubyGems to build that cool native,
//C-based extension without squawking.
//Who's your buddy? DevKit!
看来这就是我需要的。
 
出错的原因是安装eventmachine的时候,需要build tools,但系统中没有。出错信息中同时也给出了解决的法案:
(1) 到 http://rubyinstaller.org/downloads/ 去下载dev kit ? DevKit-tdm-32-4.5.1-20101214-1400-sfx.exe
(2)按照 http://github.com/oneclick/rubyinstaller/wiki/Development-Kit/ 安装dev kit
主要安装步骤如下:
如果原来系统中已经安装了旧版的dev kit, 则删除它
下载上面提到的dev kit
解压下载下来的文件到指定的目录,如c:/devkit。(注意:目录不能有空格)
运行ruby dk.rb,然后按照提示分别运行ruby dk.rb init 和 ruby dk.rb install来增强ruby
可以运行

gem install rdiscount ?platform=ruby

来测试是否成功。
按照安装步骤,完成了DevKit的安装,非常简单。

然后,再次安装eventmachine:

gem install eventmachine
Python 相关文章推荐
Python中列表和元组的相关语句和方法讲解
Aug 20 Python
Python实现二叉堆
Feb 03 Python
利用python将pdf输出为txt的实例讲解
Apr 23 Python
深入理解python中sort()与sorted()的区别
Aug 29 Python
python 解压pkl文件的方法
Oct 25 Python
使用python3实现操作串口详解
Jan 01 Python
python 判断矩阵中每行非零个数的方法
Jan 26 Python
Python实现12306火车票抢票系统
Jul 04 Python
TensorFlow实现打印每一层的输出
Jan 21 Python
python 绘制场景热力图的示例
Sep 23 Python
pytorch 运行一段时间后出现GPU OOM的问题
Jun 02 Python
Python必备技巧之字符数据操作详解
Mar 23 Python
Python实现HTTP协议下的文件下载方法总结
Apr 20 #Python
详解Python命令行解析工具Argparse
Apr 20 #Python
利用Python如何生成随机密码
Apr 20 #Python
Python自动化部署工具Fabric的简单上手指南
Apr 19 #Python
python实现简单socket通信的方法
Apr 19 #Python
python实现域名系统(DNS)正向查询的方法
Apr 19 #Python
python安装与使用redis的方法
Apr 19 #Python
You might like
php模拟asp中的XmlHttpRequest实现http请求的代码
2011/03/24 PHP
php语言流程控制中的主动与被动
2012/11/05 PHP
2个Codeigniter文件批量上传控制器写法例子
2014/07/25 PHP
Nginx服务器上安装并配置PHPMyAdmin的教程
2015/08/18 PHP
php上传大文件设置方法
2016/04/14 PHP
node.js中的fs.writeFile方法使用说明
2014/12/14 Javascript
jquery插件validation实现验证身份证号等
2015/06/04 Javascript
Jquery为DIV添加click事件的简单实例
2016/06/02 Javascript
vue过渡和animate.css结合使用详解
2017/06/14 Javascript
关于Vue.nextTick()的正确使用方法浅析
2017/08/25 Javascript
JS实现查找数组中对象的属性值是否存在示例
2019/05/24 Javascript
Node.JS枚举统计当前文件夹和子目录下所有代码文件行数
2019/08/23 Javascript
JavaScript判断数组类型的方法
2019/10/23 Javascript
vue点击页面空白处实现保存功能
2019/11/06 Javascript
JavaScript中如何对多维数组(矩阵)去重的实现
2019/12/04 Javascript
Node.js API详解之 console模块用法详解
2020/05/12 Javascript
javascript实现获取中文汉字拼音首字母
2020/05/19 Javascript
JavaScript实现网页计算器功能
2020/10/29 Javascript
使用Python的Tornado框架实现一个一对一聊天的程序
2015/04/25 Python
Python实现登录人人网并抓取新鲜事的方法
2015/05/11 Python
Python HTTP客户端自定义Cookie实现实例
2017/04/28 Python
python 实现一个反向单位矩阵示例
2019/11/29 Python
Python数据结构dict常用操作代码实例
2020/03/12 Python
美国生日蛋糕店:Bake Me A Wish!
2017/02/08 全球购物
英国和世界各地鲜花速递专家:Arena Flowers
2018/02/10 全球购物
Farnell德国:电子元器件供应商
2018/07/10 全球购物
体验完美剃须:The Art of Shaving
2018/08/06 全球购物
Ralph Lauren意大利官方网站:时尚界最负盛名的品牌之一
2018/10/18 全球购物
LivingSocial英国:英国本地优惠
2019/02/22 全球购物
英国国家美术馆商店:National Gallery
2019/05/01 全球购物
POP文化和音乐灵感的时尚:Hot Topic
2019/06/19 全球购物
企事业单位求职者的自我评价
2013/12/28 职场文书
开办大学饮食联盟创业计划书
2014/01/29 职场文书
会计系毕业求职信
2014/08/07 职场文书
2015年乡镇科普工作总结
2015/05/13 职场文书
关于CentOS 8 搭建MongoDB4.4分片集群的问题
2021/10/24 MongoDB