我对此有点困惑,并且想确保我对这是如何工作并不天真。客户端javascript是否也必须托管在Google App Engine上?假设我在我的开发服务器上创建了一个频道,然后我的计算机上有一个本地HTML文件(非托管),并带有所需的javascript,我用一个令牌连接到该频道 - 这会有效吗?或者这不是渠道如何运作?
修改:
我所拥有的是与app.yaml文件位于同一目录中的HTML文件(因此我网站的根目录)。我在devserver中。
首先,我创建一个频道并获取令牌:
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文件。我得到一个警告说&#34;打开&#34;。但是,无论我在var token
中输入什么令牌,我都会打开&#34;打开&#34;警报,所以我不确定获得警报是否意味着什么。
然后我做:
channel.send_message('1', 'hi')
我的HTML文件中没有任何反应。没有警报。我做错了什么?
答案 0 :(得分:1)
由于原始策略相同,脚本必须与应用程序打开频道的服务器托管在同一个域中。在目前的实现中,该服务器是talkgadget.google.com,支持脚本是https://talkgadget.google.com/talkgadget/channel.js。使用curl,您可以看到应用程序的/ _ah / channel / jsapi端点只是发出302重定向到该脚本。因此,除非您打算开发和运行自己的频道服务器,否则不能这样做。
此外,如果渠道的基础实施在未来发生变化,App Engine将更新为将/ _ah / channel / jsapi重定向到新脚本,以便现有应用程序继续工作,同时可能采用自定义方法打破。更不用说自己做的事了。
答案 1 :(得分:1)
在dev_appserver中,通道由javascript函数实现,该函数不断轮询服务器。
如果您的dev_appserver实际上没有运行(看起来您已经以某种方式分解为dev_appserver),则轮询功能不会成功,您将无法获得通道消息。
在制作时,看起来通道API使用某种长轮询。
另外,我必须仔细检查文档,但我相信send_message
的第一个参数应该是令牌。