Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/22: Рейтинг темы: голосов - 22, средняя оценка - 4.50
 Аватар для tasty_sock
139 / 137 / 21
Регистрация: 26.01.2010
Сообщений: 350

Передача данных

02.07.2010, 22:39. Показов 4554. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вечер добрый.

Есть 2 приложения: клиентское и серверное. Серверное берёт данные из БД, формирует датасет, переводит его в xml и побайтово передаёт клиенту, когда тот обращается к серверу.

При малом количестве данных всё замечательно работает, однако когда данных становится много (около тысячи записей, передаваемый файл весит около метра), клиент начинает дико тормозить.

Как оптимизировать процесс передачи файла?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.07.2010, 22:39
Ответы с готовыми решениями:

Передача данных по сети с задержкой. Как корректно передать размер данных до самого сообщения? Делаю на сокетах
Клиент отправляет запрос, сервер возвращает скрин. На создание уходит время, и цикл передачи do {} while (handler.Available > 0) ...

Передача данных
:-!У меня есь несколько форм. Из формы 8 перехожу в 6, из 6- в 9. Что нужно сделать, чтобы параметры из формы 9 передать в форму 8. Если...

Передача данных по и-нету
Привет всем. Есть задача передать файл с одного компа на другой через интернет используя при этом обычный хостинг. Пробовал через ФТП (один...

8
11 / 11 / 1
Регистрация: 21.03.2010
Сообщений: 71
02.07.2010, 22:47
Лучше всего упаковать файл, я сам так делал, при передаче. Затем на сервере распаковать. При упаковке сжимается до нескольких Кб.

ICSharpCode использовал вот эту библу.
1
 Аватар для tasty_sock
139 / 137 / 21
Регистрация: 26.01.2010
Сообщений: 350
05.07.2010, 11:02  [ТС]
Трудовые будни после хмельных выходных.

Добавляю мой xml с данными в архив с помощью класса FastZip, перевожу его в массив байтов через File.ReadAllBytes(). Файл передаётся, в клиенте его могу распаковать и работать с xml. Однако размер архива на сервере отличается от размера полученного архива в клиенте.

Размерность массива передаваемого (на сервере) и получаемого (в клиенте) массива байтов - 10000. При этом если изменить размерность массива в клиенте, растёт и размер самого архива. Распакованный файл весит одинаково.

Если выставить размерность в клиенте 70000, получаю ошибку "Cannot find central directory". Также архив приходит битым.

Что делать в данной ситуации? Как показать клиенту, какой именно объём данных нужно принять? И почему так разнится размер между созданным на сервере архивом и архивом, полученным клиентом?
0
15 / 15 / 1
Регистрация: 01.07.2010
Сообщений: 33
05.07.2010, 13:22
Код в студию.
0
 Аватар для tasty_sock
139 / 137 / 21
Регистрация: 26.01.2010
Сообщений: 350
06.07.2010, 11:21  [ТС]
Клиент
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
            TcpClient clientSocket = new TcpClient();
            byte[] data = new byte[20000];
            FastZip fz = new FastZip();;
 
 
 
 
            // Коннект к серверу
            try
            {
                clientSocket.Connect(ip, 1243);
 
                // Получение данных от сервера
                clientSocket.Client.Receive(data);
 
                // Отключиться
                clientSocket.Client.Disconnect(false);
 
            }
            catch
            {
                MessageBox.Show("Подключение к серверу отсутствует");
            }
 
            // Преобразовать полученные данные в файл
            File.WriteAllBytes("moo.zip", data);
 
            fz.ExtractZip("moo.zip", Directory.GetCurrentDirectory(), null);
 
            // Очистить датасет и записать в него новые данные
            dataSet.Clear();
            dataSet.ReadXml("fffuuu.xml");
Сервер
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
            xmlDoc = new XmlDocument();
            byte[] sendingXml;
            FastZip fz = new FastZip();
            TcpListener serverSocket = new TcpListener(IPAddress.Parse("127.0.0.1"), int.Parse(textPort.Text));
            TcpClient clientSocket = new TcpClient();
 
 
 
 
 
            // Массив байтов, в которые преобразуется xml
            sendingXml = new byte[20000];
 
 
 
            // Сделать xml для будущей передачи
            xmlDoc.LoadXml(dbConnect.GetDataSet("select Surname, NewPersons.Name, Mobile, Mail, States.Name, StateID, Account, City, NewPersons.Comment, NewPersons.Assignment, convert(varchar(10), NewPersons.DateFrom, 104), convert(varchar(10), NewPersons.DateTo, 104) from NewPersons inner join States on NewPersons.StateID = States.id", "NewPersons").GetXml());
            xmlDoc.Save("fffuuu.xml");
 
            Directory.CreateDirectory("ToZip");
            File.Copy("fffuuu.xml", "ToZip\\fffuuu.xml");
            fz.CreateZip("cool_zip.zip", "ToZip", true, null);
            Directory.Delete("ToZip", true);
 
            // Перевести xml с датасетом в байты
            sendingXml = File.ReadAllBytes("cool_zip.zip");
 
 
            // Запустить
            serverSocket.Start();
 
            for ( ;; ) // Ктулху фхтагн!
            {
                // Принять запрос от клиента
                clientSocket = serverSocket.AcceptTcpClient();
                receivingMessage = new byte[20000];
 
                // И отправить клиенту
                clientSocket.Client.Send(sendingXml);
 
                // Закрыть
                clientSocket.Close();
Добавлено через 3 часа 5 минут
Ой блин. В сервере не закрыт бесконечный цикл. Ну это и так понятно, думаю.
0
15 / 15 / 1
Регистрация: 01.07.2010
Сообщений: 33
06.07.2010, 13:30
1. Чтобы получить Xml представление DataSet-а - нужно использовать метод DataSet-а GetXml. Использовать XmlDocument - слишком накладно.
2. Можно передать DataSet вообще не преобразуя его в Xml. Просто пересылай данные в бинарном формате. Что-нибудь вроде:
C#
1
2
3
4
5
6
BinaryFormatter bf = new BinaryFormatter();
   using (MemoryStream ms = new MemoryStream())
   {
      bf.Serialize(ms, obj);
      return ms.ToArray();
   }
3. Не надо все время сохранять промежуточные данные в файлы на диске. Используй MemoryStream.
4. Получи у TcpClient stream и пиши данные в него.
C#
1
NetworkStream stream = client.GetStream();
5. Рассмотри вариант использования WCF вместо TCP сокетов.
6. Сначала добейся, чтобы все стабильно работало без компрессии. По крайней мере, DataSet размером в 10 Mb должен передаваться без проблем. Главное, чтобы время передачи данных линейно зависило от количества данных. И только потом можно попытаться сжать данные, для увеличения производительности.
1
 Аватар для tasty_sock
139 / 137 / 21
Регистрация: 26.01.2010
Сообщений: 350
10.07.2010, 17:52  [ТС]
Исправил.

Сервер.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
                    clientSocket = serverSocket.AcceptTcpClient();
                    receivingMessage = new byte[1024];
                    NetworkStream myNetworkStream = clientSocket.GetStream();
                    
                    string str = dbConnect.GetDataSet("select Surname, NewPersons.Name, Mobile, Mail, States.Name, StateID, Account, City, NewPersons.Comment, NewPersons.Assignment, convert(varchar(10), NewPersons.DateFrom, 104), convert(varchar(10), NewPersons.DateTo, 104), UserID, Company, Job, Title, Phone, Address, Fax, DisplayName from NewPersons inner join States on NewPersons.StateID = States.id", "NewPersons").GetXml();
 
                    byte[] data = Encoding.ASCII.GetBytes(str);
 
                    // Передать размер
                    long length = data.Length;
                    StreamWriter sw = new StreamWriter(myNetworkStream);
                    sw.WriteLine(length.ToString());
                    sw.Flush();
 
                    // Передать данные
                    myNetworkStream.Write(data, 0, data.Length);
                    myNetworkStream.Flush();
Клиент.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
                    clientSocket.Connect(ip, 1243);
 
                NetworkStream stream = clientSocket.GetStream();
                
 
                byte[] data;
 
                // Размер файла
                StreamReader sr = new StreamReader(stream);
                MemoryStream ms;
 
                string s = sr.ReadLine();
                int length = int.Parse(s);
 
                data = new byte[length];
 
                stream.Read(data, 0, length);
                ms = new MemoryStream(data);
 
                dataSet.ReadXml(ms);
Всё работает чудесно, однако теперь возникла проблема с кодировкой. ASCII не поддерживает кириллицу, тогда как если выставить кодировку, например, Unicode, клиент виснет. Что посоветуете?
0
 Аватар для m0nax
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
10.07.2010, 18:01
UTF8 самое оно
1
 Аватар для tasty_sock
139 / 137 / 21
Регистрация: 26.01.2010
Сообщений: 350
10.07.2010, 19:22  [ТС]
Новая проблема. По прошествии некоторого количества времени (обращения к серверу каждые 10 секунд) сервер перестаёт отвечать на запросы и клиент выдаёт ошибку:
C#
1
System.Net.Sockets.SocketException: Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение 192.168.0.100:1243
Происходит это после примерно минут 5-10 работы клиента. Как это исправить?

При отправке запроса клиентом к серверу использую следующее:
C#
1
2
3
4
5
6
clientSocket = new TcpClient();
clientSocket.Connect(ip, 1243);
 
// ...
 
clientSocket.Client.Disconnect(false);
У сервера:
C#
1
2
3
4
5
6
clientSocket = new TcpClient();
clientSocket = serverSocket.AcceptTcpClient();
 
// ...
 
clientSocket.Close();
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.07.2010, 19:22
Помогаю со студенческими работами здесь

Передача данных от клиента
using System; using System.Text; using System.Net; using System.Net.Sockets; namespace SocketTcpClient { class Program ...

Передача данных на COM-порт
Проблемма в том что при передаче масива байтов на COM-порт программа зависает, а на COM-порт ничего не передаётся(проверялось...

Передача данных по сети
Есть TCP соединение. Для передачи данных использую StreamReader.ReadLine и StreamWriter.WriteLine. Но при передачи данных они могут не...

Передача данных по TCP/IP
Подскажите куда копать, есть ПО из которого можно-нужно забирать данные по IP и порту. есть запрос следующего вида 0 0 0 0 0 0 0 0 E8...

Передача данных в «Компас»
В общем пишу прогу которая обрабатывает некоторые данные хранящиеся в датагриде и выплёвывает ее в др датагрид. Потом мне надо эту...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru