Клиент-Серверное приложение, асинхронное программирование - 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;
}
}