.NET 4.x Ошибки при передаче данных между клиентом и сервером - C#

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

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

Всем привет. В прошлом году писал диплом в виде клиент-серверного приложения. В основу лёг первый попавшийся пример из просторов интернета. Сейчас возникла необходимость обратно использовать клиент-серверную архитектуру. Собственно я просто использовал наработки из диплома и сейчас (с увеличением объёма передаваемой информации) столкнулся с рядом проблем: 1. Размер пакета сообщения был строго фиксирован (задавался в коде). 2. Вторая проблема вытекает из первой с увеличением объёма данных - я увеличивал размер пакета что-то около 100000 байт (вместо того чтобы реализовать прием/передачу в цикле). И все это прекрасно работало в 100 МБ сетке. Но в организации есть подразделения за сотни км передача данных с которыми организованна по 64 кб/c (это самое грустное подразделение)))) (между сервером и клиентом куча сетевого оборудования) и как я понял маршрутизаторы (возможно я ошибаюсь) резали эти огроменные пакеты. В следствии чего запросы не обрабатывались т.к. пакеты не доходили полностью. Для начала рассмотрим прием сообщения (данных) сервером: как это было реализовано ранее:
Листинг программы
  1. CMessage Mess = new CMessage();
  2. // Буфер для принимаемых данных.
  3. Byte[] bytes = new Byte[100000];
  4. String data = null;
  5. TcpClient client = client_obj as TcpClient;
  6. data = null;
  7. // Получаем информацию от клиента
  8. NetworkStream stream = client.GetStream();
  9. int i;
  10. // Принимаем данные от клиента в цикле пока не дойдём до конца.
  11. while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
  12. {
  13. // Преобразуем данные в СMessage
  14. data = System.Text.Encoding.Default.GetString(bytes, 0, i);
  15. Mess = JsonConvert.DeserializeObject<CMessage>(data);
  16. }
  17. // Здесь обрабатываем и отправляем ответ
Далее я решил организовать прием/передачу в цикле, вот что получилось:
Листинг программы
  1. CMessage Mess = new CMessage();
  2. // Буфер для принимаемых данных.
  3. Byte[] bytes = new Byte[512];
  4. String data = null;
  5. TcpClient client = client_obj as TcpClient;
  6. data = null;
  7. // Получаем информацию от клиента
  8. NetworkStream stream = client.GetStream();
  9. int i;
  10. // Принимаем данные от клиента в цикле пока не дойдём до конца.
  11. while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
  12. {
  13. // Складываем строку по мере прихода байт
  14. data = data + System.Text.Encoding.Default.GetString(bytes, 0, i);
  15. // Если пакет < 512 байт, то выходим из цикла приема и конвертируем Json в CMessage
  16. if (i< CCommand.GetSizePackage())
  17. {
  18. Mess = JsonConvert.DeserializeObject<CMessage>(data);
  19. break;
  20. }
  21. }
  22. // Здесь обработка запроса и ответ клиенту
И в последней реализации все прекрасно работает... Но только по локал-хосту, как только я перехожу на стендовый вариант со 100 МБ сеткой - пакеты не доходят. Вопрос, как из первого варианта грамотно реализовать прием/передачу в цикле (предполагаю что в моем варианте где то есть ошибка, может даже и не одна) спасибо всем кто дочитал до конца)) Надеюсь на помощь!

Решение задачи: «.NET 4.x Ошибки при передаче данных между клиентом и сервером»

textual
Листинг программы
  1. while ((i = stream.Read(bytes, 0, bytes.Length)) != 0 && countBytes < length)
  2. {
  3.      listBytes.AddRange(bytes.Take(i));
  4.      countBytes = countBytes + i;
  5. }

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


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

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

9   голосов , оценка 3.667 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут