2012-05-15 2 views
0

Все,Deserializing несколько объектов из асинхронного сокета

Я немного новичок в программировании на C# и сокетах, и мне нужен совет. Я смотрел этот сайт и похожие сайты, но на самом деле не нашел решения для своей проблемы.

Я разрабатываю клиентское приложение и серверное приложение, и они взаимодействуют через асинхронный сокет. Клиент отправляет объекты на сервер по очереди, путем сериализации его в MemoryStream с использованием BinaryFormatter. Получаемый массив байтов отправляется через сокет и десериализуется сервером.

Это хорошо работает, когда сервер успевает получить и обработать объект до того, как клиент отправит новый. Однако, когда клиент отправляет объекты быстрее, чем сервер может их обрабатывать, они останавливаются на стороне сервера. Следующий вызов EndReceive() считывает все объекты в очереди из сокета, но сериализатор только десериализует первый объект, а другие потеряны.

Объекты имеют переменный размер, поэтому, я думаю, я не могу использовать свойство Position для MemoryStream. Есть ли способ обнаружить в массиве байтов, где начинаются объекты?

Кроме того, я прочитал в других сообщениях, что EndReceive() может не получать все, что было отправлено в одном чтении, могут потребоваться другие чтения. Так что, я думаю, это еще кое-что, с чем мне придется иметь дело?

Любые указатели? Любая помощь будет принята с благодарностью. :-)

ответ

0

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

Это касается того, что сервер не может обрабатывать достаточно быстро, чтобы идти в ногу с записью; вы можете попытаться оптимизировать это.

+0

Спасибо за ответ. Моя основная проблема заключается в десериализации нескольких объектов. Когда сервер получает массив байтов, содержащий 2 объекта, как десериализовать второй? Думаю, мне придется использовать свойство Position класса MemoryStream, но я не знаю размер объектов. Есть ли способ узнать размер объектов из содержимого массива байтов? – user1397096

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