API канала Google App Engine - PullRequest
       23

API канала Google App Engine

7 голосов
/ 25 ноября 2011

Я пытаюсь изучить API канала GAE (используя Java), но не могу понять, с чего начать.

Я прошел Обзор API канала (Java) , но кодразмещенный там не был закончен для краткости.

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

Ответы [ 2 ]

33 голосов
/ 25 ноября 2011

Код в обзоре Channel API, на который вы ссылаетесь, довольно полный, он немного повсюду. Я признаю, что, как только вы это поймете, я чувствую, что это намного проще, чем то, как они это сделали, но я рад, что они ошиблись в предоставлении слишком большого количества информации.

Довольно сложно дать полное решение для этого без посторонней информации, поскольку некоторые из способов использования Channel API немного зависят от инфраструктуры вашего существующего приложения. По этой причине я попытался немного подробнее рассказать о том, что предоставляют документы AppEngine, так что, надеюсь, вы сможете лучше понять. А комментарии позволят вам задавать конкретные вопросы, если они у вас есть.

Во-первых, немного словарного запаса:

  • Channel Message: Сообщение, которое вы хотите отправить клиентам (и, скорее всего, причина, по которой вы используете Channel API в первую очередь).
  • Ключ канала: Строка, уникальная для пользователя и области, в которой пользователь пытается отправить сообщение.
  • Токен канала: Строка, уникальная для любого клиента. 1 канальный токен на клиента в течение 2 часов.
  • Служба каналов: Серверный класс AppEngine, который предоставляет средства для создания каналов и отправки по ним сообщений каналов.

На сервере вам необходимо выполнить следующее:

ChannelService channelService = ChannelServiceFactory.getChannelService();

// The channelKey can be generated in any way that you want, as long as it remains
// unique to the user.
String channelKey = "xyz";
String token = channelService.createChannel(channelKey);

Как только у вас есть токен, вам просто нужен какой-то способ, чтобы передать его клиентскому коду. Документ AppEngine, на который вы ссылаетесь, делает это, передавая HTML из сервлета Java и вызывая index.replaceAll("\\{\\{ token \\}\\}", token).

Как это работает, они помещают буквальную строку {{ token }} в свой код JavaScript (как вы увидите ниже), поэтому, где бы в коде JavaScript не появлялось * 1035, оно будет заменено на фактический токен, сгенерированный вызовом channelService.createChannel(...) выше. Обратите внимание, что вам не нужно вводить токен в код клиентской стороны, который вы обслуживаете таким образом, но это хорошее место для начала, поскольку именно так они это сделали (и задокументировал это).


Теперь, когда вы вроде как вставили токен в JavaScript, вам нужно получить код с токеном канала для клиента . (Обратите внимание, что, как указано выше, вы также можете получить только токен клиенту и таким образом создать канал) . Код, как они есть это:

<body>
  <script>
    channel = new goog.appengine.Channel('{{ token }}');
    socket = channel.open();
    socket.onopen = onOpened;
    socket.onmessage = onMessage;
    socket.onerror = onError;
    socket.onclose = onClose;
  </script>
</body>

Они вырезали детали о том, как прочитать это из файла на сервере, но, опять же, вы можете сделать это любым удобным для вас способом. Вы также можете буквально напечатать строку, используя resp.getWriter().print(index) в своем JavaServlet, где index - это строка, хранящая содержимое HTML / JavaScript, перечисленное выше. Как я уже говорил, многое зависит от вас, что лучше всего подходит для существующей инфраструктуры вашего приложения.

Они предназначены для того, чтобы вы определяли свои собственные функции JavaScript onOpened, onMessage, onError и onClose, которые будут вызываться при открытии каналов, получении сообщения, возникновении ошибки или закрытии соответственно. , Вы можете просто создать наивные реализации, чтобы лучше понять, что происходит:

function onOpened() {
    alert("Channel opened!");
}

function onMessage(msg) {
    alert(msg.data);
}

function onError(err) {
    alert(err);
}

function onClose() {
    alert("Channel closed!");
}

