Ajaxプッシュエンジンを使用してCometアプリケーションを作成する

はじめに



この記事では、リアルタイムWebアプリケーションを構築した経験を共有したいと思います。 テクノロジーのレビューはすでにハブで行われているので、理論については掘り下げません。ネットワークでそれらを見つけたい場合は問題ありません。 私は直接練習することを提案します。



彗星



Cometモデルを使用すると、サーバーからのデータにリアルタイムで応答する非同期Webアプリケーションを作成できます。 この場合、その実装では、Ajax Push Engine(APE)フレームワークでのロングポーリングテクノロジーを使用します。 このテクノロジーの本質は、ブラウザーがサーバーに接続し、データが表示されるまで待機することです。 表示されるとすぐに、クライアントはそれらを受け入れ、再び接続します。 データが到着しない場合、接続はタイムアウト後に切断され、再度確立されます。



類人猿



APEは、Ajax Push用に設計されたオープンソースソフトウェアパッケージです。 システムには、WebサーバーとJavascriptフレームワークが含まれています。 APEを使用すると、クライアント側でアプリケーションを追加しなくても、ブラウザーにリアルタイムでデータを転送できます。 作成者によると、100,000の化合物の負荷に耐えることができます。





インストールとセットアップ



サーバーのインストールと構成は問題を引き起こしませんでした。 この例では、CentOS 5を搭載した稼働中のWebサーバーへのインストールが考慮されていることをすぐに言いたいと思います。 もちろん、目標とプラットフォームに応じて、実装は異なります。 サーバーがローカルホストでのテストと作業に使用されている場合、公式ドキュメントにはクイック構成の例が記載されています。







もちろん、すべてはインストールから始まります。 ここでも、問題は発生しません。 さまざまなタイプのパッケージとソースコードが公式Webサイトで公開されています。 ダウンロードして設定します。

次に、構成ファイルを準備し、使用するインターフェイスをAPEサーバーに伝える必要があります。

/etc/ape/ape.confファイルのServerセクションで、リッスンするポートとインターフェイスを指定する必要があります。



port = 6969

ip_listen = 69.65.59.1








外の世界へのポートを開くことを忘れないでください:



# iptables -I INPUT -p tcp --dport 9696 -j ACCEPT







そして、Cometサーバーを起動します。



# /usr/bin/aped --cfg /etc/ape/ape.conf







APEデーモンは実行されていますが、意図した目的に使用するには早すぎます。 正しく動作するには、サーバーが独自のサブドメインを選択し、DNS設定を少し調整する必要があります。

cPanelまたは別の同様のパネルを使用する場合も難しくありません。

私の場合、サブドメインが作成されました:



ape.matvey.co







次に、* .ape.matvey.coの形式のリクエストをape.matvey.coにリダイレクトするためのCNAMEレコード。



*.ape.matvey.co IN CNAME ape.matvey.co







これで、サーバーはクライアントと通信する準備ができました。



最初の申請



その後、公式サイトからJavaScriptフレームワークを取り出して、都合の良いときに解凍する必要があります。 apeClientJS.jsファイルで、サーバーに接続するためのパラメーターを指定する必要があります。 私の場合、次のようになりました。



APE.Config.baseUrl = 'http://matvey.co/apps/ape_test/jsf'; //

APE.Config.domain = 'matvey.co'; //

APE.Config.server = 'ape.matvey.co:6969'; // APE-








例として、Pythonで書かれた小さなアプリケーションを提供します。このアプリケーションは、APEを使用してクライアントに簡単なテキストメッセージを送信します。 Pythonスクリプトとデーモン間の接続は、httpプロトコルとInlinepushを介して行われます。 これについては、公式文書で詳しく説明されています。

そのため、最初にInlinepush構成にパスワードを入れます。 標準を使用できますが、明らかな理由により、これは推奨されません。 通常、「/ etc / ape / inlinepush.conf」にあります。

次に、Python'e(またはより便利なもの)で小さなスクリプトを作成し、必要なデータをポート6969経由でApeサーバーに送信します。 これを行うには、localhostに連絡する必要があります。



import urllib2

import json



server = 'http://127.0.0.1:6969/0/?'



cmd = [{'cmd': 'inlinepush',

'params': {

'password': 'inlinepass5923',

'raw': 'DATA',

'channel': 'testchannel',

'data': {

'msg': 'Hey ya!'

}

}

}]



url = server + urllib2.quote(json.dumps(cmd))

