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实现各种排序算法的代码示例总结
Dec 11 Python
python 迭代器和iter()函数详解及实例
Mar 21 Python
详解 Python 读写XML文件的实例
Aug 02 Python
对python中return和print的一些理解
Aug 18 Python
利用Tkinter和matplotlib两种方式画饼状图的实例
Nov 06 Python
Python3读取Excel数据存入MySQL的方法
May 04 Python
对Python 语音识别框架详解
Dec 24 Python
详解numpy的argmax的具体使用
May 27 Python
Python中itertools的用法详解
Feb 07 Python
服务器端jupyter notebook映射到本地浏览器的操作
Apr 14 Python
python datetime处理时间小结
Apr 16 Python
Pytorch环境搭建与基本语法
Jun 03 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 命名空间实例说明
2011/01/27 PHP
回帖脱衣服的图片实现代码
2014/02/15 PHP
ThinkPHP单字母函数(快捷方法)使用总结
2014/07/23 PHP
php筛选不存在的图片资源
2015/04/28 PHP
Yii2框架redis基本应用示例
2018/07/13 PHP
Ext JS Grid在IE6 下宽度的问题解决方法
2009/02/15 Javascript
复制Input内容的js代码_支持所有浏览器,修正了Firefox3.5以上的问题
2010/06/21 Javascript
JavaScript 程序编码规范
2010/11/23 Javascript
JS实现表格数据各种搜索功能的方法
2015/03/03 Javascript
JavaScript更改字符串的大小写
2015/05/07 Javascript
jQuery实现带延时功能的水平多级菜单效果【附demo源码下载】
2016/09/21 Javascript
Bootstrap select实现下拉框多选效果
2016/12/23 Javascript
微信小程序开发之选项卡(窗口底部TabBar)页面切换
2017/04/12 Javascript
vue在使用ECharts时的异步更新和数据加载详解
2017/11/22 Javascript
vue弹窗组件的实现示例代码
2018/09/10 Javascript
vuex的使用和简易实现
2021/01/07 Vue.js
[49:11]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第二场 12.20
2020/12/23 DOTA
Python多进程分块读取超大文件的方法
2016/04/13 Python
使用python socket分发大文件的实现方法
2019/07/08 Python
Django 外键的使用方法详解
2019/07/19 Python
通过python检测字符串的字母
2020/02/18 Python
K最近邻算法(KNN)---sklearn+python实现方式
2020/02/24 Python
Django 允许局域网中的机器访问你的主机操作
2020/05/13 Python
HTML5学习笔记之History API
2015/02/26 HTML / CSS
香港个人化生活购物网站:Ballyhoo Limited
2016/09/10 全球购物
丝芙兰波兰:Sephora.pl
2018/03/25 全球购物
会计专业个人求职信范文
2014/01/08 职场文书
行政部工作岗位职责范本
2014/03/05 职场文书
社区矫正工作方案
2014/06/04 职场文书
2014年小学生迎国庆65周年演讲稿
2014/09/27 职场文书
机关作风建设心得体会
2014/10/22 职场文书
法院答辩状格式
2015/05/22 职场文书
2016年端午节校园广播稿
2015/12/18 职场文书
vue完美实现el-table列宽自适应
2021/05/08 Vue.js
使用@Value值注入及配置文件组件扫描
2021/07/09 Java/Android
警用民用对讲机找不同
2022/02/18 无线电