2015-06-29 2 views
2

Я рассматриваю, используя комок («кодирование/завал») для сериализации данных в сетевом протоколе, я искал вокруг и не могут найти какое-либо решение этих проблем:Капли по проводам

Кадрирование сообщений. Документация gob создает впечатление, что вы можете просто обернуть TCP-соединение в декодере gob и прочитать. Но что произойдет, если вы получили только половину сообщения? Может ли gob каким-то образом справиться с этим, или я вынужден добавить кадр сообщения и скопировать данные сообщения в буфер для gob для unserialize?

Различные типы сообщений. Протокол имеет разные типы сообщений, как это лучше всего обрабатывать с помощью gob? Имея идентификатор перед каждым блоком gob, указывающим тип данных? Помещая все сообщения в сообщение «Мастер», которое содержит поля для всех разных сообщений (сводя их только к одному типу сообщения)? Я попробовал последний (проще), и у него, кажется, огромный НАРУШЕНИЕ (> 650 байт).

+3

Поскольку пакет gob предназначен для кодирования потоков значений, пакет управляет кадрированием. Можете ли вы подробнее рассказать о своей заботе о частичной стоимости? Пакет gob отправляет целые значения, если во время кодирования не возникает паники или чего-то еще. Если это произойдет, восстановление не произойдет. –

+0

Я пробовал кодировать структуру с помощью gob, выводил результат, дважды копировал его в буфер и удалял последние ~ 5 байтов, чтобы имитировать половину переданной структуры. Это дает мне ошибку, но опустошает буфер. Неужели я ошибаюсь в своем утверждении, что это может произойти? Я не ожидал, что gob добавит обрамление. – Cshark

+2

Дублирование выходного сигнала кодирующего устройства не совпадает с тем, что кодирование одного и того же значения два раза. Используйте один кодировщик для кодирования нескольких значений. Используйте один декодер для декодирования нескольких значений. Что вы пытаетесь имитировать, отсекая последние 5 байтов? –

ответ

3

В документации на gob создается впечатление, что вы можете просто обернуть свое TCP-соединение в декодер gob и прочитать.

Исправить. Пакет предназначен для потока нескольких значений между кодировщиком и декодером.

Но что произойдет, если вы получили только половину сообщения?

Декодер вызывает базовый io.Reader для получения данных. Если читатель не может вернуть данные, читатель вернет ошибку. Декодер возвращает эту ошибку в приложение.

Невозможно восстановить поток декодирования, если io.Reader возвращает ошибку.

Различные типы сообщений

Вы можете кодировать пары сообщений, где первая указывает приложению тип ожидать во втором.

Вы также можете создать «главный» тип, как вы описываете. Накладные расходы, которые вы видите, понесены один раз за поток, а не один раз за значение.

Смежные вопросы