Книга: Программирование на языке Ruby

18.1.1. Простой сервер: время дня

18.1.1. Простой сервер: время дня

Рассмотрим самый простой сервер, который вы только способны представить. Пусть некоторая машина располагает такими точными часами, что ее можно использовать в качестве стандарта времени. Такие серверы, конечно, существуют, но взаимодействуют не по тому тривиальному протоколу, который мы обсудим ниже. (В разделе 18.2.2 приведен пример обращения к подобному серверу по протоколу telnet.)

В нашем примере все запросы обслуживаются в порядке поступления однопоточным сервером. Когда приходит запрос от клиента, мы возвращаем строку, содержащую текущее время. Ниже приведен код сервера:

require "socket"
PORT = 12321
HOST = ARGV[0] || 'localhost'
server = UDPSocket.open # Применяется протокол UDP...
server.bind nil, PORT
loop do
 text, sender = server.recvfrom(1)
 server.send(Time.new.to_s + "n", 0, sender[3], sender[1])
end

А это код клиента:

require "socket"
require "timeout"
PORT = 12321
HOST = ARGV[0] || 'localhost'
socket = UDPSocket.new
socket.connect(HOST, PORT)
socket.send("", 0)
timeout(10) do
 time = socket.gets
 puts time
end

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

В следующем примере такой же сервер реализован на базе протокола TCP. Он прослушивает порт 12321; запросы к этому порту можно посылать с помощью программы telnet (или клиента, код которого приведен ниже).

require "socket"
PORT = 12321
server = TCPServer.new(PORT)
while (session = server.accept)
 session.puts Time.new
 session.close
end

Обратите внимание, как просто использовать класс TCPServer. Вот TCP-версия клиента:

require "socket"
PORT = 12321
HOST = ARGV[0] || "localhost"
session = TCPSocket.new(HOST, PORT)
time = session.gets
session.close
puts time

Оглавление книги


Генерация: 1.202. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз