Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2015, 14:16   #1
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию Организация общения между сервером и клиентом

Добрый день уважаемые программисты, проектирую свой "messenger" и нуждаюсь в советах умных людей, решил пойти не самым легким путем и начал писать свой протокол по обмену сообщениями чтобы разобраться более детально
во всех тонкостях сетевого программирования.
Первым делом для более высокой производительности я подумал и решил использовать асинхронные механизмы async/await и соотвественно асинхронные методы в классах TcpClient, TcpListener.

На текущий момент я решил провернуть все, следующим образом:
Мой сервер подписывается на событие которое считывает асинхронного приходящие пакеты от клиента а клиент аналогично реализует такой же функционал и работает это все примерно следующим образом.

Код приведенный ниже, в частности ReceivePacket завернут в класс NetworkConnection и соответсвенно я создаю асинхронный обработчик для каждого подключаемого клиента до тех пор пока клиент не отключился по собственной воли.

Код:
public async void ReceivePacket()
{
 var length = await ReadAsync(Stream, 4).ToInt(); //Размер пакета
 var effect = await ReadAsync(Stream, 4).ToInt(); //Действие которое должен выполнить пакет
 var command = await ReadAsync(Stream, length).ToString(); //JSON объект

 OnCommandReceive(new WrapperCommand
  {
   Length = length,
   Effect = effect,
   Command = command
  });

 ReceivePacket();
}
Когда клиент посылает команду я всегда ему отвечаю обратно неким Acknowledgement, мол чувак все ОК я твою команду принял.

Вопрос, важно ли такое действие, как никак это лишняя операция и при больших объемах данных тоже будет кушать свое время на обработку, стоит ли делать такое или ACK стоит посылать только в том случае когда клиент должен что-то обработать при получение ACK?
Вопрос, еще я каждого подключенного TCP клиента держу в ConcurrentDictionary, на сколько это правильно и есть ли другой способ более производительней? А то как бы, при 100-200к подключенных клиентов одновременно коллекция будет не хило большой что скажется естественно на производительности.
Вопрос, корректно ли держать в коллекции столько клиентов? Ума не приложу как можно сделать подругому и чистить коллекцию от подключений (ведь клиент может висеть сутками онлайн или выдернуть интернет кабель и об отключение я никогда не узнаю)

В общем, если кто-то уже занимался подобным, подскажите пожжааалуйста как организовать правильно такую систему.. Какие мелкие нюансы, тонкости, за ранее благодарю Вас.

Последний раз редактировалось coNsept; 03.12.2015 в 14:18.
coNsept вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C# Нужна реализация возможности подключения между сервером и клиентом Wingedlion Помощь студентам 0 17.11.2013 19:06
(C#) Настройка связи между клиентом и сервером Demetrius Помощь студентам 0 14.03.2012 22:46
Кодировка в сообщениях между клиентом-сервером. Willer55 Работа с сетью в Delphi 1 11.12.2011 09:11
обмен сообщениями между сервером и клиентом Don Karleone Работа с сетью в Delphi 3 25.02.2011 15:24
обмен сообщениями между клиентом и сервером используя ClientSocket и ServerSocket xTANATOSx Работа с сетью в Delphi 3 04.10.2007 15:17