スポンサーサイト


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

HTTP-in(http server)を試してみる -応用編-


※今回はGoogle App Engineや、外部のサンプルソースも使用しています。それらの使用規約などをしっかり確認してください。
※あくまでもサンプルと言うことで簡単にしているので、エラー処理などは全く考えていません。
※自分の環境でこうやったら動いたと言う話なので、自己責任で試してください。
※でも、ここはこうした方が良いよと言うことがあれば指摘していただけると幸いです。

参考:
いろいろ出来そうなんだけど、使い方が難しそうだぞHTTP-in
HTTP-in(http server)を試してみる -基礎編-

基礎編に書いたのですが、HTTP-inの問題としては通信したいプリムに割り当てられているURLが不変ではなく、コロコロ変わってしまうという点にありました。

これは海外のユーザも認識しているようで、Second Life WikiのLSL http serverのページ日本語概略はこちら)から、Google App Engineで利用されているDynamic DNSサービスを使ったフォーラムにリンクが張られていました。

・・・が、はっきり言ってかなりめんどくさいです。
試してみたい方は頑張ってくださいね。
フォーラムのリンクをしっかりと読むこともお勧めします。

 

1.ソースファイルダウンロード
ここからソースファイルをダウンロードします。
これはLSLではなく、Google App Engineに使用するものです。

 

2.Google App Engineにサインアップ
ここからGoogle App Engineにサインアップしておきましょう。
どこまで進んで良いのかよく分かりませんでした(笑)。
一応携帯メール登録して、コード番号登録するところまでやったのかな?

 

3.Python 2.5をインストール
ここからPython 2.5.4をダウンロード、インストールしておきます。
もっと新しいバージョンがあるのですが、フォーラムの説明にあわせてこのバージョンを入れておきました。

 

4.Google App Engine SDKをインストール
ここからGoogle App Engine SDKをダウンロード、インストールしておきます。
うちの環境だと、「C:\Program Files\Google\google_appengine」にインストールされました。

 

5.ソースファイル展開
いまGoogle App Engine SDKをインストールしたフォルダの下に、「lsl-dns」と言うフォルダを作成します。
「C:\Program Files\Google\google_appengine\lsl-dns」フォルダ内に、1.でダウンロードしたソースファイルを展開します。

「dns.py」と「app.yaml」があればOKです。

 

6.app.yamlを編集
app.yamlをテキストエディタなどで開き、1行だけ編集します。

application: YOUR-APP-NAME-HERE

ここを重複しないような、わかりやすい名前にしておきましょう。
使える文字が決まっているので注意しましょう(半角小文字、数字、一部の記号。空白はNG)。

以下の説明では、

application: yourappname

としておきます。

※実際にはこの名前で登録していないので、アクセスできません。

 

7.Google App Engineに登録
「C:\Program Files\Google\google_appengine」フォルダからコマンドプロンプトで以下のコマンドを実行します。

appcfg.py update lsl-dns/

問題がなければ、登録するために2.で使用したE-Mailとパスワード入力をして登録完了です。

 

ここまで来てようやく下準備完了です・・・

以上を行うと、Second Life内からLSLでllHTTPRequestすることで色々できるようになります。
また、WebブラウザからURLを入力しても確認することができます。

http://yourappname.appspot.com/?type=add&name=[NAME]&url=[URL]
[Name]にプリムを識別するための固有の名称を、[URL]にプリム固有のURLをセットすることで、プリム固有のURLを保管してくれます。

http://yourappname.appspot.com/?type=remove&name=[NAME]
[Name]にプリムを識別するための固有の名称をセットすることで、保管したプリム固有のURLを削除します。

http://yourappname.appspot.com/?type=update&name=[NAME]&url=[URL]
[Name]にプリムを識別するための固有の名称を、[URL]にプリム固有のURLをセットすることで、保管されているプリム固有のURLを更新してくれます。

http://yourappname.appspot.com/?type=retrieve&name=[NAME]
[Name]にプリムを識別するための固有の名称をセットすることで、保管したプリム固有のURLを検索します。

http://yourappname.appspot.com/[Name]
[Name]にプリムを識別するための固有の名称をセットすることで、保管したプリム固有のURLへリダイレクトします。

