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动态监控日志内容的示例
Feb 16 Python
Python中使用PIL库实现图片高斯模糊实例
Feb 08 Python
Python中用Spark模块的使用教程
Apr 13 Python
Python实现股市信息下载的方法
Jun 15 Python
Pthon批量处理将pdb文件生成dssp文件
Jun 21 Python
Python脚本实时处理log文件的方法
Nov 21 Python
Python的SimpleHTTPServer模块用处及使用方法简介
Jan 22 Python
Numpy之random函数使用学习
Jan 29 Python
Python 动态导入对象,importlib.import_module()的使用方法
Aug 28 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
Sep 20 Python
Django多进程滚动日志问题解决方案
Dec 17 Python
Python3爬虫带上cookie的实例代码
Jul 28 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关联数组的10个操作技巧
2013/01/21 PHP
php生成缩略图填充白边(等比缩略图方案)
2013/12/25 PHP
PHP生成树的方法
2015/07/28 PHP
php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)
2016/11/28 PHP
借用Google的Javascript API Loader来加速你的网站
2009/01/28 Javascript
纯JavaScript实现的完美渐变弹出层效果代码
2010/04/02 Javascript
JQuery 学习技巧总结
2010/05/21 Javascript
随窗体滑动的小插件sticky源码
2013/06/21 Javascript
js实现单击图片放大图片的方法
2015/02/17 Javascript
JS实现控制表格行内容垂直对齐的方法
2015/03/30 Javascript
JQuery fileupload插件实现文件上传功能
2016/03/18 Javascript
jquery ajax后台返回list,前台用jquery遍历list的实现
2016/10/30 Javascript
JS获取鼠标位置距浏览器窗口距离的方法示例
2017/04/11 Javascript
nodejs连接mysql数据库及基本知识点详解
2018/03/20 NodeJs
JS实现用特殊符号替换字符串的中间部分区域的实例代码
2018/07/24 Javascript
微信小程序实现多选功能
2018/11/04 Javascript
详解基于Vue,Nginx的前后端不分离部署教程
2018/12/04 Javascript
JavaScript链式调用实例浅析
2018/12/19 Javascript
vue项目配置同一局域网可使用ip访问的操作
2020/10/23 Javascript
[03:46]显微镜下的DOTA2第七期——满血与残血
2014/06/20 DOTA
Tornado服务器中绑定域名、虚拟主机的方法
2014/08/22 Python
Python实现使用卷积提取图片轮廓功能示例
2018/05/12 Python
Python双向循环链表实现方法分析
2018/07/30 Python
python设定并获取socket超时时间的方法
2019/01/12 Python
python从入门到精通 windows安装python图文教程
2019/05/18 Python
Python绘制股票移动均线的实例
2019/08/24 Python
python实现画循环圆
2019/11/23 Python
基于tensorflow for循环 while循环案例
2020/06/30 Python
css3实现信纸/同学录效果的示例代码
2018/12/11 HTML / CSS
HTML5 canvas基本绘图之绘制矩形
2016/06/27 HTML / CSS
杭州-飞时达软件有限公司.net笔面试
2012/04/28 面试题
电气自动化自荐信
2013/10/10 职场文书
大学生党员自我批评
2014/02/14 职场文书
大学生作弊检讨书
2014/09/11 职场文书
清洁工个人工作总结
2015/03/05 职场文书
幼儿园老师新年寄语
2015/08/17 职场文书