WEBページとアプリケーションとで、情報のやり取りを行う方法を教えて下さい。


<環境>
サーバ側
 OS:Linux
 WEBサーバ:Apache
クライアント
 OS:特に指定なし
 WEBブラウザ:特に指定なし

サーバ側では、Apacheと別のアプリケーションBを起動させておきます。
(アプリケーションBは自分で作成したCのプログラムです。)

WEBページにアプリケーションBからの何らかのトリガーで、
変化を与えることが出来るでしょうか?
(例:scanfで文字入力を受け付けて、入力された文字をWEBブラウザ画面に表示させる等)

逆のパターンについては、以前、回答を頂いて実現出来たのですが、、、↓
>> [ブラウザ]-(http)->[Apache]-(STD I/O)->[CGI]-(ソケット通信)->[アプリケーションB]

逆の場合でも同じなのでしょうか?
そもそもCGIって、ブラウザからのアクションで動作しますよね?
だから、アプリケーションBの通知を待っている事は出来ない。。。

認識間違っていますか?
(CGI、初心者ですので、この辺の認識が危ういです。(CGIはPerlで実装する予定です。))

CGIの動作メカニズム?についての紹介されたページもあれば、
併せて教えて下さい。

以上、
よろしくお願いします。

回答の条件
  • URL必須
  • 1人3回まで
  • 登録:
  • 終了:2007/06/23 21:58:14
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:t_shiono No.1

回答回数256ベストアンサー獲得回数22

ポイント50pt

Webページの表示・更新のトリガーは、クライアントサイドのブラウザからのリクエストです。

そのため、サーバサイドのアプリケーションBによって、クライアントのブラウザの表示を変更することはできません。


ご希望の動作の実現としては、

・Webページ内で、タイマーなどで定期的に変化を確認(リロード、または、Ajaxの利用)

・アプリケーションBは状況の変化をCGIがアクセス可能なデータとして格納(DB、ファイルなど)

・CGIは格納されたデータを元に出力する

という3つの動作を行わせることになります。

