Что нужно? Нужно описать некоторую процедуру-обработчик, которая будет запускаться при каждом соединении. Она будет управлять текущей сессией. При запуске в качестве аргументов ей передаются параметры соединения, а также неизменяемое значение типа состояния обработчика. Запущенная процедура может также принимать сообщения типа сообщения обработчика до тех пор, пока не завершит своё выполнение для текущего соединения. Описание типов Для того, чтобы описать простой сервер без состояния, тип сообщения обработчика и тип состояния обработчика делаем пустыми: data Simple = Simple -- тип состояния обработчика data SimpleMsg = SimpleMsg -- тип сообщения обработчика Описание обработчика в экземпляре instance TCPServer Simple SimpleMsg where tcpHandler _ (h, _, _) = liftIO $ hPutStrLn h "I'm minimal TCPServer instance!" , где
Описание функции запуска. Из GHCi сервер можно запускать строчкой m <- startMgr, где m сохранит ссылку на процесс менеджера соединений после его запуска. Вот исходник startMgr: startMgr = action $ startManager Simple True 4000 , где
Остановка сервера Наш сервер не предполагает длительного удерживания соединения для каждой сессии. Поэтому stopMgr m и killMgr m, запущенные из GHCi остановят сервер одинаково быстро. Вот как они описываются: stopMgr m = action $ stopManager m killMgr m = action $ killManager m Использование После старта сервера, можно будет успешно подключаться через telnet ИмяМашины 4000 до тех пор, пока сервер не остановят. Исходный код |