Клиент-Серверное приложение, асинхронное программирование - C#
Формулировка задачи:
Здравствуйте, это мой первый опыт в написании приложений такого плана, но я прочитал уже довольно много литературы, а вот ответа на некоторые вопросы так и не нашел, надеюсь на вашу помощь.
1. Чем асинхронная модель программирования отличается от многопоточной, ведь в итоге и там, и там все сводиться к обработке некоторого кода в отдельном потоке?
2. "Клиент отключился":
Я знаю, что при закрытии соединения Socket получает сообщение длиной 0 байт, но проблема в том, что сервер не может (или может?) постоянно что-то слушать, т.к. при отправке некоторых команд он ждет ответа, а это значит, что сообщение может попасть не в тот метод. Я насчитал три варианта для решения этой проблемы: Метод Read:
Точно такая же блокировка стоит на остальных методах с обработкой команд, например:
Но PingAll не дает отработать ни одной из них, почему? Он в своем потоке и 3 секунды отдыхает, почему при выполнении любой команды из другого потока поток засыпает на методе SendCommand(byte code)?
3. Я имею выделенный IP адрес, но его имеют не все будущие клиенты. Я знаю, что при установке соединения на Nat-е создается правило для прохождения обратного трафика, проблема в том, что живет это правило относительно не долго. Сколько конкретно - не важно, главное то, что через определенное время бездействия правило удалиться и сервер больше не сможет ничего послать на клиент. Собственно вопрос: вот установилось соединение и некоторое время никаких команд не отправляется (клиент разумеется ждет эти команды), сами по себе "концы" каким-то образом взаимодействуют?
- Создать второй Socket
- Время от времени пинговать каждый клиент
- Забить и узнавать об отключении при попытке отправки команды
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); } }
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); } }
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; } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д