EventMachine
本文主要是
如下代码,是建立一个简单的EchoServer
#!/usr/bin/env ruby
require 'rubygems'
require 'eventmachine'
class EchoServer < EM::Connection
def post_init
puts "client connection"
end
def unbind
puts "client disconnection"
end
def receive_data(data)
puts "received #{data} from client"
send_data ">> #{data} from server"
end
end
EM.run do
EM.start_server '0.0.0.0', 9000, EchoServer
puts "Server runnning on port 9000"
end
分析
1. 所有的代码都运行在EM.run 中
2. EM.run不能运行阻塞的代码,比如HTTP::Get 等,也不能运行 do while 等代码段
3. 使用 start_server(ip,port, ServerName) 开启一个Server
4. Server继承自 Connection
5. post_init: connect 建立马上就会访问的方法
6. unbind: 失去connection后会访问的方法
7. receive_data: 客户端每次访问向服务器发送数据的时候,都会访问的方法。主要用于接收来自客户端得大数据,比如超过100M的文件上传或者其他,类似于nginx中的chunk功能.
post_init, unbind, receive_date 三个方法有点类似于
begin
post_init
while(1)
receive_date
end
ensure
unbind
end
可以使用如下命令测试
telnet 0.0.0.0 9000
#!/usr/bin/env ruby
require 'rubygems'
require 'eventmachine'
class EchoClient < EM::Connection
def initialize(user)
@user = user
end
def post_init
puts "connected"
send_data "Hello from #{@user}"
end
def unbind
puts "disconnected"
end
def receive_data(data)
puts "received #{data}"
close_connection
EM.stop
end
end
EM.run do
EM.connect 'localhost', 9000, EchoClient, ARGV[0]
end
close_connection
, 并且调用EM.stop
停止EM