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 实现红包随机生成算法的简单实例
Jan 04 Python
Python 实现字符串中指定位置插入一个字符
May 02 Python
pip install urllib2不能安装的解决方法
Jun 12 Python
python实现事件驱动
Nov 21 Python
Python实现京东秒杀功能代码
May 16 Python
将自己的数据集制作成TFRecord格式教程
Feb 17 Python
new_zeros() pytorch版本的转换方式
Feb 18 Python
Django+boostrap 美化admin后台的操作
Mar 11 Python
Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现
Apr 22 Python
python 实现学生信息管理系统的示例
Nov 28 Python
Python 实现一个简单的web服务器
Jan 03 Python
python数字转对应中文的方法总结
Aug 02 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
ionCube 一款类似zend的PHP加密/解密工具
2010/07/25 PHP
sae使用smarty模板的方法
2013/12/17 PHP
PHP速成大法
2015/01/30 PHP
Yii2 输出xml格式数据的方法
2016/05/03 PHP
再谈IE中Flash控件的自动激活 ObjectWrap
2007/03/09 Javascript
js中获取事件对象的方法小结
2011/03/13 Javascript
也说JavaScript中String类的replace函数
2011/09/22 Javascript
关于jquery ajax 调用带参数的webservice返回XML数据一个小细节
2012/07/31 Javascript
html a标签-超链接中confirm方法使用介绍
2013/01/04 Javascript
使用jQuery UI的tooltip函数修饰title属性的气泡悬浮框
2013/06/24 Javascript
LABjs、RequireJS、SeaJS的区别
2014/03/04 Javascript
jQuery页面加载初始化常用的三种方法
2014/06/04 Javascript
Jquery中CSS选择器用法分析
2015/02/10 Javascript
JQuery实现动态操作表格
2017/01/11 Javascript
vue分类筛选filter方法简单实例
2017/03/30 Javascript
微信小程序block的使用教程
2018/04/01 Javascript
浅谈vue项目可以从哪些方面进行优化
2018/05/05 Javascript
基于node搭建服务器,写接口,调接口,跨域的实例
2018/05/13 Javascript
详解从NodeJS搭建中间层再谈前后端分离
2018/11/13 NodeJs
JS实现随机抽选获奖者
2019/11/07 Javascript
js实现上传图片并显示图片名称
2019/12/18 Javascript
python集合类型用法分析
2015/04/08 Python
python爬取个性签名的方法
2018/06/17 Python
python实现诗歌游戏(类继承)
2019/02/26 Python
Python+Tensorflow+CNN实现车牌识别的示例代码
2019/10/11 Python
python爬虫开发之urllib模块详细使用方法与实例全解
2020/03/09 Python
利用python在excel中画图的实现方法
2020/03/17 Python
浅谈Keras中shuffle和validation_split的顺序
2020/06/19 Python
python破解同事的压缩包密码
2020/10/14 Python
总经理助理岗位职责
2013/11/08 职场文书
2014党员批评和自我批评思想汇报
2014/09/21 职场文书
离婚承诺书格式范文
2015/05/04 职场文书
爱国主义电影观后感
2015/06/18 职场文书
小学生组织委员竞选稿
2015/11/21 职场文书
python​格式化字符串
2022/04/20 Python
速龙x4-860k处理器相当于i几
2022/04/20 数码科技