ダミー(http://q.hatena.ne.jp/1182334464

id:futurista

>> Webページの表示・更新のトリガーは、クライアントサイドのブラウザからのリクエストです。

やはりそうでしたか。。。何となく、そんな気はしたのですが。

>> ・Webページ内で、タイマーなどで定期的に変化を確認(リロード、または、Ajaxの利用)

ここでの"リロード"とは、ブラウザ側でのユーザー操作ですね。

これだと意味がありませね。

"Ajax"は、よく知りませんが難しそうですね。。

2007/06/20 21:51:57
id:SALINGER No.2

回答回数3454ベストアンサー獲得回数969

ポイント50pt

厳密に言うとできます。

Cometという技術を使うことで、プラウザ上でリアルタイムチャットとかは実現できます。

リアルタイムチャットっていうのは、サーバ上のデータが更新されたタイミングで接続しているプラウザの表示を変えるので質問の意図にそいます。

仕組みはAJAXのXMLHTTPRequestをサーバ上で保持して、任意のタイミングでレスポンスを返すことで実現するのですが、

かなり高等技術でJavaとかで実現するようです。

他にも同じような技術でLingerとかもあります。

Lingerでリアルタイムチャットを実現してるサイトです。

http://www.lingr.com/room/masuda

まあ、難しい技術なんでできないと思っても問題ありません。

id:futurista

やはり難しいですか。

アプリケーションBがメインのお仕事で、WEB表示部分には、

あまり時間かけてられないので、手軽な方法ないかなと思っていたのですが。

2007/06/20 21:52:25
id:fuentebella No.3

回答回数269ベストアンサー獲得回数30

ポイント50pt

「WEBページにアプリケーションBからの何らかのトリガーで、変化を与える」ですが、サーバー上のもの( htmlファイルであれ、phpであれ)はアプリケーションBからhtmlファイルを生成するなどして書き換えられると思います。

しかしクライアントが見るWEBページは、サーバーから読み込んだもの(HTTPでGETした内容)=すなわちコピー=なので、サーバーから再読み込みしないとサーバーでの変更(htmlファイルの変更等)はクライアント側に反映されません。

サーバーからクライアント上のWEBブラウザに強制的に再読み込みさせる方法は思いつきませんが、はじめからwebページの中に、一定時間ごとに再読み込みさせるようなjavascriptを入れておけばいいのではないでしょうか。

5秒ごとに再読み込みするjavascript のサンプル

http://www.htmq.com/js/location_reload.shtml

質問の意図を勘違いしていたらすみません。

id:futurista

上記で、うまくいきそうな気が。。

「アプリケーションBからhtmlファイルを生成する」

は面倒そうですが、(今の技術で)出来なさそうでは無いですね。

そもそもページ更新(新規でページ表示する時も含む)のタイミングで、

CGIを実行することが出来れば、(ポーリングであるけど)

要求に近いものになりそうです。出来るのか?

2007/06/20 21:55:27
  • id:t_shiono
    もう解決されているかと思いますが、fuentebellaの考えと同じく、リロードはJavaScriptで自動的に行います。
    以下が参考になるかと。
    http://www5e.biglobe.ne.jp/~access_r/hp/javascript/js_091.html

    ページ全体を再描画してよいのであれば、十分かと思います。
  • id:openseed
    勘違いをしていたら、すみません。

    非同期で、「アプリケーションB」から、ブラウザに対して、「プッシュ配信」したいということでしょうか?
    ※ この場合は、他の方が回答されているように、AJAXや、JavaApplet、Flashを利用する必要があります。
    その場合でも、「アプリケーションB」からCGIを介して値を返却する処理は必要です。


    前回の質問から考慮すると、1HTTPリクエストの中で、「アプリケーションB」と通信を行い、「アプリケーションB」の結果を表示する1リクエストで完結する案件のように読み取れるのですが・・・。
    ※ アプリケーションBの実行時間は短い。


    その前提で以下を書かせてもらいます。
    ソケット通信でどのようなことをしているか分かりませんが、
    その通信の中で、「アプリケーションB」から、戻り値(文字列など)を受け取り、その値を直接ブラウザに返却することは出来ます。

    これは、「アプリケーションB」のインターフェース(プロトコル)の設計に依存します。
    ※ ソケット通信でも相互通信可能です。

    もし、今からでもインターフェース(プロトコル)の変更(追加)が可能であれば・・・。
    「アプリケーションB」の通信プロトコルを簡易HTTP1.0(最低限のGETリクエストの実装)としてしまい、CGIが php であれば、file_get_contents(localhostのURL指定) を利用したり、perl であれば、 wget などの外部コマンドを利用することで、容易に実現可能だと思います。

    ※ 負荷が高いサービスで、fast-cgi などで、コネクションを維持する必要があるときは、この方式では難しいかもしれません。


    参考になれば、幸いです。
  • id:openseed
    > そもそもCGIって、ブラウザからのアクションで動作しますよね?
    > だから、アプリケーションBの通知を待っている事は出来ない。。。
    即時反映させたいということでしょうか?
    それは出来ないですが、たとえば、「アプリケーションB」が、メッセージをプーリングしておき、CGIからのリクエスト(最終アクセス日時などをパラメータとする)があったときに、保持している値を返却することは出来ると思います。

    実現したいのは、そういうことだったのでしょうか?

  • id:SALINGER
    一言だけ
    t_shionoさんとfuentebellaさんが提示していることはそんなに違わないので、それぞれのコメントの違いはちょっと疑問です。
  • id:futurista
    >> t_shionoさん
    追加情報ありがとうございます。
    そんなJavaスクリプトがあるというのも知らなかったので。

    >> openseedさん
    コメントありがとうございす。

    すいません。もうっちょと正確にシステムを説明します。

    アプリケーションBは、常駐で動作しているものです。
    お天気を監視する表示するみたいなものでしょうか?
    WEB画面に表を使って幾つかの地域を示して、天気、温度、湿度などを表示します。アプリケーションBはお天気情報を収集しており、情報に変化があった場合、「東京 晴れ→雨」等と情報を送ります。そうすると、WEB画面 表中の東京の欄が「晴れ」→「雨」と変わる。こんなイメージです。


    コメントして頂いた内容は不勉強のため、幾つか不明なところがありました。もうちょっと勉強してから、再質問するなりさせて頂きたいと思います。


    >> SALINGERさん
    t_shionoさんのコメントでは「リロード」が、
    1.ユーザ-操作
    2.Ajax
    によってしか行えないと記述してあると思ったからです。
    (1.→仕様を満たさない。 2.→実装が難しそう。と思えた。)

    確かに内容は、ほとんど、同じですね。
    失礼しました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません