Mibori Shante — Google Node

Последние действия

Описание класса и типов

Класс TCPServer

Описание простейшего TCP-сервера сводится к написанию обработчика, который запускается для каждого входящего соединения работающего сервера. Прежде чем писать этот обработчик, нужно ответить на два вопроса:
  • Параметр какого типа будет принимать обработчик при каждом своём запуске в качестве аргумента? Это тип состояния сервераserverState.
  • Какого типа сообщения сможет принимать обработчик, когда будет работать? Это тип сообщений сервераserverMessage.
На основе этого определяется экземпляр класса TCPServer serverState serverMessage с обработчиком tcpHandler:

-- первый тип -- то, что принимает обработчик в качестве параметра
-- второй тип -- то, какого типа сообщения он принимает

class TCPServer serverState serverMessage where

-- то, что нужно определить
    tcpHandler                   -- обработчик для каждой сессии
        :: serverState           -- состояние сервера
        -> AcceptData            -- параметры соединения
        -> Proc serverMessage () -- принимает сообщения типа serverMessage
   
-- то, что не нужно определять. Используется для управления
    startManager       -- запускает сервер
        :: serverState -- состояние сервера
        -> Bool        -- каждое соединение -- это OS-процесс?
        -> Integer     -- прослушиваемый порт
        -> Proc t      -- возвращает процесс менеджера
            (Process (TCPManager serverMessage))
           
    stopManager, killManager -- останавливают сервер
        :: Process (TCPManager serverMessage) -- процесс менеджера
        -> Proc t ()

    getConnections -- получить список активных соединений
        :: Process (TCPManager serverMessage) -- процесс менеджера
        -> Proc t (Connections serverMsg)
           -- возвращает список активных соединений


Управление сервером

Функции startManager, stopManager и killManager используются для запуска и остановки сервера соответственно. При этом существует два способа остановить работающий сервер:
  • stopManager командует серверу перейти в режим остановки. При этом входящие соединения не принимаются. stopManager ожидает, когда закроется последнее соединение, после чего возвращает управление.
  • killManager принудительно убивает запущенные обработчики и закрывает соединения, после чего возвращет управление.

Важное об управлении сервером

Особенности внутренней организации сервера таковы, что при запуске мы получаем ссылку на процесс, который фактически не принимает соединения, а выполняет задачи по их регистрации и правильного осуществления способов остановки. Это процесс-менеджер сервера. Через него осуществляется всё управление сервером. Приёмом соединений занимается другой процесс. Поэтому убийство процесса-менеджера не приведет к остановки сервера и будет ошибочным. Вместо этого получится процесс-зомби, который неконтролируемо всё еще будет принимать соединения и запускать обработчики. Так делать не нужно. Следует останавливать сервер только через stopManager или killManager.

Тип TCPManager serverMessage — это тип сообщений процесса-менеджера. Не используется напрямую. Открыт для написания расширений.


Тип AcceptData = (Handle, HostName, PortNumber) — параметры текущего соединения

Это второй аргумент обработчика.
  • Handle — хэндл для текущего соединения
  • HostName — имя компьютера, который к нам подключился
  • PortNumber — открытый порт образовавшийся в результате соединения с нами

Тип Connections serverMessage = Map (Process serverMessage) AcceptData

Список активных соединений, возвращаемый функцией getConnections.