java - Google App Engine channel API

标签 java google-app-engine channel-api

我正在尝试学习 GAE 的 channel API(使用 Java),但我不知道从哪里开始。

我经历了Channel API Overview (Java)但是为了简洁起见,发布在那里的代码并不完整。

由于我是新手,如果有完整的示例代码,那将非常有帮助。

谢谢,
史雷

最佳答案

您链接到的 Channel API 概述中的代码非常完整,只是有点杂乱无章。我承认,一旦你理解了它,我觉得它比他们看起来的要简单得多,但我很高兴他们在提供太多信息方面犯了错误。

在没有无关信息渗入的情况下为此提供完整的解决方案有点困难,因为您将如何使用 Channel API 的某些方式有点依赖于您现有应用程序的基础架构。出于这个原因,我试图只是详细说明 AppEngine 文档提供的内容,希望您能更好地理解。如果您有任何问题,评论将允许您提出具体问题。

首先是一些词汇:

  • channel 留言:您希望发送给客户端的消息(可能是您首先使用 Channel API 的原因)。
  • channel 号:用户唯一的字符串以及用户尝试发送消息的范围。
  • channel 代币:对任何客户端都是唯一的字符串。每个客户端每 2 小时 1 个 channel token 。
  • channel 服务: AppEngine 服务器端类,它提供了一种创建 channel 并通过它们发送 channel 消息的方法。


  • 在服务器上,您需要执行以下操作:
    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);
    

    获得 token 后,您只需要某种方式将其发送到客户端代码即可。您链接到的 AppEngine 文档通过从 Java servlet 提供 HTML 并调用 index.replaceAll("\\{\\{ token \\}\\}", token) 来完成此操作。 .

    这是如何工作的,他们已经完成了放置文字字符串 {{ token }}在他们的 JavaScript 代码中(如下所示),所以无论在哪里 {{ token }}出现在 JavaScript 代码中,它将被替换为由 channelService.createChannel(...) 生成的实际 token 。调用上面。请注意,您不需要将 token 注入(inject)以这种方式提供服务的客户端代码中,但这是一个很好的起点,因为他们就是这样做的(并记录了下来)。

    现在您已经将 token 注入(inject)到 JavaScript 中,您需要 获取带有 channel token 的代码到客户端 . (请注意,如上所述,您也可以只获取客户端的 token ,并以这种方式创建 channel )。他们拥有的代码是:
    <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分别在 channel 打开、接收消息、遇到错误或关闭时调用。您可能希望只创建简单的实现来更好地了解正在发生的事情:
    function onOpened() {
        alert("Channel opened!");
    }
    
    function onMessage(msg) {
        alert(msg.data);
    }
    
    function onError(err) {
        alert(err);
    }
    
    function onClose() {
        alert("Channel closed!");
    }
    

    我仍然建议将它们分离成单独的函数,以便您可以更轻松地扩展它们以进行操作并解决问题。有关 JavaScript API 的更多详细信息,请参阅 Channel API JavaScript Reference .

    你需要建立一个机制来获取要从客户端发送到服务器的数据 .再一次,您希望如何做到这一点并不重要。 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是处理消息发送和接收的 servlet(您需要在 web.xml 文件中设置)的路径(请参阅以下部分)。

    在您将消息从客户端发送到服务器之后,您将需要一个可以 的 servlet。使用相同的 channel key 向所有客户端发送更新 .
    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 接收到。您在上一节中定义的函数。

    我希望这个答案是完整的(就此而言,是正确的)足以帮助您入门。他们放在文档中的大部分内容(以及我在这里的代码)都可以复制和粘贴,只需稍作调整。

    关于java - Google App Engine channel API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8271274/

    相关文章:

    java - 通过 Windows 服务启动 Jar 时 JFrame 未加载

    java - 通过 Jacob 在 Java 应用程序和 Microsoft 应用程序之间进行同步

    java - 创建委托(delegate)身份验证提供程序 (Spring Security)

    google-app-engine - Google 应用引擎 + Go + 数据存储 + 添加/更新/删除记录

    python - 在 jinja2 中使用 django 过滤器

    java - 而("abc");在 java 中会导致错误,但在 c 中不会导致任何错误。为什么?

    java - 在 GAE 端点中传递数组

    php - 将 Google Channel API 与 PHP 结合使用

    google-app-engine - App Engine Python 模块和 channel 服务

    javascript - 入门