1

我对此有点困惑,并想确保我不会天真地了解它是如何工作的。客户端 JavaScript 是否也必须托管在 Google App Engine 上?假设我在我的开发服务器上创建了一个频道,然后我的计算机上有一个本地 HTML 文件(非托管)和所需的 javascript,然后我使用令牌连接到该频道 - 这行得通吗?或者这不是渠道的运作方式?

编辑:

我所拥有的只是一个 HTML 文件,与我的 app.yaml 文件(因此是我的网站的根目录)位于同一目录中。我在开发服务器中。

首先我创建一个频道并获取令牌:

token = channel.create_channel('1')                      
print token                                                    
>>> channel-4132644671-1352248413-1

然后我将该令牌复制到我的 HTML 文件中:

<html>
<head> 
<script type="text/javascript" src="http://localhost:8080/_ah/channel/jsapi"></script>
</head>
<body >
<script>

    var token = 'channel-4132644671-1352248413-1';
    var channel = new goog.appengine.Channel(token);
    var socket = channel.open();
    socket.onopen = function() { alert('open'); };
    socket.onmessage = function() { alert('message'); };
    socket.onerror = function() { alert('error'); };
    socket.onclose = function() { alert('close'); };        
</script>
</body>
</html>

我用 Safari 打开 HTML 文件。我收到一条警告说“打开”。但是,无论我输入什么令牌var token,我都会收到“打开”警报,因此我不确定收到该警报是否意味着什么。

然后我做: channel.send_message('1', 'hi')

我的 HTML 文件中什么也没有发生。没有警报。我究竟做错了什么?

4

2 回答 2

1

由于同源策略,脚本必须与应用程序打开频道的服务器托管在同一域中。对于当前的实现,该服务器是talkgadget.google.com,支持脚本是https://talkgadget.google.com/talkgadget/channel.js。使用 curl 您可以看到应用程序的 /_ah/channel/jsapi 端点只是向该脚本发出 302 重定向。因此,除非您打算开发和运行自己的频道服务器,否则您不能这样做。

此外,如果通道的底层实现在未来发生变化,App Engine 将更新以将 /_ah/channel/jsapi 重定向到新脚本,这样现有应用程序将继续工作,而自定义方法可能会中断。少一个理由自己做。

于 2012-11-06T23:00:45.277 回答
1

在 dev_appserver 中,通道由不断轮询服务器的 javascript 函数实现。

如果您的 dev_appserver 没有实际运行(看起来您已经以某种方式闯入了 dev_appserver),那么轮询功能将不会成功,您也不会收到频道消息。

在生产环境中,通道 API 似乎使用了某种长轮询。

另外,我必须仔细检查文档,但我相信第一个参数send_message应该是令牌。

于 2012-11-07T05:11:53.647 回答