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

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

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

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

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

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

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


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

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

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