Клиент-Серверное приложение, асинхронное программирование - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, это мой первый опыт в написании приложений такого плана, но я прочитал уже довольно много литературы, а вот ответа на некоторые вопросы так и не нашел, надеюсь на вашу помощь. 1. Чем асинхронная модель программирования отличается от многопоточной, ведь в итоге и там, и там все сводиться к обработке некоторого кода в отдельном потоке? 2. "Клиент отключился": Я знаю, что при закрытии соединения Socket получает сообщение длиной 0 байт, но проблема в том, что сервер не может (или может?) постоянно что-то слушать, т.к. при отправке некоторых команд он ждет ответа, а это значит, что сообщение может попасть не в тот метод. Я насчитал три варианта для решения этой проблемы:
  1. Создать второй Socket
  2. Время от времени пинговать каждый клиент
  3. Забить и узнавать об отключении при попытке отправки команды
Решил остановиться на втором способе и по сути нашел "решение" для всей проблемы ("сообщение может попасть не в тот метод" - работа с командами и пингование происходят в разных потоках) - lock. Написал такой метод:
        void PingAll()
        {
            while (true)
            {
                for (int i = 0; i < Clients.Count; i++)
                    if (!Clients[i].Ping())
                    {
                        Client client = Clients[i];
                        Clients.Remove(Clients[i]);
                        OnDisconnection(client);
 
                        i--;
                    }
                Thread.Sleep(3 * 1000);
            }
        }
Метод Read:
            public bool Ping()
            {
                lock (socket)
                {
                    SendCommand(0x05);
                    try { socket.Receive(new byte[1]); }
                    catch { return false; }
                    return true;
                }
            }
Точно такая же блокировка стоит на остальных методах с обработкой команд, например:
public void Close() { lock (socket) { SendCommand(0x00); } }
Но PingAll не дает отработать ни одной из них, почему? Он в своем потоке и 3 секунды отдыхает, почему при выполнении любой команды из другого потока поток засыпает на методе SendCommand(byte code)? 3. Я имею выделенный IP адрес, но его имеют не все будущие клиенты. Я знаю, что при установке соединения на Nat-е создается правило для прохождения обратного трафика, проблема в том, что живет это правило относительно не долго. Сколько конкретно - не важно, главное то, что через определенное время бездействия правило удалиться и сервер больше не сможет ничего послать на клиент. Собственно вопрос: вот установилось соединение и некоторое время никаких команд не отправляется (клиент разумеется ждет эти команды), сами по себе "концы" каким-то образом взаимодействуют?
4. Чем Socket.BeginAccept() отличается от Socket.AcceptAsync(), ведь последний не поддерживает await и, кстати, может кто скажет почему?

Решение задачи: «Клиент-Серверное приложение, асинхронное программирование»

textual
Листинг программы
            public bool Ping()
            {
                lock (socket)
                {
                    SendCommand(0x05);
                    try { socket.Receive(new byte[1]); }
                    catch { return false; }
                    return true;
                }
            }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.167 из 5
Похожие ответы