.NET 4.x Ошибки при передаче данных между клиентом и сервером - C#
Формулировка задачи:
Всем привет.
В прошлом году писал диплом в виде клиент-серверного приложения. В основу лёг первый попавшийся пример из просторов интернета.
Сейчас возникла необходимость обратно использовать клиент-серверную архитектуру.
Собственно я просто использовал наработки из диплома и сейчас (с увеличением объёма передаваемой информации) столкнулся с рядом проблем:
1. Размер пакета сообщения был строго фиксирован (задавался в коде).
2. Вторая проблема вытекает из первой с увеличением объёма данных - я увеличивал размер пакета что-то около 100000 байт (вместо того чтобы реализовать прием/передачу в цикле). И все это прекрасно работало в 100 МБ сетке. Но в организации есть подразделения за сотни км передача данных с которыми организованна по 64 кб/c (это самое грустное подразделение)))) (между сервером и клиентом куча сетевого оборудования) и как я понял маршрутизаторы (возможно я ошибаюсь) резали эти огроменные пакеты. В следствии чего запросы не обрабатывались т.к. пакеты не доходили полностью.
Для начала рассмотрим прием сообщения (данных) сервером:
как это было реализовано ранее:
Далее я решил организовать прием/передачу в цикле, вот что получилось:
И в последней реализации все прекрасно работает... Но только по локал-хосту, как только я перехожу на стендовый вариант со 100 МБ сеткой - пакеты не доходят.
Вопрос, как из первого варианта грамотно реализовать прием/передачу в цикле (предполагаю что в моем варианте где то есть ошибка, может даже и не одна) спасибо всем кто дочитал до конца))
Надеюсь на помощь!
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; } } // Здесь обработка запроса и ответ клиенту
Решение задачи: «.NET 4.x Ошибки при передаче данных между клиентом и сервером»
textual
Листинг программы
while ((i = stream.Read(bytes, 0, bytes.Length)) != 0 && countBytes < length) { listBytes.AddRange(bytes.Take(i)); countBytes = countBytes + i; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д