Рубин 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. |
имя хоста | Идентификатор сетевого интерфейса:
|
порт | порт номер порта, и каждый сервер будет прослушивать один или несколько номеров портов для клиентских подключений, номер порта может быть 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 и методы класса Оправа