Код в обзоре 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
, которую вы определили в предыдущем разделе.
Я надеюсь, что этот ответ является полным (и, в этом отношении, правильным) достаточно, чтобы помочь вам начать. Большая часть того, что они поместили в документы (и мой код здесь), может быть скопирована и вставлена с небольшими изменениями.