Чтение онлайн

на главную - закладки

Жанры

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

Библиотека

Net::FTP
также не рассматривается. В общем случае автоматизировать обмен по протоколу FTP несложно и с помощью уже имеющихся клиентов, так что необходимость в этом классе возникает реже, чем в прочих.

Класс

Net::Protocol
, являющийся родительским для классов HTTP, POP3 и SMTP полезен скорее для разработки новых сетевых протоколов, но эта тема в данной книге не обсуждается.

На этом завершим краткий обзор и приступим к рассмотрению низкоуровневого сетевого программирования.

18.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

18.1.2. Реализация многопоточного сервера

Некоторые серверы должны обслуживать очень интенсивный поток запросов. В таком случае эффективнее обрабатывать каждый запрос в отдельном потоке.

Ниже показана реализация сервера текущего времени, с которым мы познакомились в предыдущем разделе. Он работает по протоколу TCP и создает новый поток для каждого запроса.

require "socket"

PORT = 12321

server = TCPServer.new(PORT)

while (session = server.accept)

 Thread.new(session) do |my_session|

my_session.puts Time.new

my_session.close

 end

end

Многопоточность позволяет достичь высокого параллелизма. Вызывать метод

join
не нужно, поскольку сервер исполняет бесконечный цикл, пока его не остановят вручную.

Код клиента, конечно, остался тем же самым. С точки зрения клиента, поведение сервера не изменилось (разве что он стал более надежным).

18.1.3. Пример: сервер для игры в шахматы по сети

Не всегда нашей конечной целью является взаимодействие с самим сервером. Иногда сервер — всего лишь средство для соединения клиентов друг с другом. В качестве примера можно привести файлообменные сети, столь популярные в 2001 году. Другой пример — серверы для мгновенной передачи сообщений, например ICQ, и разного рода игровые серверы.

Поделиться:
Популярные книги

Криптономикон, часть 2

Стивенсон Нил
Фантастика:
киберпанк
5.00
рейтинг книги
Криптономикон, часть 2

Попаданец на рыбалке. Книги 1-7

Скворцов Владимир Николаевич
Попаданец на рыбалке
Фантастика:
фэнтези
попаданцы
6.88
рейтинг книги
Попаданец на рыбалке. Книги 1-7

Юся и эльф

Демина Карина
Фантастика:
юмористическое фэнтези
детективная фантастика
6.25
рейтинг книги
Юся и эльф

Аврора Горелика (сборник)

Аксенов Василий Павлович
Поэзия:
драматургия
6.25
рейтинг книги
Аврора Горелика (сборник)

А.и Б. Стругацкие. Собрание сочинений в 10 томах. Т.10

Стругацкие Аркадий и Борис
10. Собраниния сочинений в 10 томах
Фантастика:
научная фантастика
6.71
рейтинг книги
А.и Б. Стругацкие. Собрание сочинений в 10 томах. Т.10

Алчность. Жажда магии

Post Mort
Фантастика:
фэнтези
5.00
рейтинг книги
Алчность. Жажда магии

Одиссея капитана Балка. Дилогия

Чернов Александр Викторович
Фантастика:
боевая фантастика
альтернативная история
5.25
рейтинг книги
Одиссея капитана Балка. Дилогия

Гримуар темного лорда VI

Грехов Тимофей
6. Гримуар темного лорда
Фантастика:
попаданцы
аниме
фэнтези
5.25
рейтинг книги
Гримуар темного лорда VI

Благие намерения

Лукина Любовь Александровна
Фантастика:
фэнтези
научная фантастика
7.50
рейтинг книги
Благие намерения

Отморозок 2

Поповский Андрей Владимирович
2. Отморозок
Фантастика:
попаданцы
5.50
рейтинг книги
Отморозок 2

Газлайтер. Том 29

Володин Григорий Григорьевич
29. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
6.40
рейтинг книги
Газлайтер. Том 29

Дарт Вейдер. Ученик Дарта Сидиуса

Jamique
Звездные войны
Фантастика:
социально-философская фантастика
космическая фантастика
6.00
рейтинг книги
Дарт Вейдер. Ученик Дарта Сидиуса

Призрак страсти

Эрскин Барбара
Любовные романы:
любовно-фантастические романы
8.60
рейтинг книги
Призрак страсти

Толковая Библия. Ветхий Завет. Книги пророческие.

Лопухин Александр Павлович
Религия и эзотерика:
религия
5.00
рейтинг книги
Толковая Библия. Ветхий Завет. Книги пророческие.