Навигация
· XNA FAQ
· С чего начать
· Конкурсы
· Обратная связь
· XNA Блоги
Сейчас на сайте
· Гостей: 1

· Пользователей: 0

· Всего пользователей: 3,684
· Новый пользователь: headron
Последние фото
Эх, чуть не проспал закрытие.
Эх, чуть не проспал ...
Альбом: XNA Engine

GB
GB
Альбом: XNA Engine

South Park Coon & Friends
South Park Coon & Fr...
Альбом: XNA Games

Блоги
yavshoke
» XboxOne - интерес...
dampirik
» Push уведомления ...
dampirik
» Реклама,статистик...
Chort
» XNA и StartCoroutine
Chort
» Curve Class
dampirik
» Реклама, статисти...
dampirik
» Увеличение скорос...
dampirik
» Реклама, статисти...
general
» Распаковка DxtCom...
general
» Как работать с XN...
Поддержка
microsoft.com
1gb.ru - Дом для вашего сайта
Статистика посещений:

Просмотр темы
 Распечатать тему
Асинхронный TCP Client-Server
PhilippOK
#1 Распечатать сообщение
Опубликовано 27.02.2013 10:49:44
Аватар пользователя

Старший специалист


Сообщений: 201
Зарегистрирован: 22.05.12

Решил перевести работу клиента и сервера на асинхронную посылку-прием сообщений, используя методы
BeginConnect-EndConnect, BeginWrite-EndWrite и BeginRead-EndRead. До этого асинхоризм у меня был реализован таким образом:
Под каждого клиента на сервере выделялся свой отдельный поток, в котором уже использовалась синхронная операция чтения\записи. Нечто на подобие
Загрузить источник  GeSHi: C#
  1.  
  2.  
  3. private ManualResetEvent clientAccepted = new ManualResetEvent(false);
  4. private void ManageClient()
  5. {
  6. while(true)
  7. {
  8. clientAccepted.WaitOne();
  9. TcpListener listener = null;
  10. var workingThread = new Thread(ClientHandle);
  11. workingThread.Start(listener);
  12. }
  13. }
  14.  
  15. private void ClientHandle(object tcpListener)
  16. {
  17. var listener = (TcpListener) tcpListener;
  18. var client = listener.AcceptTcpClient();
  19. clientAccepted.Set();
  20. var stream = client.GetStream();
  21. while (true)
  22. {
  23. if (client.Available > 0)
  24. {
  25. int read = 0;
  26. var buf = new byte[client.ReceiveBufferSize];
  27. while ((read = stream.Read(buf, 0, client.Available)) > 0)
  28. {
  29. Array.Copy(buf, 0, data, dataPointer, read);
  30. dataPointer += read;
  31. if (NewDataReceived != null)
  32. new DataReceived(client, data);
  33. }
  34. }
  35. }
  36. }
  37.  
Добавлено за 0.010 секунд, используя GeSHi 1.0.8.2

По аналогии на запись и подключение. Все работало, но, как это часто бывает =), захотелось реализовать через begin-end;

И так теперь получилось:
Загрузить источник  GeSHi: C#
  1.  
  2. //Получаем клиент
  3. private void AcceptTcpClientCallback(IAsyncResult result)
  4. {
  5. var tcpClient = tcpListener.EndAcceptTcpClient(result);
  6. var buffer = new byte[tcpClient.ReceiveBufferSize];
  7. var client = new Client(tcpClient, buffer);
  8. lock (this.clients)
  9. {
  10. this.clients.Add(client);
  11. }
  12. var networkStream = client.NetworkStream;
  13. networkStream.BeginRead(client.Buffer, 0, client.Buffer.Length, ReadCallback, client);
  14. tcpListener.BeginAcceptTcpClient(AcceptTcpClientCallback, null);
  15. }
  16. //Читаем инфу
  17. private void ReadCallback(IAsyncResult result)
  18. {
  19. var client = (Client)result.AsyncState;
  20. if (client == null) return;
  21. var networkStream = client.NetworkStream;
  22. DataReceivedCount = networkStream.EndRead(result);
  23. if (DataReceivedCount == 0)
  24. {
  25. lock (this.clients)
  26. {
  27. this.clients.Remove(client);
  28. return;
  29. }
  30. }
  31. if (NewDataReceived != null)
  32. NewDataReceived(this, client.Buffer);
  33. networkStream.BeginRead(client.Buffer, 0, client.Buffer.Length, ReadCallback, client);
  34. }
  35.  
Добавлено за 0.010 секунд, используя GeSHi 1.0.8.2

