Latest web development tutorials

Рубин Socket программирования

Рубин обеспечивает два уровня доступа к сетевым услугам, вы можете получить доступ к базовой операционной системы, что позволяет добиться поддержки клиента и сервера для ориентированных на соединение и протоколов без установления соединения основным сокета.

Рубин единые сетевые протоколы поддержки приложений, таких как FTP, HTTP и тому подобное.

Будь сверху или снизу. рубин предоставляет некоторые базовые классы, так что вы можете использовать интерактивный TCP, UDP, SOCKS и многие другие протоколы, без формальностью на сетевом уровне. Эти классы также обеспечивают дополнительные занятия, так что вы можете легко читать и писать на сервер.

Далее, давайте узнать, как Руби Socket программирования


Какие Sockets

Когда уровень приложений передачи данных через транспортный уровень, TCP и UDP опыт во время предоставления услуг для нескольких одновременных проблем прикладного процесса. Несколько соединений TCP или несколько приложений через тот же процесс может потребовать порт протокола TCP для передачи данных. Для того, чтобы различать между различными прикладными процессами, а также соединений, многие компьютерные операционные системы взаимодействуют с приложениями TCP / IP протокола и обеспечивает интерфейс, который называется сокет (Socket), различие между сетевой коммуникации и связи между различными прикладными процессами для.

Сформировать гнездо, есть три основных параметра: IP-адрес назначения трафика, протокол транспортного уровня (TCP или UDP), используемый и номер порта. Разъем предназначен для "гнездо". Комбинируя эти три параметра, и "гнездо" Гнездо привязки, прикладной уровень и транспортный уровень может быть через интерфейс сокетов, различие между процессами связи из различных приложений или сетевых соединений, сопутствующих услуг по передаче данных.

Анализ Sockets лексики:

опции описание
домен Указано семейство протокол используется, как правило, PF_INET, PF_UNIX, PF_X25, и так далее.
тип Укажите тип сокета: SOCK_STREAM или SOCK_DGRAM, интерфейс Разъем также определяет сокеты (SOCK_RAW), программа позволяет использовать протокол низкого уровня
протокол Обычно присваивается 0.
имя хоста Идентификатор сетевого интерфейса:
  • Строка может быть имя хоста или IP-адрес
  • Строка "<РАССЫЛКА>", указать адрес INADDR_BROADCAST.
  • Строка нулевой длины, которая определяет INADDR_ANY
  • Целое число интерпретируется как хост порядком байтов двоичного адреса.
порт порт номер порта, и каждый сервер будет прослушивать один или несколько номеров портов для клиентских подключений, номер порта может быть Fixnum номер порта, который содержит имя сервера и порт.

Простой клиент

Ниже мы через данный хост и порт, чтобы написать простой экземпляр клиента, Ruby TcpSocket открытый класс предоставляет способ открыть Socke.

TCPSocket.open (hosname, порт), чтобы открыть соединение TCP.

После того, как вы откроете сокет-соединение, вы можете прочитать как объект IO, как он будет завершен, необходимо закрыть файл как можно ближе к соединению.

В следующем примере показано, как подключиться к определенному компьютеру, а также считывать данные из гнезда, и, наконец, закрыть сокет:

require 'socket'      # Sockets 是标准库

hostname = 'localhost'
port = 2000

s = TCPSocket.open(hostname, port)

while line = s.gets   # 从 socket 中读取每行数据
  puts line.chop      # 打印到终端
end
s.close               # 关闭 socket 

Простое обслуживание

Рубин можно использовать класс TCPServer написать простую услугу. TCPServer объекты TcpSocket объектом фабрики.

Теперь мы используем TCPServer.open (имя хоста, порт) для создания объекта TCPServer.

Следующий вызов TCPServer принимает метод ожидает, пока клиент не подключается к указанному порту, и возвращает один объект 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                 # 关闭客户端连接
}

Теперь, приведенный выше код выполняется на сервере, просматривать результаты.


Multi-клиент службы TCP

В Интернете, большинство услуг имеют большое количество клиентских подключений.

класс резьбы в Ruby можно легко создавать многопоточные, поток выполнения для клиентских подключений, а основной поток ожидает большего числа соединений.

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
}

В этом примере, сокет работать вечно, и когда server.accept прием клиента для подключения к, новый поток создается и сразу же начать обработку запроса. И теперь основной программный цикл обратно и ждать нового соединения.


Крошечные веб-браузер

Мы можем использовать библиотеку сокетов для реализации любого Интернет-протокола. Следующий код показывает, как получить содержимое страницы:

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                          # 输出结果

Для того, чтобы достичь такого же веб-клиента, вы можете использовать предварительно встроенные библиотеки 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 и методы класса Оправа