Open Source & Linux Lab

It's better when it's simple

User Tools

Site Tools


courses:high_performance_computing:chat

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
courses:high_performance_computing:chat [2016/11/08 13:24] kelcourses:high_performance_computing:chat [2018/04/01 20:27] (current) kel
Line 1: Line 1:
 ====== Чат ====== ====== Чат ======
 Реализовать: Реализовать:
-  - **асинхронный**: не должно быть ни одной синхронной операции ввода/вывода, предполагается использование набора технологий типа //boost::asio//, //java::nio2//...+  - **асинхронный**: не должно быть ни одной синхронной операции ввода/вывода, предполагается использование набора технологий типа //boost::asio//, //java::nio2//, //Qt//...
   - **неблокирующий**   - **неблокирующий**
   - **многопоточный**: сервер должен принимать как параметр командной строки число потоков в пуле, который будет разгребать сетевые события   - **многопоточный**: сервер должен принимать как параметр командной строки число потоков в пуле, который будет разгребать сетевые события
-  - **командующий**: 1 поток должен находится в состоянии //waiting// и по команде //command// в чате выпонять любую команду (например //ls//) и возвращать результат в качестве ответного сообщения 
  
-чат, работающий по единому протоколу, определённому в нотации //protobuf// и учитывающему как минимум имя пользователя+чат, работающий по единому протоколу, определённому в нотации //protobuf// и учитывающему как минимум имя пользователя:
  
-//Оганичения на язык//: нет+<code protobuf> 
 +// ------------------------------------------------------------------- 
 +/// \brief ChatMessage - сообщение, передаваемое между сервером и клиентами 
 +// ------------------------------------------------------------------- 
 +message ChatMessage { 
 +    required string Sender = 1; ///< Идентификатор отправителя 
 +    required string Text = 2;   ///< Содержание сообщения 
 +    optional string Data = 3;   ///< Internal field. Можно использовать для реализации каких-либо 
 +}                               ///< собственных фич у своего сервера/клиента. Однако, стоит помнить, 
 +                                ///< что все сервера-клиенты должны быть совместимы друг с другом 
 +</code> 
 + 
 +В качестве механизма доставки сообщений между сторонами предлагается использовать протокол TCP. Этот протокол не допускает дублирование переданных пакетов и гарантирует доставку отправленных сообщений в рамках установленного соединения. Так как протокол TCP гарантирует доставку и правильную очередность данных, то для выделения отдельных сообщений из потока байт мы можем использовать самый простой из существующих способов - перед отправкой сообщения в канал сначала передавать его размер. Отметим, что большая часть сообщений, передаваемых в рамках сеанса управления, имеет небольшой размер. Поэтому использовать для представления размера сообщения фиксированное количество байт, позволяющее передать размер максимально возможного сообщения (например - 4 байта), черезчур избыточно. Поэтому, для представления размера сообщения мы будем использовать целое число в т.н. кодировке переменной длины (variable-length encoding), которая кодирует числа минимально возможным количеством байт и рекомендована Google. Функции для работы с этой кодировкой присутствуют в библиотеке Google Protocol Buffers. 
 + 
 +//Оганичения на язык//: нет\\ 
 +//Интерфейс пользователя//: опционален
courses/high_performance_computing/chat.txt · Last modified: 2018/04/01 20:27 by kel