response = urllib2.urlopen(url)

print response.read()









起動後、次のようになります。



# python test_ape.cgi

[{"time":"1301331051","raw":"ERR","data":{"code":"401","value":"UNKNOWN_CHANNEL"}}]








この場合のERRという単語は、チャネルが空であり、誰にも使用されていないことを意味するだけです。

それでは、実際に機能する何かを試してみましょう。

開始するには、サーバーからメッセージを受信するシンプルなページ。

クライアントページのソース:



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >

<html xmlns= "http://www.w3.org/1999/xhtml" xml:lang= "en" dir= "ltr" lang= "en" >

<head>

<!-- APE. JSF. -->

<script type= "text/javaScript" src= "/apps/ape_test/jsf/apeClientJS.js" ></script>

</head>

<body>

<script type= "text/javaScript" >

var client = new APE.Client();

// -- , ,

function randomString(length) {

var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz' .split( '' );

var str = '' ;

for ( var i = 0; i < length; i++) {str += chars[Math.floor(Math.random() * chars.length)];}

return str;

}

// --

function createDiv(vartext) {

var _body = document .getElementsByTagName( 'body' ) [0];

var _div = document .createElement( 'div' );

var _text = document .createTextNode(vartext)

_div.appendChild(_text);

_body.appendChild(_div);

}

client.load();

client.addEvent( 'load' , function () {

// -- , name 15 . :)

client.core.start({ "name" :randomString(15)});

});

client.addEvent( 'ready' , function () {

createDiv( "Connected" );

client.core.join( 'testchannel' );

client.addEvent( 'multiPipeCreate' , function (pipe, options) {

});

// -- . .

client.onRaw( 'data' , function (raw, pipe) {

createDiv( 'Receiving : ' + unescape(raw.data.msg));

});

});

</script>

</body>

</html>




* This source code was highlighted with Source Code Highlighter .








<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >

<html xmlns= "http://www.w3.org/1999/xhtml" xml:lang= "en" dir= "ltr" lang= "en" >

<head>

<!-- APE. JSF. -->

<script type= "text/javaScript" src= "/apps/ape_test/jsf/apeClientJS.js" ></script>

</head>

<body>

<script type= "text/javaScript" >

var client = new APE.Client();

// -- , ,

function randomString(length) {

var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz' .split( '' );

var str = '' ;

for ( var i = 0; i < length; i++) {str += chars[Math.floor(Math.random() * chars.length)];}

return str;

}

// --

function createDiv(vartext) {

var _body = document .getElementsByTagName( 'body' ) [0];

var _div = document .createElement( 'div' );

var _text = document .createTextNode(vartext)

_div.appendChild(_text);

_body.appendChild(_div);

}

client.load();

client.addEvent( 'load' , function () {

// -- , name 15 . :)

client.core.start({ "name" :randomString(15)});

});

client.addEvent( 'ready' , function () {

createDiv( "Connected" );

client.core.join( 'testchannel' );

client.addEvent( 'multiPipeCreate' , function (pipe, options) {

});

// -- . .

client.onRaw( 'data' , function (raw, pipe) {

createDiv( 'Receiving : ' + unescape(raw.data.msg));

});

});

</script>

</body>

</html>




* This source code was highlighted with Source Code Highlighter .












これで、APEサーバー、inlinepushを介してデータを送信するアプリケーション、およびこれらのメッセージを受信するクライアントができました。

クライアントページを開いてサーバーでスクリプトを実行すると、次の答えが得られます。



[{"time":"1301340083","raw":"pushed","data":{"value":"ok"}}]







そして、クライアントは大事なものを出力します:



Receiving : Hey ya!







さまざまなパラメーターでスクリプトを実行した結果は、スクリーンショットに示されています。







次に、スクリプトに無限ループを追加し、タイムアウトを10秒にして、バックグラウンドで実行します。



# python test_ape.cgi > /dev/null 2>& 1 &











おわりに



この記事の目的は、かなり強力なツールであるCometモデルが実装の難しさを表していないことを、生きた例を使用して読者に示すことでした。



仕事の結果はここで見ることができます

10秒ごとに、サーバーからのメッセージが画面に表示されます。



おそらく今のところすべてです。 次の記事では、より深刻で実際に機能するアプリケーションについて書くことを考えています。

素材が誰かに役立ってくれたら嬉しいです。



便利なリンク



彗星-レビュー記事

APEの公式ウェブサイト



All Articles