По аналогии на запись, ну и клиентская сторона.
В штатном режиме все работает отлично, но есть одно НО. При отключении клиента от сервера или сервера от клиента (как в шататном режиме с использованием tcpClient.Client.Disconnect(false);, так и при внезапном отключении (завершение отладки проекта в студии). Закрытие клиента приводит к закрытию серверной части и наоборот, при закрытии сервера закрывается клиент. Ни кода ошибок ни Exceptions не выдается, я уже все асинхронные методы в try{}catch(Exception e) {throw new Exception(e.ToString);} взял, все равно молчит как рыба об лед.
Интуитивно поимаю, что должено возникать исключение, при закрытии потока во время чтения-записи, но почему тогда try-catch не показывает и почему закрывается основной поток приложения
Изменил(а) PhilippOK, 27.02.2013 10:50:53
 
Chort
#2 Распечатать сообщение
Опубликовано 27.02.2013 13:32:19
Аватар пользователя

Администратор


Сообщений: 1296
Зарегистрирован: 16.02.09

Ну если исключение есть - то оно в другом потоке и наверное обрабатывается до кол-беков
На вопросы отвечаю с головы. Ссылка на ответы или запускаю студию только в интересных случаях.
 
PhilippOK
#3 Распечатать сообщение
Опубликовано 28.02.2013 17:13:37
Аватар пользователя

Старший специалист


Сообщений: 201
Зарегистрирован: 22.05.12

Проблема решена. =)
Если уж быть откровенным, то проблемы сам себе создал.
Выход из программы в "запланированном режиме" приводил к следующей череде событий:
//Проверка в приложении клиента\сервера на тыкание в клавиатуру
if (InputHelper.Keyboard.IsJustPressed(Keys.Escape) && IsActive)
this.Exit();
Да вот только проблема в том, что на сервер не пойму с чего написал
if (InputHelper.Keyboard.IsKeyDown(Keys.Escape) && IsActive)
this.Exit();
в итоге закрываю клиент, он теряет фокус, и фокус ставится на окно сервера, что в свою очередь приводит к закрытию сервера =)
вот такая вот кривость стоила мне суток работы.
Незапланированный выход - приводил к вылету, потому что в Update проверял состояние покдлючения и делал Reconnect на уже активный сокет.
ЗЫ
зато теперь я имею 4 отлаженных класса асинхронных Tcp клиента и сервера.
2 реализованных через .Begin... .End
2 реализованных через new Thread(...).Start(...);
ЗЫЫ
все эксепшены которые сейчас возникают при разрыве соединения обрабатываются в штатном режиме и не приводят к вылету программ
Изменил(а) PhilippOK, 28.02.2013 17:17:08
 
Serega9I
#4 Распечатать сообщение
Опубликовано 28.02.2014 02:42:10
Новичок


Сообщений: 3
Зарегистрирован: 02.10.12

Извините если вопрос будет глупым, но как отрабатывается синхронный TCP клиент/сервер, если в методе ManageClient вы приостанавливаете выполнение потока до объявления и запуска экземпляра нового потока в котором уже выполняется сигнал о том, что можно запустить прошлый поток?
 
general
#5 Распечатать сообщение
Опубликовано 28.02.2014 09:19:21
Аватар пользователя

Администратор сайта


Сообщений: 3788
Зарегистрирован: 10.02.09

последнее сообщение 28.02.2013
[dreamteam-mobile]
[dtimofeev.blogspot.com][c#][XNA][blog]
 
Перейти на форум:
Авторизация
Логин

Пароль



Вы не зарегистрированы?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Мини-чат
Вы должны авторизироваться, чтобы добавить сообщение.

27.08.2014
Я умею немного на asp.net + html и css

22.08.2014
на ASP mvc 3 есть пару проектов. Могу помочь, если нужно. Обидно, если закроется Frown

21.08.2014
я тоже ноль

21.08.2014
Я в вебе только с php занимался да и то на уровне чтоб работало.

21.08.2014
Я в вебе полный ноль…

21.08.2014
Переводить его надо, хоть на ту же азуру. И двиг менять на что-то современное. Если есть веб-разрабы - можем скооперироваться. Один делать не буду.

21.08.2014
не знаю всех нюансов по оплате и все хорошее когда нибудь заканчивается

21.08.2014
А что случилось?

21.08.2014
похоже сайт будет работать до 28го числа

09.08.2014
Апи пока не видел. Но есть приложение в магазине Live Lock Screen BETA, так что думаю скоро будет

08.08.2014
Я про API для Update1. На нем работает это

08.08.2014
А что именно нужно? Чтото и сейчас открыто http://msdn.micro.
...105).aspx

06.08.2014
Кто-нибудь слышал об открытии доступа к Lock Screen Api?

31.07.2014
VPDExpress на базе MVS 2012, ни в какую не ловит исключения. Даже если их сам создаешь. И всех так?

25.07.2014
С днем системного администратора причастных к этой профессии! По случаю - тортик от жены

RSS каналы сайта
XNA - Новости
XNA - Статьи
XNA - Форум
XNA - Галерея
XNA - Файлы
Время загрузки: 0,36 секунд 8,709,552 уникальных посетителей