http://yourappname.appspot.com/?type=list
保管されている[Name]の一覧を表示します。

準備ができたので、Second Life内での作業に入っていこうと思います。

今回のイメージですが

20090905_002
こんな感じになります。

 

a.サーバプリム側のスクリプト

   1: string url = "";
   2: string service_name = "kagamitest";
   3:  
   4: setup()
   5: {
   6:     llSetObjectName("HTTP Server");
   7:     url = "";
   8:     llRequestURL();     // 固有のURL取得
   9: }
  10:  
  11: default
  12: {
  13:     state_entry() {
  14:         setup();
  15:     }
  16:     
  17:     on_rez(integer n) {
  18:         setup(); 
  19:     }
  20:  
  21:     changed(integer c) {
  22:         if (c & (CHANGED_REGION | CHANGED_REGION_START | CHANGED_TELEPORT) ) {
  23:             setup();
  24:         }
  25:     }
  26:  
  27:     http_request(key id, string method, string body)
  28:     {
  29:         if (method == URL_REQUEST_GRANTED) {        // URL取得時
  30:             llSay(0,"Request REQUEST_GRANTED Method");
  31:             url = body;
  32:             llHTTPRequest("http://yourappname.appspot.com/?type=add&name=" + service_name + "&url=" + llEscapeURL(url),[],"");      // 固有URLを登録
  33:         } else if (method == "POST") {              // 外部からの通信時
  34:             llSay(0,"Request POST Method");
  35:             llHTTPResponse(id, 200, "Hello, " + llKey2Name((key)body));
  36:         }
  37:     }
  38: }

このようになります。このソースはフォーラムにあったサンプルソースを元にしています。

2行目でセットしているのが、先ほどの機能説明の部分で言う[Name]の部分になります。
分かるような名前を付けておきましょう。

今回のソースでは、entry時(13行目)、Rez時(17行目)、変更時(21行目)に固有のURLを取得する処理に行っています。

27行目からがプリム固有のURL取得時と、外部からの通信時の処理になります。

29行目からがプリム固有URL取得時で、32行目で追加を行っています。
ちょっと分からないのが、ここの処理が「?type=add」で良いのか?と言うところです。
いったん保管されているのであれば、「?type=update」もしくは「?type=remove」してから「?type=add」の方が問題がない気がします。

今回はサンプルなので非常に簡略化されていますが、こういった点には注意が必要そうです。

33行目からは、外部のプリムから通信があったときの処理になります。
今回はタッチしたアバターのKeyを受け取って、名前に変更して返信することにします(一応サーバ側で何らかの処理をしないとわかりにくいと思ったので・・・)。

 

b.クライアント側のスクリプト

   1: string SL_URL="http://yourappname.appspot.com/?type=retrieve&name=kagamitest";
   2: string SL_URL2="";
   3: key AV_key;
   4: key requestid;
   5:  
   6: default
   7: {
   8:     touch_start(integer total_number) {
   9:         AV_key = llDetectedKey(0);
  10:         state http_proc;
  11:     }
  12: }
  13:  
  14: state http_proc
  15: {
  16:     state_entry(){
  17:         requestid = llHTTPRequest(SL_URL,[],"");    // サーバプリムアクセス用URLを取得
  18:     }
  19:     
  20:     http_response(key request_id, integer status, list metadata, string body) {
  21:         if (request_id == requestid){
  22:             if ( status == 200 ){                   // 正常時
  23:                 llSay(0,"Server Prim URL:"+body);
  24:                 SL_URL2=body;  
  25:                 state http_proc2;                   // サーバプリムとの通信の処理へ
  26:             } else {
  27:                 llSay(0, "Server Prim URL not found");
  28:                 state default;
  29:             }
  30:         }
  31:     }
  32: }
  33:  
  34: state http_proc2
  35: {
  36:     state_entry(){
  37:         requestid = llHTTPRequest(SL_URL2,[HTTP_METHOD,"POST"], AV_key);    // サーバプリムアクセス
  38:     }
  39:     
  40:     http_response(key request_id, integer status, list metadata, string body) {
  41:         if (request_id == requestid){           // 通信が返ってきたとき
  42:             if ( status==200 ) {                // 正常時
  43:                 llSay(0, body);
  44:             }
  45:         }
  46:         state default;
  47:     }
  48: }

