Отправить сериализованный объект через сокет - PullRequest
0 голосов
/ 08 октября 2009

Какой лучший способ отформатировать сообщение на сервере, в данный момент я сериализую объект с помощью бинарного форматера, а затем отправляю его на сервер.

Когда сервер завершает прослушивание в асинхронном режиме, а затем, когда размер полученного буфера не равен 100%, предполагается, что передача завершена.

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

Я знаю, что мне нужно как-то пометить сообщение, чтобы сказать, что это конец первого сообщения, этот другой бит принадлежит сообщению 2, но я не уверен в правильном способе сделать это.

Может ли кто-нибудь указать мне правильное направление и, может быть, привести несколько примеров?

Спасибо

Ответы [ 3 ]

2 голосов
/ 08 октября 2009

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

С другой стороны, вы можете просто сидеть и ждать 4 байта, объединять их в целое число, а затем сидеть и ждать это количество байтов.

Когда ваша функция чтения возвращается (блокирует чтение), вы знаете, что весь объект помещен в буфер, поэтому вы просто десериализуете его и приводите к общему типу интерфейса.

изменить: это ответ на ваш конкретный вопрос. Это говорит о том, что вам лучше использовать библиотеку более высокого уровня, чем чистый TCP.

1 голос
/ 08 октября 2009
  1. Если ваш объект имеет фиксированную длину, вы можете получить указанное количество байтов на другом конце, а затем создать свой объект.
  2. В противном случае вы можете отправлять разделители (символ или последовательность символов, которые вы не используете в своем объекте) между вашими объектами и продолжать читать полученные данные побайтно, пока не увидите разделитель.
0 голосов
/ 08 октября 2009

Возможно, вы захотите взглянуть на буфер протокола (http://code.google.com/p/protobuf), a (формат, не зависящий от языка реализации), формат / структура обмена данными. Для него существует как минимум две реализации .NET (см. http://code.google.com/p/protobuf/wiki/ThirdPartyAddOns).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...