2013-12-23 2 views
3

у меня есть гнездо, в котором я хочу, чтобы получить несколько сообщений от неизвестных длин: текст, средств массовой информации, ..Windows Phone 8 - Держите гнездо открытым и получать данные о неизвестной длине

Я видел, как он работает с Windows.Networking .Sockets и кажется, что отправитель должен сначала отправить длину, а это не мой случай.

Я увидел несколько улучшений в System.Net.Sockets, но не нашел событий, которые прослушивают получение пакетов данных.

Мой вопрос: должен ли я каждый раз проверять сокет на данные? есть ли лучшая реализация?

+2

TCP 101: если у вас нет протокола более высокого уровня, у вас не может быть сообщений более одного байта. –

+0

Вы хотите сохранить эти данные, не зная правил приложения для его разбора? Одна из идей заключается в том, чтобы читать буфер, заполненный данными за раз из сокета, до тех пор, пока отправитель не закроет TCP-запрос. Если вы хотите разделить разные виды данных, вам нужно будет изучить различные приложения, которые вы хотите поддержать, и проанализировать полученные данные по мере их поступления. Затем вы можете узнать, достигли ли вы конца единицы работы. – BobHy

ответ

0

Вы можете использовать функцию выбора, чтобы отслеживать открытые дескрипторы и получать данные, поступившие через сокет.

3

Windows Phone 8 Подход

асинхронные операции сетей поддерживаются с помощью метода ReceiveAsyncSystem.Net.Sockets.Socket класса. Все, что вам нужно сделать, это правильно настроить SocketAsyncEventArgs перед выполнением этого вызова, и вы сможете поднять обработчик только тогда, когда данные были получены.

Пример от this MSDN article показывает, как выполнять операцию чтения синхронно, но внутри он использует асинхронный шаблон. Если вы удалите часть кода ManualResetEvent из кода, тогда вызовы будут проваливаться, и событие будет срабатывать только тогда, когда данные будут готовы к обработке.

Desktop/Full .NET подход

Используйте TcpClient класс вместо Socket и вы будете в состоянии получить NetworkStream объект, который реализует BeginRead - асинхронный метод, который будет вызывать функцию обратного вызова только тогда, когда существует новые данные для чтения (или удаленная сторона закрыта).

  • Примечание: пример MSDN для BeginRead закончена на странице EndRead. Используйте эти два фрагмента кода для рабочего кода.
+1

спасибо, но TcpClient недоступен в телефоне Windows –

+0

@NadaNaoushi, я также добавил ответ WP8. – nicholas

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