EventMachine 系列之简单的服务器

原创 2014年05月19日 22:17:30

EventMachine


本文主要是

  • EventMachine如何建一个简单的Echo服务器
  • post_init, unbind, receive_date 方法

EchoServer

如下代码,是建立一个简单的EchoServer

  1. #!/usr/bin/env ruby
  2. require 'rubygems'
  3. require 'eventmachine'
  4. class EchoServer < EM::Connection
  5. def post_init
  6. puts "client connection"
  7. end
  8. def unbind
  9. puts "client disconnection"
  10. end
  11. def receive_data(data)
  12. puts "received #{data} from client"
  13. send_data ">> #{data} from server"
  14. end
  15. end
  16. EM.run do
  17. EM.start_server '0.0.0.0', 9000, EchoServer
  18. puts "Server runnning on port 9000"
  19. 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 三个方法有点类似于

  1. begin
  2. post_init
  3. while(1)
  4. receive_date
  5. end
  6. ensure
  7. unbind
  8. end

可以使用如下命令测试

  1. telnet 0.0.0.0 9000

EchoClient

  1. #!/usr/bin/env ruby
  2. require 'rubygems'
  3. require 'eventmachine'
  4. class EchoClient < EM::Connection
  5. def initialize(user)
  6. @user = user
  7. end
  8. def post_init
  9. puts "connected"
  10. send_data "Hello from #{@user}"
  11. end
  12. def unbind
  13. puts "disconnected"
  14. end
  15. def receive_data(data)
  16. puts "received #{data}"
  17. close_connection
  18. EM.stop
  19. end
  20. end
  21. EM.run do
  22. EM.connect 'localhost', 9000, EchoClient, ARGV[0]
  23. end
  1. 使用EM.connect方法启动一个Client,并且接收一个参数
  2. EchoClient继承自Connection
  3. 上面的代码在接收一次数据后,会关闭连接 close_connection, 并且调用EM.stop停止EM

ruby eventmachine实践

ruby的EM库极其强大,包括了: 1. 定时器(周期性,yic
  • anghlq
  • anghlq
  • 2014年09月12日 20:05
  • 2023

hdu 2045 不容易系列之(3)―― LELE的RPG难题

是一道递推找规律的题,首先易知f(1)=3;f(2)=6;f(3)=6;f(4)=18; 现在考虑n>3的情况,若第n-1个格子和第一个格子不同,则为f(n-1); 若第n-1个格子和第1个格子相...
  • u013008291
  • u013008291
  • 2014年10月14日 22:07
  • 1164

Rails安装eventmachine提示出错的解决方法

github中的项目其中需要eventmachine包:gem 'eventmachine'但是直接bundle出错,提示找不到openssl/ssl.h头文件:make "DESTDIR=" com...
  • mydo
  • mydo
  • 2017年02月28日 10:52
  • 897

POSIX线程-Per-Thread Storage

说到per-thread storage,先要谈谈函数的线程安全thread-safety。通常我们把一个能被多个线程同时访问,且函数输出数据不会因为线程访问顺序的不同而不同的函数叫做线程安全的函数。...
  • huangyimo
  • huangyimo
  • 2015年07月04日 16:52
  • 328

一分钟写一个简单的安卓网络请求测试服务器

在真实的安卓开发过程中,有很多情况下需要自己写一个测试服务器来进行网络请求的测试,比如后台尚未开发完毕、后台崩溃或者公司断网的情况下。如果自己能写一个简单的测试服务器,这些外界的条件就不能影响的开发进...
  • li_huai_dong
  • li_huai_dong
  • 2017年04月29日 10:50
  • 530

Research on EventMachine

为什么我们需要EventMachine? 我们通常说的Ruby解释器里的Ruby线程是Green Thread:即程序里面的线程不会真正映射到操作系统的线程,而是由语言运行平台自身来调度,并且这...
  • resouer
  • resouer
  • 2012年09月25日 15:58
  • 11137

HDOJ 不容易系列之(3)—— LELE的RPG难题

问题及代码: /*不容易系列之(3)—— LELE的RPG难题 Problem Description 人称“AC女之杀手”的超级偶像LELE最近忽然玩起了深沉,这可急坏了众多“Cole”(LELE...
  • linan_141
  • linan_141
  • 2015年06月07日 10:16
  • 705

Eventmachine介绍

EventMachine提供了一个能实现Ruby程序通过网络与其他进程进行通讯的快速的、轻量级的框架。使用EventMachine,ruby程序 员可以非常容易的连接远程服务器或者作为自身开发服...
  • saint1126
  • saint1126
  • 2010年06月28日 11:00
  • 3029

从C++起步到MFC实战VC++软件工程师高端培训(服务器端开发方向)学习课程

从C++起步到MFC实战VC++软件工程师高端培训(服务器端开发方向)学习课程 主要内容: 本部分是您成为VC++软件工程师必备的阶段,如果您没有任何基础,学习C++能快速...
  • QQqun337372537
  • QQqun337372537
  • 2014年05月19日 17:48
  • 1723

数学之美系列完整版(最新全集列表)

数学之美系列完整版(最新全集列表)作者:吴军, Google 研究员 来源:Google黑板报 数学之美 一 统计语言模型 数学之美 二 谈谈中文分词 数学之美 三 隐含马尔可夫模型...
  • happylife1527
  • happylife1527
  • 2012年10月23日 09:15
  • 913
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:EventMachine 系列之简单的服务器
举报原因:
原因补充:

(最多只允许输入30个字)