1

私はこれについて少し混乱しており、これがどのように機能するかについて素朴ではないことを確認したいと思います. クライアント側の JavaScript も Google App Engine でホストする必要がありますか? 開発サーバーにチャネルを作成し、必要な JavaScript を含むローカル HTML ファイル (ホストされていない) がコンピューターにあり、トークンを使用してそのチャネルに接続するとします。これは機能しますか? それとも、これはチャネルの仕組みではありませんか?

編集:

app.yaml ファイルと同じディレクトリ (つまり、Web サイトのルート ディレクトリ) にある 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>

HTML ファイルを Safari で開きます。「開いています」というアラートが表示されます。ただし、入力したトークンに関係なくvar token、「オープン」アラートが表示されるため、そのアラートを取得しても意味があるかどうかはわかりません。

それから私は: channel.send_message('1', 'hi')

私のHTMLファイルでは何も起こりません。アラートはありません。私は何を間違っていますか?

4

2 に答える 2

1

dev_appserverでは、チャネルはサーバーを常にポーリングしているjavascript関数によって実装されます。

dev_appserverが実際に実行されていない場合(dev_appserverに侵入したように見えます)、ポーリング機能は成功せず、チャネルメッセージを取得できません。

本番環境では、チャネルAPIはある種の長いポーリングを使用しているように見えます。

また、ドキュメントを再確認する必要がありますが、最初のパラメータsend_messageはトークンである必要があると思います。

于 2012-11-07T05:11:53.647 に答える
1

同一オリジン ポリシーのため、スクリプトは、アプリがチャネルを開くサーバーと同じドメインでホストされている必要があります。現在の実装では、そのサーバーは talkgadget.google.com であり、サポート スクリプトはhttps://talkgadget.google.com/talkgadget/channel.jsです。curl を使用すると、アプリの /_ah/channel/jsapi エンドポイントがそのスクリプトに 302 リダイレクトを発行するだけであることがわかります。したがって、独自のチャネル サーバーを開発して実行するつもりでない限り、これはできません。

さらに、チャネルの基盤となる実装が将来変更された場合、App Engine は /_ah/channel/jsapi を新しいスクリプトにリダイレクトするように更新されるため、既存のアプリは引き続き機能しますが、カスタム アプローチは機能しなくなる可能性があります。自分でやる理由が 1 つ減りました。

于 2012-11-06T23:00:45.277 に答える