class Socket

Class Socket 提供了对底层操作系统套接字实现的访问。与特定协议的套接字类相比,它可用于提供更多操作系统特定的功能。

Socket::Constants 下定义的常量也定义在 Socket 下。例如,Socket::AF_INET 可用,Socket::Constants::AF_INET 也是如此。有关常量列表,请参阅 Socket::Constants

什么是套接字?

套接字是双向通信通道的端点。套接字可以在同一进程内、同一台机器上的进程之间或不同机器之间进行通信。套接字有许多类型:例如 TCPSocketUDPSocketUNIXSocket

套接字有自己的词汇

domain: 协议族

type: 两个端点之间的通信类型,通常是

protocol: 通常为。这可用于标识协议的变体。

hostname: 网络接口的标识符

快速入门

许多类,如 TCPSocketUDPSocketUNIXSocket,与等效的 C 编程接口相比,简化了套接字的使用。

让我们以类 C 的方式创建一个使用 IPv4 协议的互联网套接字

require 'socket'

s = Socket.new Socket::AF_INET, Socket::SOCK_STREAM
s.connect Socket.pack_sockaddr_in(80, 'example.com')

您也可以使用 TCPSocket

s = TCPSocket.new 'example.com', 80

一个简单的服务器可能看起来像这样

require 'socket'

server = TCPServer.new 2000 # Server bound to port 2000

loop do
  client = server.accept    # Wait for a client to connect
  client.puts "Hello !"
  client.puts "Time is #{Time.now}"
  client.close
end

一个简单的客户端可能看起来像这样

require 'socket'

s = TCPSocket.new 'localhost', 2000

while line = s.gets # Read lines from socket
  puts line         # and print them
end

s.close             # close socket when done

Exception 处理

Ruby 的 Socket 实现根据系统依赖的实现生成的错误引发异常。这就是为什么文档以区分 Unix 系统异常和 Windows 系统异常的方式编写方法的原因。如果需要有关特定异常的更多信息,请参阅 Unix 手册页或 Windows WinSock 参考。

便捷方法

虽然创建套接字的一般方法是 Socket.new,但对于大多数情况,有几种套接字创建方法。

TCP 客户端套接字

Socket.tcp, TCPSocket.open

TCP 服务器套接字

Socket.tcp_server_loop, TCPServer.open

UNIX 客户端套接字

Socket.unix, UNIXSocket.open

UNIX 服务器套接字

Socket.unix_server_loop, UNIXServer.open

文档作者

本手册中的大部分内容经允许摘自 The Pragmatic Bookshelf 的《Programming Ruby》