Как использовать соединения Http, такие как TCP-сокет в Java

1

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

Программирование сокетов на Java очень просто - там прекрасный учебник по этому вопросу, а двухсторонняя связь тривиальна.

Проблема заключается в том, что на мобильном клиенте (Android) не гарантируется, что сотовая сеть позволит вам устанавливать TCP-соединения. Это заставляет меня думать, что использование HTTP-соединения - путь.

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

Снова я могу задавать много вопросов, но это похоже на довольно распространенную проблему: есть ли библиотека или инфраструктура, которую я могу импортировать/использовать, чтобы обернуть соединение Http и обеспечить двухстороннее постоянное соединение (которое автоматически соединяется и т.д.). Я немного прочитал о cometD, но у него, похоже, нет библиотеки Java, которую я могу просто подобрать.

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

Заранее спасибо за просеивание моего невежества,

Гэвин

  • 0
    Но HTTP реализован поверх TCP / IP, поэтому, если сеть запрещает TCP, я не вижу, как это помогает. Теперь, если сеть разрешает соединения с портом 80, а не с другими (гораздо более вероятный сценарий, IMHO), вы можете решить, что ваш не HTTP-сервер будет работать на порте 80. Вам нужно будет только туннелировать его через HTTP, если сеть делал какую-то глубокую проверку пакетов, чтобы заблокировать не HTTP-протоколы.
  • 0
    Вы будете удивлены тем, сколько сетей на самом деле проводят такую проверку или вставляют прозрачные HTTP-прокси.
Показать ещё 3 комментария
Теги:
http

3 ответа

1
Лучший ответ

Выполнение длинных опросов на устройстве имеет некоторые недостатки на мобильном устройстве.

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

Если вы хотите попробовать игру, которая показывает эти проблемы, попробуйте Parallel Kingdom Age of Emergence.

Я бы посмотрел на XMMP, как было предложено alex. Если вы не можете найти библиотеку XMMP на Android, используйте Smack. Или посмотрите на question.

  • 0
    Я связался с похожим (лучше;)) вопросом / ответом, касающимся XMPP, включая упоминание специфической для Android версии Smack.
0

Модель Comet пытается решить эту проблему при использовании HTTP. Вот несколько примеров Java здесь.

Вы найдете примеры/статьи, в основном говорящие о ajax/XMLHttpRequest на стороне клиента, но все, что вам действительно нужно сделать, это убедиться, что вы используете клиентскую библиотеку, использующую http/1.1 и http keepalive, и "опрос" URL в цикле.

Идея - это серверные серверные блоки и не отправляет вам ответ до тех пор, пока на самом деле ничего не стоит отметить, а http keepalive поддерживает соединение с сервером между запросами, поэтому вы не платите цену за установку новое TCP-соединение для каждого запроса. Я предполагаю, что у android уже есть стандартная HTTP-библиотека, которая должна обрабатывать все это для вас, включая повторные подключения.

На стороне сервера Tomcat поддерживает обработку Comet, как указано в статье developerworks выше, если вы не хотите делать это "вручную" в сервлете, который также довольно забавный, пока вам не нужно действительно масштабировать клиента. s, и существуют такие рамки, как gwt-comet

0

Как упоминает Джим Льюис, TCP вполне возможен. Независимо от того, какой транспорт вы используете, вы всегда будете иметь дело с работой над мобильным телефоном; то есть потеря обслуживания, повторное подключение и т.д.

Посмотрите этот предыдущий вопрос в той же строке:
Лучший способ отправить данные с сервера на устройство Android

Кроме того, вы можете попытаться взглянуть на библиотеку Android Android push, которая может инкапсулировать некоторые из компонентов повторного соединения, которые вы хотите (не то, что я проверил):
https://labs.ericsson.com/apis/mobile-java-push/blog/first-version-push-android-available

Ещё вопросы

Сообщество Overcoder
Наверх
Меню