class Socket

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

Socket::Constants 下定义的常量也在 Socket 下定义。 例如,Socket::AF_INET 和 Socket::Constants::AF_INET 都可以使用。 请参阅 Socket::Constants 获取常量列表。

什么是套接字?

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

套接字有自己的词汇

域:协议族

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

协议:通常是 。 这可用于识别协议的变体。

主机名:网络接口的标识符

快速开始

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

让我们以类似于 C 的方式使用 IPv4 协议创建一个 internet 套接字

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.tcpTCPSocket.open

TCP 服务器套接字

Socket.tcp_server_loopTCPServer.open

UNIX 客户端套接字

Socket.unixUNIXSocket.open

UNIX 服务器套接字

Socket.unix_server_loopUNIXServer.open

文档作者

本文档中的许多材料经 The Pragmatic Bookshelf 许可取自 Programming Ruby