Я все еще рекомендую разделить их на отдельные функции, чтобы вам было легче их расширять, чтобы поиграть и разобраться. Подробнее о JavaScript API см. В справочнике по JavaScript Channel .

.

Вам нужно будет установить механизм для получения данных, которые вы хотите отправить с клиента на сервер . Еще раз, как вы хотите это сделать, не имеет значения. Документация AppEngine предлагает настроить XMLHttpRequest для этой цели.

sendMessage = function(path, opt_param) {
  path += '?g=' + state.game_key;
  if (opt_param) {
    path += '&' + opt_param;
  }
  var xhr = new XMLHttpRequest();
  xhr.open('POST', path, true);
  xhr.send();
};

Здесь opt_param - это просто строка необязательных параметров в формате x=1&y=2&z=3. Это вся инфраструктура, которую они создали для своего примера приложения Tic-Tac-Toe, и она не имеет решающего значения для функциональности Channel API; как я уже сказал, вы можете сделать этот звонок как хотите.

path - это путь к сервлету (который вам необходимо настроить в файле web.xml), который должен обрабатывать отправку и получение сообщений (см. Следующий раздел).


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

ChannelService channelService = ChannelServiceFactory.getChannelService();

// This channelKey needs to be the same as the one in the first section above.
String channelKey = "xyz"

// This is what actually sends the message.
channelService.sendMessage(new ChannelMessage(channelKey, "Hello World!"));

Вышеуказанный вызов channelService.sendMessage(...) - это то, что фактически отправляет сообщение, так что оно может быть получено функцией onMessage, которую вы определили в предыдущем разделе.


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

13 голосов
/ 09 февраля 2012

Я новичок в StackOverflow и не уверен, что этот вопрос все еще открыт, но если вы все еще ищете полный пример Java с использованием Google Channel API, как ServerSide (Java), так и Client (Java), вы можете найтиподробное описание, которое я написал здесь: http://masl.cis.gvsu.edu/2012/01/31/java-client-for-appengine-channels/

В нем изложено все: от создания канала (клиент и сервер), отправки сообщения на канал (клиент и сервер), а такжеПростые рамки Java-клиенты могут использовать для взаимодействия с каналами.Мне тоже было трудно понять Документацию Google и разобраться во всем этом.Я надеюсь, что эта информация все еще актуальна и полезна: -)

Полный исходный код и пример чата можно найти на GitHub: https://github.com/gvsumasl/jacc

Вот пример кода, надеюсь, это поможет:-)


Создание канала на стороне клиента Java (с использованием FrameworkAPI Framework: Jacc)

ChatListener chatListener = new ChatListener();
ChannelAPI channel = new ChannelAPI("http://localhost:8888", "key", chatListener);
channel.open();

Создание канала на стороне сервера Java:

public class ChatChannelServlet extends HttpServlet {
  @Override
  public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {    
    String channelKey = req.getParameter("c");

    //Create a Channel using the 'channelKey' we received from the client
    ChannelService channelService = ChannelServiceFactory.getChannelService();
    String token = channelService.createChannel(channelKey);

    //Send the client the 'token' + the 'channelKey' this way the client can start using the new channel
    resp.setContentType("text/html");
    StringBuffer sb = new StringBuffer();
    sb.append("{ \"channelKey\":\"" + channelKey + "\",\"token\":\"" + token + "\"}");

    resp.getWriter().write(sb.toString());
  }
}

Отправка сообщений клиенту Java (с использованием ChannelAPI Framework: Jacc)

/***
* Sends your message on the open channel
* @param message
*/
public void sendMessage(String message){
try {
        channel.send(message, "/chat");
    } catch (IOException e) {
        System.out.println("Problem Sending the Message");
    }
}

Отправка сообщений на стороне сервера Java:

public class ChatServlet extends HttpServlet {
  @Override
  public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    String channelKey = req.getParameter("channelKey");
    String message = req.getParameter("message");

    //Send a message based on the 'channelKey' any channel with this key will receive the message
    ChannelService channelService = ChannelServiceFactory.getChannelService();
    channelService.sendMessage(new ChannelMessage(channelKey, message));
  }
}
...