Программирование на языке Ruby
Шрифт:
Библиотека
Класс
На этом завершим краткий обзор и приступим к рассмотрению низкоуровневого сетевого программирования.
18.1. Сетевые серверы
Жизнь
Не исключено, что для формирования ответа требуется серьезная обработка, например обращение к базе данных, но с точки зрения сетевого взаимодействия сервер просто принимает запросы и отправляет ответы.
Но даже это можно организовать разными способами. Сервер может в каждый момент времени обслуживать только один запрос или иметь несколько потоков. Первый подход проще реализовать, зато у второго есть преимущества, когда много клиентов одновременно обращается с запросами.
Можно представить себе сервер, единственное назначение которого состоит в том, чтобы облегчить общение между клиентами. Классические примеры — чат-серверы, игровые серверы и файлообменные сети.
18.1.1. Простой сервер: время дня
Рассмотрим самый простой сервер, который вы только способны представить. Пусть некоторая машина располагает такими точными часами, что ее можно использовать в качестве стандарта времени. Такие серверы, конечно, существуют, но взаимодействуют не по тому тривиальному протоколу, который мы обсудим ниже. (В разделе 18.2.2 приведен пример обращения к подобному серверу по протоколу telnet.)
В нашем примере все запросы обслуживаются в порядке поступления однопоточным сервером. Когда приходит запрос от клиента, мы возвращаем строку, содержащую текущее время. Ниже приведен код сервера:
А это код клиента:
Чтобы сделать
В следующем примере такой же сервер реализован на базе протокола TCP. Он прослушивает порт 12321; запросы к этому порту можно посылать с помощью программы telnet (или клиента, код которого приведен ниже).
Обратите внимание, как просто использовать класс
18.1.2. Реализация многопоточного сервера
Некоторые серверы должны обслуживать очень интенсивный поток запросов. В таком случае эффективнее обрабатывать каждый запрос в отдельном потоке.
Ниже показана реализация сервера текущего времени, с которым мы познакомились в предыдущем разделе. Он работает по протоколу TCP и создает новый поток для каждого запроса.
Многопоточность позволяет достичь высокого параллелизма. Вызывать метод
Код клиента, конечно, остался тем же самым. С точки зрения клиента, поведение сервера не изменилось (разве что он стал более надежным).
18.1.3. Пример: сервер для игры в шахматы по сети
Не всегда нашей конечной целью является взаимодействие с самим сервером. Иногда сервер — всего лишь средство для соединения клиентов друг с другом. В качестве примера можно привести файлообменные сети, столь популярные в 2001 году. Другой пример — серверы для мгновенной передачи сообщений, например ICQ, и разного рода игровые серверы.
Солнце мертвых
Фантастика:
ужасы и мистика
рейтинг книги
Дважды одарённый. Том IX
9. Дважды одаренный
Фантастика:
альтернативная история
аниме
фэнтези
попаданцы
рейтинг книги
Скользкий
2. Приграничье
Фантастика:
боевая фантастика
рейтинг книги
Незабудки для тебя
Любовные романы:
остросюжетные любовные романы
рейтинг книги
Врата Мертвого Дома
Малазанская империя
Фантастика:
эпическая фантастика
рейтинг книги
Арбан Саеш. Трилогия
50. В одном томе
Фантастика:
фэнтези
рейтинг книги
Случайности Судьбы. О том, как все начиналось…
Фантастика:
фэнтези
юмористическое фэнтези
ироническое фэнтези
рейтинг книги
Тринадцатый XIII
13. Видящий смерть
Фантастика:
городское фэнтези
аниме
фэнтези
попаданцы
рейтинг книги
Князь Андер Арес 5
5. Андер Арес
Фантастика:
историческое фэнтези
фэнтези
героическая фантастика
рейтинг книги
Распря с веком. В два голоса
Документальная литература:
биографии и мемуары
рейтинг книги
Год 1944 — «победный»
Великая Отечественная : Неизвестная война
Научно-образовательная:
военная история
рейтинг книги
Трон Огня. Дилогия
Фантастика:
фэнтези
рейтинг книги
Путь Шедара
4. Другая сторона
Фантастика:
боевая фантастика
рейтинг книги
Собрание сочинений, том 22
22. Собрание сочинений Маркса и Энгельса
Научно-образовательная:
философия
рейтинг книги