Ruby Socket 编程

  Ruby提供了两个级别访问网络的服务,在底层你可以访问操作系统,它可以让你实现客户端和服务器为面向连接和无连接协议的基本套接字支持。

  Ruby 统一支持应用程的网络协议,如FTP、HTTP等。

  不管是高层的还是底层的。ruby提供了一些基本类,让你可以使用TCP,UDP,SOCKS等很多协议交互,而不必拘泥在网络层。这些类也提供了辅助类,让你可以轻松的对服务器进行读写。

  接下来就让我们来学习如何进行 Ruby Socket 编程

  什么是 Sockets

  应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要 通过同一个TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字 (Socket)的接口,区分不同应用程序进程间的网络通信和连接。

  生成套接字,主要有3个参数:通信的目的IP地址、使用的传输 层协议(TCP或UDP)和使用的端口号。Socket原意是"插座"。通过将这3个参数结合起来,与一个"插座"Socket绑定,应用层就可以和传输 层通过套接字接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

  Sockets 词汇解析:

  选项描述

  domain指明所使用的协议族,通常为 PF_INET, PF_UNIX, PF_X25, 等等。

  type指定socket的类型:SOCK_STREAM 或SOCK_DGRAM,Socket接口还定义了原始Socket(SOCK_RAW),允许程序使用低层协议

  protocol通常赋值0。

  hostname网络接口的标识符:

  字符串, 可以是主机名或IP地址

  字符串 "", 指定 INADDR_BROADCAST 地址。

  0 长度的字符串, 指定INADDR_ANY

  一个整数,解释为主机字节顺序的二进制地址。

  portport是端口的编号,每个服务器都会监听客户端连接的一个或多个端口号,一个端口号可以是 Fixnum 的端口号, 包含了服务器名和端口。

  简单的客户端

  以下我们通过给定的主机和端口编写了一个简单的客户端实例,Ruby TCPSocket 类提供了 open 方法来打开一个 socke。

  TCPSocket.open(hosname, port ) 打开一个 TCP 连接。

  一旦你打开一个 Socket 连接,你可以像 IO 对象一样读取它,完成后,你需要像关闭文件一样关闭该连接。

  以下实例演示了如何连接到一个指定的主机,并从 socket 中读取数据,最后关闭socket:

  require 'socket' # Sockets 是标准库

  hostname = 'localhost'

  port = 2000

  s = TCPSocket.open(hostname, port)

  while line = s.gets # 从 socket 中读取每行数据

  puts line.chop # 打印到终端

  end

  s.close # 关闭 socket

  简单的服务

  Ruby 中可以使用 TCPServer 类来写个简单的服务。TCPServer 对象是 TCPSocket 的工厂对象。

  现在我们使用 TCPServer.open(hostname, port) 来创建一个 TCPServer 对象。

  接下来调用 TCPServer 的 accept 方法,该方法会等到一个客户端连接到指定的端口,然后返回一个的TCPSocket对象,表示连接到该客户端。

  require 'socket' # 获取socket标准库

  server = TCPServer.open(2000) # Socket 监听端口为 2000

  loop { # 永久运行服务

  client = server.accept # 等待客户端连接

  client.puts(Time.now.ctime) # 发送时间到客户端

  client.puts "Closing the connection. Bye!"

  client.close # 关闭客户端连接

  }

  现在,在服务器上运行以上代码,查看效果。

  多客户端TCP服务

  互联网上,大多服务都有大量的客户端连接。

  Ruby的Thread类可以很容易地创建多线程服务,一个线程执行客户端的连接,而主线程在等待更多的连接。

  require 'socket' # 获取socket标准库

  server = TCPServer.open(2000) # Socket 监听端口为 2000

  loop { # 永久运行服务

  Thread.start(server.accept) do |client|

  client.puts(Time.now.ctime) # 发送时间到客户端

  client.puts "Closing the connection. Bye!"

  client.close # 关闭客户端连接

  end

  }

  在这个例子中,socket永久运行,而当server.accept接收到客户端的连接时,一个新的线程被创建并立即开始处理请求。而主程序立即循环回,并等待新的连接。

  微小的Web浏览器

  我们可以使用socket库来实现任何的 Internet 协议。以下代码展示了如何获取网页的内容:

  require 'socket'

  host = 'www.w3cschool.cc' # web服务器

  port = 80 # 默认 HTTP 端口

  path = "/index.htm" # 想要获取的文件地址

  # 这是个 HTTP 请求

  request = "GET #{path} HTTP/1.0\r\n\r\n"

  socket = TCPSocket.open(host,port) # 连接服务器

  socket.print(request) # 发送请求

  response = socket.read # 读取完整的响应

  # Split response at first blank line into headers and body

  headers,body = response.split("\r\n\r\n", 2)

  print body # 输出结果

  要实现一个类似 web 的客户端,你可以使用为 HTTP 预先构建的库如Net::HTTP。

  以下代码与先前代码是等效的:

  require 'net/http' # 我们需要的库

  host = 'www.w3cschool.cc' # web 服务器

  path = '/index.htm' # 我们想要的文件

  http = Net::HTTP.new(host) # 创建连接

  headers, body = http.get(path) # 请求文件

  if headers.code == "200" # 检测状态码

  print body

  else

  puts "#{headers.code} #{headers.message}"

  end

  (编辑:雷林鹏 来源:网络)

雷林鹏分享:Ruby Socket 编程的更多相关文章

  1. 雷林鹏分享:Ruby 循环

    Ruby 循环 Ruby 中的循环用于执行相同的代码块若干次.本章节将详细介绍 Ruby 支持的所有循环语句. Ruby while 语句 语法 while conditional [do] code ...

  2. 雷林鹏分享:Ruby CGI 编程

    Ruby CGI 编程 Ruby 是一门通用的语言,不仅仅是一门应用于WEB开发的语言,但 Ruby 在WEB应用及WEB工具中的开发是最常见的. 使用Ruby您不仅可以编写自己的SMTP服务器,FT ...

  3. 雷林鹏分享:Ruby 类和对象

    Ruby 类和对象 Ruby 是一种完美的面向对象编程语言.面向对象编程语言的特性包括: 数据封装 数据抽象 多态性 继承 这些特性将在 面向对象的 Ruby 中进行讨论. 一个面向对象的程序,涉及到 ...

  4. 雷林鹏分享:Ruby 文件的输入与输出

    Ruby 文件的输入与输出 Ruby 提供了一整套 I/O 相关的方法,在内核(Kernel)模块中实现.所有的 I/O 方法派生自 IO 类. 类 IO 提供了所有基础的方法,比如 read. wr ...

  5. 雷林鹏分享:Ruby File 类和方法

    Ruby File 类和方法 File 表示一个连接到普通文件的 stdio 对象.open 为普通文件返回该类的一个实例. 类方法 序号方法 & 描述 1File::atime( path) ...

  6. 雷林鹏分享:Ruby 面向对象

    Ruby 面向对象 Ruby 是纯面向对象的语言,Ruby 中的一切都是以对象的形式出现.Ruby 中的每个值都是一个对象,即使是最原始的东西:字符串.数字,甚至连 true 和 false 都是对象 ...

  7. 雷林鹏分享:Ruby 数据库访问 - DBI 教程

    Ruby 数据库访问 - DBI 教程 本章节将向您讲解如何使用 Ruby 访问数据库.Ruby DBI 模块为 Ruby 脚本提供了类似于 Perl DBI 模块的独立于数据库的接口. DBI 即 ...

  8. 雷林鹏分享:Ruby 安装 - Windows

    Ruby 安装 - Windows 下面列出了在 Windows 机器上安装 Ruby 的步骤. 注意:在安装时,您可能有不同的可用版本. 下载最新版的 Ruby 压缩文件.请点击这里下载. 下载 R ...

  9. 雷林鹏分享:Ruby 安装 - Unix

    Ruby 安装 - Unix 下面列出了在 Unix 机器上安装 Ruby 的步骤. 注意:在安装之前,请确保您有 root 权限. 下载最新版的 Ruby 压缩文件.请点击这里下载. 下载 Ruby ...

随机推荐

  1. 焦作网络赛B-Mathematical Curse【dp】

    A prince of the Science Continent was imprisoned in a castle because of his contempt for mathematics ...

  2. VirtualBox Guest Additions installation

    在使用VirtualBox为CentOS安装增强功能时,输出是: 文本: Verifying archive integrity... All good. Uncompressing VirtualB ...

  3. Spongebob and Squares---cf599D(数学公式1 + (1+2) + (1+2+3) +....)

    题目链接:http://codeforces.com/contest/599/problem/D 一个3×5(m×n)的长方形,里面包含15个边长为1的正方形,有8个边长为2的正方形,有3个边长为3的 ...

  4. 设置XShell快捷键 复制粘贴 并禁用智能选择

    设置XShell快捷键 复制粘贴 并禁用智能选择 1打开选项 2键盘和鼠标->打开编辑 3新建 组合键 Ctrl+C 类型:菜单 ->操作 [编辑]复制  [编辑]粘贴 4选中 ctrl+ ...

  5. 通过生成器yield实现单线程的情况下实现并发运算效果(异步IO的雏形)

    一.协程: 1.生成器只有在调用时才会生成相应的数据 2.调用方式有 " str__next__.()   str.send() ", 3.并且每调用一次就产生一个值调用到最后一个 ...

  6. rewrite or internal redirection cycle while processing "/index.php/index.php/index.php/index.php/index.php/index.php/index.php/index.php/index.php/index.php/index.php/jenkins/

    折腾了很久,跟nginx配置没有关系.最终是把php版本从7.1降到5.6才解决的,是跟tp3.2匹配的

  7. grub的安装与配置-------引导redhat grub

    1.安装 有两种方法: a.在联网的情况下,用新立德安装: apt-get install grub b.在没网的时候,特别是linux网卡驱动没有安装: 自己从http://packages.ubu ...

  8. Django组件拾忆

    知识预览 一 Django的form组件 二 Django的model form组件 三 Django的缓存机制 四 Django的信号 五 Django的序列化 回到顶部 一 Django的form ...

  9. rest-framework框架的基本组件

    快速实例 Quickstart 大致步骤 (1)创建表,数据迁移 (2)创建表序列化类BookSerializer class BookSerializer(serializers.Hyperlink ...

  10. Django组件补充(缓存,信号,序列化)

    Django组件补充(缓存,信号,序列化) Django的缓存机制 1.1 缓存介绍 1.缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑 ...