Асинхронный подход к использованию потоков с сокетами

Я всегда создавал свои собственные сериализаторы/десериализаторы, чтобы иметь возможность использовать BeginReceive/EndReceive с сокетами, чтобы избежать использования одного потока на подключенный сокет. Это довольно трудоемкая задача.

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

Глядя на quickstart они делают именно это (один поток на клиента). Неужели нет другого пути?

Мой вопрос на самом деле не о protobuf-net, а о сериализации и сокетах в целом. А вот примеры для protobuf-net приветствуются.


person jgauffin    schedule 09.07.2010    source источник


Ответы (1)


Это просто базовый пример. protobuf-net — это уровень сериализации, а не уровень обмена сообщениями. Если у вас есть определенный способ обработки сообщений: сделайте это. Все, что вам нужно сделать, это во время обработки потока буферизовать все сообщение (возможно, в MemoryStream), а затем обработать его через protobuf-net, когда данные будут доступны.

Разница будет заключаться в том, что вместо прямого использования методов *WithLengthPrefix вы можете захотеть обрабатывать длину полезной нагрузки отдельно, чтобы ваш код знал, сколько данных нужно буферизовать перед обработкой.

person Marc Gravell    schedule 09.07.2010
comment
Методы сериализатора/десериализатора в сериализаторе типизированы, верно? Я не знаю, какое сообщение protobuf я получу, и поэтому не могу их использовать, есть ли альтернативы? - person jgauffin; 09.07.2010
comment
Ответ Марка правильный. Однако буферизация до длины варианта непроста. - person Stephen Cleary; 09.07.2010
comment
@jgauffin - есть механизм через Serializer.NonGeneric, который разработан именно для этого, с механизмом предоставления типа на лету. Был недавний вопрос с примером этого здесь, на SO. - person Marc Gravell; 09.07.2010
comment
превосходно. Спасибо. сейчас я смотрю на WCF через TCP с protbuf-net. - person jgauffin; 09.07.2010