UnixSocket和UnixServer
Ruby提供了特殊的Unix套接字类,在底层你可以访问操作系统.
它可以让你实现客户端和服务器为面向连接和无连接协议的基本套接字支持。
核心:获取在线帮助UNIXSoket.methods (require socket)
=> [:pair, :socketpair, :select, :pipe, :open, :attr, :attr_reader, :attr_writer, :attr_accessor,
:new, :sysopen, :popen, :foreach, :read, :binread, :binwrite, :write, :readlines, :send, ]
使用Ruby完成UnixSocket的数据传输
1) Ruby 提供了UNIXSocket类的 new 方法来创建一个基础的Unix套接字。
使用代码:UNIXSocket.new("/var/run/mysql/mysql.sock") 创建一个不存在的 unix 套接字。
该类方法可以兼顾bind绑定文件能力,而且,文件的实际创建过程由bind功能完成。
2) Ruby 提供了UNIXSocket类的 open 方法来连接一个指定的Unix套接字。
使用代码:UNIXSocket.open("/var/run/mysql/mysql.sock") 连接一个已存在的 unix 套接字。
这类方法返回一个客户端套接字,数据发送将通过连接的套接字文件传递
3) Ruby 提供了UNIXSocket类的 send 方法来向这个的Unix套接字的发送数据
使用代码:UNIXSocket.send('message', flag) 发送数据到指定的unix套接字
4) Ruby 提供了UNIXSocket类的 recv 方法来接收来自这个的Unix套接字的数据
使用代码:UNIXSocket.recv(number) 接收来自指定unix套接字的数据
使用Ruby完成UnixServer的数据传输
a) Ruby 提供了UNIXServer类的 new 方法来创建一个基础的Unix套接字。
使用代码:UNIXServer.new("/var/run/mysql/mysql.sock") 创建一个服务端的 unix 套接字。
这个方法:封装了bind创建相关文件,并listen监听该文件的能力
b) Ruby 提供了UNIXServer类的 open 方法来连接一个存在的Unix套接字。
使用代码:UNIXServer.open("/var/run/mysql/mysql.sock") ,同上一个方法
c) Ruby 提供了UNIXServer类的 accept 方法来接受来自这个的Unix套接字的数据
使用代码:UNIXServer.accept() 无参数,接收来自客户的连接请求。
d) Ruby 提供了UNIXServer类的 close 方法来关闭这个的Unix套接字的连接
使用代码:UNIXServer.close() 关闭连接
代码实例(客户端):
require 'socket'
s = UNIXSocket.new("/tmp/sock")
s.send "hello", 0
UNIXServer.open("/tmp/sock") {|serv|
UNIXSocket.open("/tmp/sock") {|c|
s = serv.accept
s.puts "hi"
s.close
p c.read #=> "hi\n"
}
}
服务端代码:
require 'socket'
serv = UNIXServer.new("/tmp/sock")
begin # emulate blocking accept
sock = serv.accept_nonblock
rescue IO::WaitReadable, Errno::EINTR
IO.select([serv])
retry
end
# sock is an accepted socket.
require 'socket'
include Socket::Constants
socket = Socket.new( AF_INET, SOCK_STREAM, 0 )
sockaddr = Socket.pack_sockaddr_in( 2200, 'localhost' )
socket.bind( sockaddr )
socket.listen( 5 )