(Android, iOS, Windows, Linux) Опрос сервера против Push против сервера реализации - PullRequest
2 голосов
/ 15 марта 2012

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

Моя проблема в том, что в какой-то момент у меня есть центральный сервер (appengine, поэтому есть ограничения на то, что я мог бы сделать из-за временных и сетевых возможностей), который должен был бы доставить сообщение на хост различныхустройства, которые не обязательно работают под одной ОС (Windows, Android, iOS, Linux и т. д.).

Android и iOS (или любая другая мобильная платформа) - это основные проблемы, которые у меня будут на 2 уровнях.

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

2 - NAT (сложнее, потому что пользователь имеет относительно меньший контроль над своим брандмауэром, чем в сети, в которой он работает).Мой центральный сервер будет вести таблицу того, какое устройство имеет какой IP-адрес, но насколько я понимаю, если есть NAT или брандмауэр, он не сможет получить к нему доступ, если порт не был переадресован.

Поскольку я буду писать конкретный клиент для каждой ОС, я предпочитаю более универсальное решение.Я склонялся к написанию чрезвычайно простого HTTP-сервера, который сидит на каждом клиенте и принимает запросы (которые может отправлять appengine) и обрабатывает их как сообщения, которые предупреждают клиента о выполнении действия (с сервером или другим клиентом).Однако я сталкиваюсь с проблемой NAT / firewall.Например, если appengine необходимо отправить сообщение на AndroidDevice1, оно получит свой IP-адрес из таблицы и сделает запрос к нему.Однако это не работает, если порты не перенаправлены правильно, и если пользователь находится на 3g / 4g, брандмауэр контролируется поставщиком данных.

Из-за этого я начал думать об использовании Android C2DMно мне нужно решение, которое я мог бы реализовать на разных платформах.

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

Был бы какой-либо другой способ реализовать это, и если нет, какой из вышеперечисленных методов лучше всего подходит для баланса между удобством использования, мощностью и потреблением данных и пользовательским вводом (чем меньше пользователь должен сделать, чтобынастроить клиент (т.е. переадресацию портов и т. д.) лучше)?Обратите внимание, что я не намерен превращать это в дискуссию / пламенную войну, а в логическое изложение фактов.

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 16 марта 2012

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

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

Если AppEngine не разрешает такой подход, вы можете запустить свой собственный сервер сокетов, а затем установить связь между этим сервером и сервером appengine с помощью REST. Я использовал сокет-сервер Apache MINA, и у него не было проблем с масштабируемостью.

Другая проблема, с которой вы столкнетесь при использовании этого подхода или любого другого подхода, заключается в том, что в iOS (afaik) вы не можете держать TCP-сокет открытым, когда приложение переходит в фоновый режим. Единственное, что нужно для связи с устройством iOS - это служба push-уведомлений Apple

0 голосов
/ 15 марта 2012

Я бы предпочел, вместо того чтобы использовать HTTP-соединение, вы должны создать туннель TCP / IP и сделать связь быстрой и надежной.У меня есть одно приложение чата, которое работает для меня по протоколу TCP / IP.Если вы используете это, у вас будет одинаковая логика для нескольких платформ.Единственное, что вам нужно написать, это разные коды для iOS и Android.

...