Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
andrewio

Сокеты.Сериализация

12.11.2013, 16:22. Показов 2195. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Клиент и сервер на синхронных сокетах.
Нужно сериализовать данные(объект) и отправить по сокету и десериализовать на стороне клиента. Использую бинарную сериализацию.

Когда размер сериализованных данных маленький - все гладко проходит. Когда он начинает расти, в некоторый момент времени получается так, что приходят на клиент не все данные и десериализация не удается.
Есть идеи? Помогите, товарищи.

Сервер:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//MailBox => в байты
            byte[] msg = NetworkWorker.Serialize(currentMailBox);
            //размер MailBox
            int mailBoxSize = msg.Length;
 
            string cmdSize = mailBoxSize.ToString() + NetworkWorker.messageEnd;
 
            //Отправляем размер
            byte[] msgSize = Encoding.UTF8.GetBytes(cmdSize);
            handler.Send(msgSize);
 
            //Отправляем Почт ящик
                handler.Send(msg);
 
byte[] bytes = new byte[NetworkWorker.cmdSize];
 
 
            //Ответ от клиента
            int bytesRec = handler.Receive(bytes);
            Console.WriteLine("\nОтвет от клиента: {0}", Encoding.UTF8.GetString(bytes, 0, bytesRec));
Клиент:
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
//Получить размер ящика(вычленяем его из строки "размер"+"<THE_END>")
            int mailBoxSize = Convert.ToInt32(NetworkWorker.getCommand(sender));
 
            //Получить ящик
            serializedMailBox = new byte[mailBoxSize];
 
                MemoryStream stream = new MemoryStream();
                
                //порция по 2048
                byte[] buf = new byte[NetworkWorker.sendDataSize];
 
                for (int i = 0; i < mailBoxSize; i = i + NetworkWorker.sendDataSize)
                {
                    //получить порцию
                    sender.Receive(buf);
 
                    //ReceiveExactly(sender,buf,i,
                    stream.Write(buf, 0, buf.Length);
 
                }
 
                stream.Seek(0, 0);
                BinaryFormatter bin = new BinaryFormatter();
                try
                {
                    
                receiveMailBox = (MailBox)bin.Deserialize(stream);
                //receiveMailBox = NetworkWorker.DeSerializeMailBox(serializedMailBox);
                //отобразить в dataGridView
                showOnDataGridView(receiveMailBox.Inbox);
                //Ответ серверу
                byte[] serverCommandBytes =
                    Encoding.UTF8.GetBytes("Почтовый ящик получен!");
                //отправка команды на сервер
                sender.Send(serverCommandBytes);
                }
C#
1
2
3
4
5
6
7
public static byte[] Serialize(object Obj)
        {
            BinaryFormatter bin = new BinaryFormatter();
            MemoryStream mem = new MemoryStream();
            bin.Serialize(mem, Obj);
            return mem.GetBuffer();
        }
GetBuffer() - возвращает данные, кратные 2048 байт
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.11.2013, 16:22
Ответы с готовыми решениями:

Сериализация
Помогите пожалуйста с сериализацией..необходимо написать код сериализации для передачи информации по локальной сети...чтобы информация...

сериализация
Помогите пожалуйста с сериализацией..необходимо написать код сериализации для передачи информации по локальной сети...чтобы информация...

Сериализация
public class IPzag { public BitArray version = new BitArray(4);//номер версии 4 бита public BitArray...

1
 Аватар для pincet
1655 / 1154 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
13.11.2013, 14:12
хоть протокол TCP/IP гарантирует доставку, не гарантируется, что пакет придет целиком, а не частями. Посему, нужен протокол обмена. Самый тривиальный случай - маркеры начала-конца сообщения
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.11.2013, 14:12
Помогаю со студенческими работами здесь

Сериализация
Есть приложение, структура которого состоит из большого числа мелких классов(~160 шт), которые могут быть изменены(количество полей, их...

Сериализация
Вообщем проблема достаточно простая,есть класс сериализую его как по учебнику,все проходит успешно,но вот в чем проблема,в получаемом xml в...

Сокеты
Привет. Нашел очень хороший исходник клиент-серверного чата, покопался в нем, немного изменил. Пришла в голову одна идея, но вот не...

Сокеты
Люди, хелп. Скоро сдача проэкта, а я имею неприятный глюк. Короче, пересылаю массив байтов, заполненый с помощью...

Сокеты
Здравствуйте! Есть приложение (а точнее чат &quot;VypressChat&quot;). Оно активно использует многоадресную рассылку, чем нагружает сеть. По этой...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru