TcpSocket和TcpServer
Ruby提供了两个级别访问网络的服务,在底层允许你访问操作系统.
它可以让你实现客户端和服务器为面向连接和无连接协议的基本套接字支持。
ruby提供了一些基本类,包括TCPSocket,UDPSocket,UNIXSocket等很多协议基类;
使用这些基本类,可以完成多种协议交互,而不必拘泥在网络层。
多个TCP连接或多个应用程序进程可能需要,通过同一个TCP协议端口传输数据。
这些类也提供了辅助类,让你可以轻松的对服务器进行读写
应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题
生成套接字,主要有3个参数:通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口号
socket是"插座"。通过将这3个参数结合起来,与一个"插座"Socket绑定,应用层就可以和传输层
使用套接字接口,来区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。
核心:获取在线帮助TCPSoket.methods (require socket)
=> [:gethostbyname, :getaddress, :attr, :attr_reader, :attr_writer, :attr_accessor, :select,
:new, :open, :sysopen, :popen, :pipe :foreach, :binread, :binwrite, :read, :write, :readlines, :send,]
使用Ruby来完成TCP数据传输
Ruby提供了TCPSocket类的 new 方法来创建一个基础的TCP套接字
==> 你可以像操作IO对象一样操作它;
- 使用代码:TCPSocket.new(hosname, port) 创建一个TCP对象
- 这个方法封装了bind()和connect()地址的能力
- 连接并操作完成后,你需要像关闭文件一样关闭该连接。(这个类只能用于TCP客户端编写)
以下实例演示了如何连接到一个指定的主机,并从 socket 中读取数据,最后关闭socket:
require 'socket' # 获取socket标准库
hostname = 'localhost'
port = 2000
s = TCPSocket.new(hostname, port) #这会发起一次TCP syn三次握手的连接申请
while line = s.gets # 从 socket 中读取每行数据
puts line.chop # 打印到终端
end
s.close # 关闭 socket
Ruby 提供了TCPServer类的 new 方法创建一个基础的TCP服务套接字
==> 你可以像操作IO对象一样操作它;
- 使用代码:TCPServer.new(hostname, port) 来创建一个TCPServer对象
- 这个方法封装了bind()和listen()监听的能力
- 接下来调用 TCPServer 的 accept 方法等待一个客户端连接到指定的端口
- 然后返回一个的已建立连接的TCPServer对象
- 之后的操作都按照IO文件操作那样发送和接收数据。(这个类只能用于TCP服务端编写)
它们的关系是:TCPServer对象是 TCPSocket 的工厂对象。
require 'socket' # 获取socket标准库
server = TCPServer.new('localhost', 2000) # Socket 监听端口为 2000
loop { # 永久运行服务
client = server.accept # 等待客户端连接
client.puts(Time.now.ctime) # 发送时间到客户端
client.puts "Closing the connection. Bye!"
client.close # 关闭客户端连接
}
Ruby 提供了Thread类实现多线程的方法,完成多个服务器连接数并发
达到一个线程执行客户端的连接,而主线程在等待更多的连接 的效果
require 'socket' # 获取socket标准库
server = TCPServer.open('localhost',2000) # Socket 监听端口为 2000
loop { # 永久运行服务
Thread.start(server.accept) do |client|
client.puts(Time.now.ctime) # 发送时间到客户端
client.puts "Closing the connection. Bye!"
client.close # 关闭客户端连接
end
}