Общение с клиентом через GAE

Каков наилучший способ связи между приложением Android (собственное приложение) и настольным приложением (клиент C#/Java) через GAE? Одним из способов, который я нашел, был Channel API. К сожалению, я не нашел скриптов на стороне клиента, кроме Javascript, поддерживающих Channel API. Другой способ состоял в том, чтобы создать статический класс и общаться через эти статические переменные.

Вот чего я хотел бы добиться:

  1. Я хочу, чтобы приложение для Android отправляло сообщение в GAE.
  2. Это сообщение должно быть получено моим приложением для ПК (клиент С#/Java)
  3. Приложение для ПК должно вернуть ответ на это сообщение
  4. Ответ ПК должен быть отправлен в мобильное приложение.

На самом деле я пытаюсь выполнять команды в командной строке Windows со своего мобильного телефона.


person Vivek Mohan    schedule 04.01.2012    source источник
comment
Что вы имеете в виду под статической связью класса??? Есть разные машины: гей, десктоп и мобильные. Как вы можете запустить одну и ту же (= один экземпляр) виртуальную машину в такой (= распределенной) среде?   -  person Igor Artamonov    schedule 04.01.2012
comment
Это означает, что сообщение от ClientA будет храниться в статической строковой переменной, которую позже может получить клиент B. Я ищу лучшее решение, чем это.   -  person Vivek Mohan    schedule 04.01.2012
comment
И как это может быть связано с «Channel API»? static var/memcached/database — это вариант хранения. канал api/xmpp/http/email является вариантом связи. Вы можете (и даже нужно) использовать оба варианта одновременно.   -  person Igor Artamonov    schedule 04.01.2012
comment
Хорошо, предложите какой-нибудь вариант связи (кроме ChannelAPI) в GAE.   -  person Vivek Mohan    schedule 04.01.2012
comment
Каковы требования к вашему общению?   -  person Ski    schedule 04.01.2012
comment
(1) Я хочу, чтобы приложение для Android отправляло сообщение в GAE. (2) Это сообщение должно быть получено моим приложением для ПК (клиент C#/Java) (3) Приложение для ПК должно вернуть ответ на это сообщение (4) Ответ ПК должен быть отправлен в мобильное приложение. Надеюсь, это понимает мой pblm. На самом деле я пытаюсь выполнить свои команды в командной строке Windows со своего мобильного телефона.   -  person Vivek Mohan    schedule 04.01.2012
comment
Хорошо, а почему не стандартные http вызовы?   -  person Igor Artamonov    schedule 05.01.2012


Ответы (2)


Как насчет:

Android ‹-> Механизм приложения: C2DM

Вот хорошее видео об этом:

http://www.youtube.com/watch?v=M7SxNNC429U

C#/Java ‹-> App Engine: Http Post/Get, создайте http-сервлет на стороне механизма приложения. И стандартный http-запрос на c#/java.

Вот блог о стороне сервлета:

http://zawoad.blogspot.com/2010/04/how-to-call-servlet-in-gwt.html

person Rohan    schedule 04.01.2012

В основном это работает так:

  • Обработчик GAE получает сообщения с мобильного устройства по http и сохраняет их в хранилище данных. Вот пример запроса, который выполняется мобильным устройством через http:

    POST http://myapp.appspot.com/messages
    Content-type: application/json
    
    {"message":"Message from mobile device","userid":"myuserid",[other data..]}
    
  • Настольное приложение делает повторяющиеся запросы (каждые 10 секунд или около того) к GAE через http. Обработчик GAE даст пустой ответ, если новых сообщений нет, но если сообщение пришло, сообщение загружается из хранилища данных и обслуживается по http, поэтому ваше приложение получит его. Вот пример запроса:

    GET http://myapp.appspot.com/messages?last_message_id=...
    

    Пример запроса к базе данных:

    SELECT * FROM messages WHERE message_id > LAST_MESSAGE_ID
    

    Пример ответа:

    Content-type: application/json
    
    [{'id':1, 'message':'Message 1 from mobile device','userid':1},
     {'id':2, 'message':'Message 2 from mobile device','userid':1}]
    

С Channel-API можно делать один длинный запрос (long-polling) вместо множества повторяющихся каждые 10 секунд. Это более эффективно, но его будет сложнее реализовать, если библиотек не существует.

Я не могу рекомендовать вам конкретные библиотеки, потому что я не программирую на C# или Java, но все, что вам нужно, это библиотека, которая может делать http-запросы, а также библиотека, которая кодирует и декодирует данные в выбранном вами формате. В моем примере используется кодировка данных JSON.

person Ski    schedule 05.01.2012