Разработка сетевого протокола для данных реального времени / мобильные устройства

Я сталкиваюсь со следующей дилеммой:

Разработайте новый сетевой протокол, который использовался бы между сервером (программное обеспечение Java) и настольными и мобильными клиентами. Мобильные клиенты включают J2ME, Android и возможно в будущем даже iPhone.

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

Я хотел бы постараться не создавать полностью пользовательскую реализацию протокола TCP с нуля, если это возможно.

В эти дни люди обычно recommed выполнение всего в стиле REST, который я также действительно люблю. В этом случае я немного колеблюсь хотя: как Вы реализовали бы постоянный поток данных сверху REST? Разделенный на блоки ответ HTTP?

Я также рассматриваю протоколы непростого текста (текущие, которые я заменяю, протоколы двоичной синхронной передачи данных). Те текущие протоколы имеют свои довольно серьезные проблемы, таким образом, они действительно должны быть заменены.

Буферы протокола Google похожи на довольно сильного кандидата на обработку деталей низкого уровня, но я не уверен, может ли она использоваться от Android. И я вполне уверен, что реализация iPhone имела бы проблемы с ним также.

Существует также ЗВУКОВОЙ СИГНАЛ, но я думаю, что это в значительной степени мертво и интересно, было это когда-либо широко используемый.

Какие-либо идеи?

8
задан auramo 17 January 2010 в 17:29
поделиться

4 ответа

Думаю, прежде чем попасть в проект протокола, вы должны действительно внимательно позаботиться о следующих проблемах:

  • почти все протоколы, кроме http, фильтруются брандмауэрами в эти дни. Даже многие типы контента и порты (кроме 80) могут быть отфильтрованы поставщикам услуг, особенно в услугах мобильных данных. Поэтому убедитесь, что у вас нет проблем с брандмауэром в вашей целевой сети, прежде чем выбрать или разработать протокол.
  • Размер и скорость вата. Попробуйте использовать эффективные протоколы как в транспортном размере и кодирования / декодирования (сериализация / десериализация). Буфет протокола Google обеспечивает надежное решение этой проблемы.
  • Соединения всегда отключаются. Вы никогда не можете полагаться на соединение, чтобы оставаться открытым в течение длительного времени из-за тайм-аутов NAT (по умолчанию 15 минут), протоколы тайм-аута (30 минут для TCP) и многие существующие проблемы с сетью. Итак, не предпочитайте протокол над другим только потому, что он держит открытую связь (он может попытаться, но никогда не преуспевает). Отправка HeartBeats - это хорошая попытка для проблемы ожидания времени ожидания, но сеть отключается еще неизбежно.
  • Пропускная способность имеет значение. пропускной способностью я имею в виду количество сообщений, обработанных в течение определенного периода времени (например, 1 секунду). Используя асинхронные протоколы, которые отключают клиента после получения его сообщения, действительно помогает увеличить пропускную способность. Хотя не полагайтесь на подключение к клиенту с сервера, чтобы подтолкнуть результат, потому что многие клиенты позади NATS и брандмауэров, которые избегают прямого соединения снаружи. Попробуйте сохранить соединение или опросить сервер для результата. Предотвращение государства в разговоре также является другой метод, который помогает масштабировать пропускную способность приложения, поскольку количество растет клиентов.
  • В существующих ванах нет в реальном времени. Не доверяйте тем, кто говорит, что они реализовали протокол в реальном времени на основе существующих широкометражных сетевых протоколов. Вы никогда не можете реализовать протокол в реальном времени в верхней части не в реальном времени. Вы можете просто сделать все возможное и молиться за сеть быстро. Это означает: не останавливайтесь, делайте все возможное.
  • Неблокировка IO. NIO (неблокирующий IO) - это тенденция, которая эффективно используется в сетевом программировании. Он позволяет большое количество соединений с меньшим использованием памяти и ограниченным количеством потоков. Java 5 имеет родную поддержку для NIO, которая очень примитивна. Многие рамки, такие как Apache Mina и netty , были реализованы на основе Java Nio, чтобы сделать неблокирующие программирование проще и более надежным. Я настоятельно рекомендую их.
8
ответ дан 5 December 2019 в 11:25
поделиться

Вы можете посмотреть KRYO и / или Kryonet , которые находятся NIO и Java и работают на рабочем столе и Android. Вы должны были бы написать iPhone, однако, что будет довольно сложно. Kryo бьет буферы протокола Google в сериализованном размере ( тестов здесь ) и простота использования (не нужно писать схему типа .proto.

Что касается NIO, вы можете проверить NPTL . Старый становится новым снова.

3
ответ дан 5 December 2019 в 11:25
поделиться

Вы можете посмотреть на RTP (транспортный протокол транспорта в реальном времени) , что может быть непосредственно полезно (и / или может быть переплетением), но его дизайн даст вам некоторые хорошие идеи для работы из. И вы вполне можете быть в состоянии использовать его.

2
ответ дан 5 December 2019 в 11:25
поделиться

Ваш XPath правилен и вы, кажется, ответили на первую часть своего собственного вопроса (почти):

doc.xpath('//table/tbody[@id="threadbits_forum_251"]/tr')

«кодекс выше получит меня любой TR стола таблицы , где угодно , у которого есть tbody ребенок с id признака, равным threadbits_forum_251»


//, означает, что следующий элемент может появиться где угодно в документе.

/tr в конце означает, получить узел tr совпадающего элемента.

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

theNode['href']
theNode['src']

Где theNode является вашим объектом Nokogiri Node .


Изменить:

К сожалению, я не использовал эти библиотеки, но я думаю, что оценка и синтаксический анализ XPath выполняются Mechanize. Вот как вы получите весь элемент и его атрибуты за один ход.

doc.xpath("td[3]/div[1]/a").each do |anchor|
    puts anchor['href']
    puts anchor['src']
    ...
end
-121--1483852-

Это не элегантное решение, но вы можете сделать это по прямому http, не задав значение поля content-length в ответе http и не закрывая выходной поток. Просто продолжайте отправлять данные.

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

К сожалению, я не смог найти никаких полезных ссылок для этих идей, но я верю, что вы получите идеи.

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

Только мои 2 цента;)

2
ответ дан 5 December 2019 в 11:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: