Чат
Реализовать:
- асинхронный: не должно быть ни одной синхронной операции ввода/вывода, предполагается использование набора технологий типа boost::asio, java::nio2, Qt…
- неблокирующий
- многопоточный: сервер должен принимать как параметр командной строки число потоков в пуле, который будет разгребать сетевые события
чат, работающий по единому протоколу, определённому в нотации protobuf и учитывающему как минимум имя пользователя:
// ------------------------------------------------------------------- /// \brief ChatMessage - сообщение, передаваемое между сервером и клиентами // ------------------------------------------------------------------- message ChatMessage { required string Sender = 1; ///< Идентификатор отправителя required string Text = 2; ///< Содержание сообщения optional string Data = 3; ///< Internal field. Можно использовать для реализации каких-либо } ///< собственных фич у своего сервера/клиента. Однако, стоит помнить, ///< что все сервера-клиенты должны быть совместимы друг с другом
В качестве механизма доставки сообщений между сторонами предлагается использовать протокол TCP. Этот протокол не допускает дублирование переданных пакетов и гарантирует доставку отправленных сообщений в рамках установленного соединения. Так как протокол TCP гарантирует доставку и правильную очередность данных, то для выделения отдельных сообщений из потока байт мы можем использовать самый простой из существующих способов - перед отправкой сообщения в канал сначала передавать его размер. Отметим, что большая часть сообщений, передаваемых в рамках сеанса управления, имеет небольшой размер. Поэтому использовать для представления размера сообщения фиксированное количество байт, позволяющее передать размер максимально возможного сообщения (например - 4 байта), черезчур избыточно. Поэтому, для представления размера сообщения мы будем использовать целое число в т.н. кодировке переменной длины (variable-length encoding), которая кодирует числа минимально возможным количеством байт и рекомендована Google. Функции для работы с этой кодировкой присутствуют в библиотеке Google Protocol Buffers.
Оганичения на язык: нет
Интерфейс пользователя: опционален