使用 eventmachine 实现一个简单的服务端

2014/12/12 posted in  Ruby学习 comments

一个简单的 HTTP Server 例子

require 'eventmachine'
require 'em-http-server'

class HTTPHandler < EM::HttpServer::Server
  # 请求从这里开始执行
  def process_http_request
    @http # 包含所有 http headers 的 hash
    @http_content # http body

    # 构造 http response
    response = EventMachine::DelegatedHttpResponse.new(self)
    response.status = 200
    response.content = 'hello, world!'
    response.send_response
  end

  # 请求发生异常时的回调方法
  def http_request_errback e
    puts "#{e.backtrace.shift}: #{e.message} (#{e.class})"
    puts e.backtrace.map{|line| "\tfrom #{line}"}
  end
end

EM.run do
  # hit Control + C to stop
  Signal.trap("INT")  { EventMachine.stop }
  Signal.trap("TERM") { EventMachine.stop }

  EM.start_server 'localhost', 10000, HTTPHandler
end

请求解析错误时,自定义错误返回信息

HTTPHandler 中实现 http_error_string 方法,返回值就是返回信息。

与 EventMachine 的关系

EM::HttpServer::Server < EM::P::HeaderAndContentProtocol < EM::Connection