2012-11-06 77 views
1

我對此有點困惑,並且希望確保我不會天真地瞭解它是如何工作的。客戶端JavaScript是否也必須託管在Google App Engine上?假設我在我的開發服務器上創建了一個頻道,然後我的計算機上有一個本地HTML文件(非託管),並具有所需的JavaScript,並且我使用一個標記連接到該頻道 - 這是否可行?或者這不是渠道如何運作?谷歌應用程序引擎通道API javascript位置

編輯:

我只有在同一目錄中的HTML文件作爲我的app.yaml文件(這樣的根目錄我的網站)。我在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文件。我收到一條提示「開放」。然而,無論我在var token中輸入什麼標記,我都會收到「開放」警報,因此我不確定是否獲取警報意味着什麼。

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

而且什麼也沒有發生在我的HTML文件。沒有警報。我究竟做錯了什麼?

回答

1

由於具有相同的源策略,腳本必須與應用程序打開通道的服務器位於同一個域中。在目前的實施中,該服務器是talkgadget.google.com,支持腳本是https://talkgadget.google.com/talkgadget/channel.js。通過curl,您可以看到應用程序的/ _ah/channel/jsapi端點只是發出一個302重定向到該腳本。所以除非你打算開發和運行你自己的頻道服務器,否則你不能這樣做。此外,如果未來頻道的底層實現應該發生變化,App Engine將被更新爲將/ _ah/channel/jsapi重定向到新腳本,所以現有的應用程序將繼續工作,而自定義方法則會可能會中斷。少一個理由自己去做。

+0

嗯,我並不是真的試圖自己做。我只是試圖在我的本地系統上進行測試。我在localhost:8080的開發服務器上運行GAE,並且我在同一個目錄中有一個HTML文件,並且我試圖讓渠道工作,但沒有成功。這就是我想要做的......任何想法? – Snowman

+0

查看我剛剛發佈的修改。 – Snowman

+0

您的html文件的file:// ... url也可能與相同的原始策略發生衝突。我建議創建一個靜態/目錄並將文件放在那裏,然後配置app.yaml以使靜態處理程序部分指向它。然後,html和js都將通過http:// localhost:8080提供。 –

1

在dev_appserver中,通道由一個不斷輪詢服務器的javascript函數實現。

如果你的dev_appserver沒有真正運行(看起來你已經以某種方式進入了dev_appserver),那麼輪詢函數不會成功,你將不會獲得通道消息。

在生產上,它看起來像頻道API使用某種長輪詢。

此外,我必須仔細檢查文檔,但我相信send_message的第一個參數應該是標記。