このようになります。

1行目で、プリム固有URL取得用の処理をするURLをセットしています。

http://yourappname.appspot.com/kagamitest

のようにして、直接リダイレクトで通信していないのは、私のやり方が悪いのかその方法だとllHTTPRequestしたときにPOSTができないのです。
もちろん、呼び出して返事を取得するだけでも良いのですが、他に応用することも考えて何らかのパラメータを渡せるような方法にしました。

プリムにタッチすると14行目以降のstateに変化します。

 

14行目からここでプリム固有のURLを取り出す処理に入ります。
返信があると20行目以降の処理に入ります。

サーバプリムから通信が返ってくると、20行目のhttp_responseメソッドが実行されます。
21行目のように、送信時のidと比較して一致すれば対になる処理となるので先に進みます。

ステータスが正常(200)であれば、URLが取得できているはずなので、それを変数に代入して34行目以降のstateに変化します。一応そのURLをSayさせてみました。
ステータスがそれ以外(本当はエラーコードとかちゃんと見るべきだと思います)の時は、エラーメッセージを表示して、defaultにstateを戻します。

 

34行目からはサーバプリムに通信を行います。
サーバプリムから通信が返ってくると、40行目のhttp_responseメソッドが実行されます。
41行目のように、送信時のidと比較して一致すれば対になる処理となるので先に進みます。

42行目でステータスが正常(200)であれば結果をSayして、defaultに戻ります。
ここで言う200は、サーバ側のスクリプト35行目で渡している200(HTTP処理正常終了コード)を表しています。
もしエラーコードによる処理を入れたければ、ここに記述するようになります。

 

クライアントプリムにタッチすると

[07:07]  HTTP Client: Server Prim URL:http://sim2151.agni.lindenlab.com:12046/cap/a6961481-9569-8562-944a-71c7cf0910df
[07:07]  HTTP Server: Request POST Method
[07:07]  HTTP Client: Hello, Kagami Kohime

という感じにメッセージが表示されます。

どんな処理をしているのか知りたい場合は、ソース内に変数をSayする処理などを入れてみると良いかもしれませんね。

かなり面倒な手続きが必要になりますが、固有URLの処理をサーバプリムだけですればいいのはとても便利ではないでしょうか。

クライアント側は、「yourappname」と[Name]に該当する部分さえ変更しなければ良いことになりますしね(と言うかここは変更しないことが前提になると思います)。

オブジェクトの配布などに使ってみたいという方もいると思いますが、Google App Engineの無料使用できる範囲内などをきちんと確認しておきましょう(短いテキストのやりとりしかないので、問題ないとは思いますが)。

スポンサーサイト

テーマ : セカンドライフ - ジャンル : オンラインゲーム

タグ : セカンドライフ Second Life SecondLife

コメント
コメントの投稿
管理者にだけ表示を許可する

FC2カウンター
プロフィール

Kagami Kohime Kagamin_Super

Author:Kagami Kohime

Second Life内では身長140cmのチビッコ。
最近みんなからは「かがみん」と呼ばれています。

これまで獲得した称号
「イベント王女」「誤爆女王」


Kagami Kohime Original Brand Shop「KagamiN-YA」もよろしくお願いします。

↓お店の位置はこちら
★音の森店

Second Life Marketplaceでのオンラインショッピングはこちらです

管理用リンク

最近の記事+コメント
最近のトラックバック
ブログ内検索
カレンダー(月別)
05 ≪│2017/06│≫ 07
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -
カテゴリー
RSSフィード
QRコード
QRコード
メールフォーム

名前:
メール:
件名:
本文:

お遊び系のブログパーツ
★このFacebookプロフィール貼っておけば、毎回中の人男で・・・とか説明しなくて良いでしょうか・・・?
Katsumi Kenichi

バナーを作成

★ニコ動にアップした動画など


★ブログに妖精が・・・住み着いたようです・・・


★これまで入れたどのブログパーツよりも人気あるな、これ・・・


★XBox360好きなのですよ~。


★Second Lifeを起動していても、まだPCには余力があったりします。その余力をBOINCを使って社会貢献に役立ててみませんか?
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。