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

linux网络编程之posix 线程(一):线程模型、pthread 系列函数 和 简单多线程服务器端程序

一、posix 线程概述 我们知道,进程在各自独立的地址空间中运行,进程之间共享数据需要用进程间通信机制,有些情况需要在一个进程中同时执行多个控制流程,这时候线程就派上了用场,比如实现一个图形界面的下...

循序渐进做项目系列(1):最简单的C/S程序——让服务器来做加法

还在写“Hello world!”式的单机程序吗?还在各种拖控件吗?是否自己都觉得有点low呢?来个质的飞跃吧!看看怎么让服务器帮咱做加法!(本文是专门针对未接触过C/S开发的初学者而写的,C/S开发...

【深入浅出Node.js系列十】一个简单的静态文件合并服务器

1 需求 我们要开发的是一个简单的静态文件合并服务器,该服务器需要支持类似以下格式的JS或CSS文件合并请求。 http://assets.example.com/foo/??bar.js,b...

详解Node.js API系列 Http模块(1) 构造一个简单的静态页服务器

HTTP http api的文档翻译得太无聊了,很多用不上,例子太少,翻译到一半就觉得受不了,决定放弃,决定,用另外一种方式去介绍这部分的API。http模块,主要的应用是两部分,一部分是htt...

Linux TCP server系列(1)-简单TCP服务器+多进程处理客户请求

目标:   完成一个精简TCP服务器,可接收来自多个用户的请求,并返回结果。 思路:   (1)服务器       C++ TCP服务器的实现主要由以下几个函数来完成:         ...
  • wjs1033
  • wjs1033
  • 2014年05月06日 11:12
  • 759

[C# 网络编程系列]专题十二:实现一个简单的FTP服务器

引言: 休息一个国庆节后好久没有更新文章了,主要是刚开始休息完心态还没有调整过来的, 现在差不多进入状态了, 所以继续和大家分享下网络编程的知识,在本专题中将和大家分享如何自己实现一个简单的FT...

使用C#开发HTTP服务器系列之更简单的实现方式

各位朋友大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是http://qinyuanpei.com。到目前为止,我已经发布了3篇HTTP服务器开发的系列文章。对我个人而言,我非常享受这个从无到...

基于TCP/UDP的Socket网络通信系列之客户端与服务器的简单对话(三)

TCP协议是面向连接的可靠的有序的以字节流的方式发送数据 基于TCP协议实现网络通信的类主要有两个 客户端的Socket类 服务器端的ServerSocket类 一、Socket通信原理纯属个人理解...
  • Tomasyb
  • Tomasyb
  • 2017年06月16日 09:19
  • 406

java通信系列之一by_书訢:通信基础和简单服务器客户端创建

引子: 感谢阅读 这一篇博客是我们整个JAVA通信的实操第一篇,希望大家多多支持项目下载地址在文章末尾,如果出现了问题请留言~~ 希望作为读者的你们可以多多关注我的作品,并留言或者加我qq一起学...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:EventMachine 系列之简单的服务器
举报原因:
原因补充:

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