WebSocketの接続について

3,126 views
Skip to first unread message

@mitsuaki_i

unread,
Mar 20, 2011, 9:36:38 AM3/20/11
to html5-developers-jp
Chrome拡張の緊急地震速報(http://goo.gl/ON751)を作ったんですが
長時間のスリープから復帰したときにWebSocketの接続が元に戻らず困っています。

回避策として以下のようなコードを使っています。
var reload = 600000;
var before = new Date();
setInterval(function(){
var current = new Date();
if((current - before) > (reload + 15000)){
connect();// 新しい接続をする
}
before = current;
},reload);

特にイベント(onerror、onclose)も発火しないようで
スリープから復帰後もreadyStateには変わらず1が入ったままでした。

こういった場合のよりスマートな対処法は無いのでしょうか?

KOMATSU Kensaku

unread,
Mar 20, 2011, 11:52:26 AM3/20/11
to html5-dev...@googlegroups.com
小松です。

長時間つなぎっぱなしでのサービスの場合は、@mitsuakiさんの
コーディング例のようなケアが必要になると思います。


スリープまで、ケアしたことは無かったのですが、確かに
Extensionだとケアが必要ですよね。

サイレントクローズ(アプリが気づかないクローズ)の類だと思います。
例えば、ブラウザとサーバとの間にNATやFireWallがある場合、通信が
一定期間無い場合、リソース節約のためにそのセッションテーブルを
切ってしまうため、通信ができなくなってしまいます。この時、
ブラウザやサーバに「切ったよ」と伝えることは普通しないので、
readyStateを変えることもできず。。。といった感じです。
なので、一定間隔でデータを送信(ping)し、サーバから返信(pong)
を確認するキープアライブ処理が必要となります。
 #返ってこなかったら、再接続するみたいな。

Ajaxでは、あまり気にしなくても良かったネットワーク内のあれこれも
WebSocketでは気にしなくてはならなくなる。。。ってことかなと。


P.S. 最新のIETFの仕様では、プロトコルレベルでコネクションキープアライブが
規定されていますので、将来的にはjavascriptで書かなくてもよく
なるかもしれませんが。。。


2011年3月20日22:36 @mitsuaki_i <griffith100...@gmail.com>:

> --
> このメールは Google グループのグループ「html5-developers-jp」の登録者に送られています。
> このグループに投稿するには、html5-dev...@googlegroups.com にメールを送信してください。
> このグループから退会するには、html5-developer...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/html5-developers-jp?hl=ja からこのグループにアクセスしてください。
>
>

@mitsuaki_i

unread,
Mar 21, 2011, 12:18:51 AM3/21/11
to html5-developers-jp
ご返答ありがとうございます!


> スリープまで、ケアしたことは無かったのですが、確かに
> Extensionだとケアが必要ですよね。
最初は全く気にしていなかったのですが
(お知らせの内容が内容だけに)切れている事に気づきまして焦りました。

> サイレントクローズ(アプリが気づかないクローズ)の類だと思います。
> 例えば、ブラウザとサーバとの間にNATやFireWallがある場合、通信が
> 一定期間無い場合、リソース節約のためにそのセッションテーブルを
> 切ってしまうため、通信ができなくなってしまいます。
なるほど。そういった事が起こるんですね。
凄く勉強になりました!ありがとうございます!

> Ajaxでは、あまり気にしなくても良かったネットワーク内のあれこれも
> WebSocketでは気にしなくてはならなくなる。。。ってことかなと。
>
> P.S. 最新のIETFの仕様では、プロトコルレベルでコネクションキープアライブが
> 規定されていますので、将来的にはjavascriptで書かなくてもよく
> なるかもしれませんが。。。
確かにAjaxのときはイベントやタイマーがベースだったのもあり
あまりネットワークの事は気にしてなかった自分に反省しました。


仕様に期待しつつがんばります!
ありがとうございました!


On 3月21日, 午前12:52, KOMATSU Kensaku <kensaku.koma...@gmail.com> wrote:
> 小松です。
>
> 長時間つなぎっぱなしでのサービスの場合は、@mitsuakiさんの
> コーディング例のようなケアが必要になると思います。
>
> スリープまで、ケアしたことは無かったのですが、確かに
> Extensionだとケアが必要ですよね。
>
> サイレントクローズ(アプリが気づかないクローズ)の類だと思います。
> 例えば、ブラウザとサーバとの間にNATやFireWallがある場合、通信が
> 一定期間無い場合、リソース節約のためにそのセッションテーブルを
> 切ってしまうため、通信ができなくなってしまいます。この時、
> ブラウザやサーバに「切ったよ」と伝えることは普通しないので、
> readyStateを変えることもできず。。。といった感じです。
> なので、一定間隔でデータを送信(ping)し、サーバから返信(pong)
> を確認するキープアライブ処理が必要となります。
>  #返ってこなかったら、再接続するみたいな。
>
> Ajaxでは、あまり気にしなくても良かったネットワーク内のあれこれも
> WebSocketでは気にしなくてはならなくなる。。。ってことかなと。
>
> P.S. 最新のIETFの仕様では、プロトコルレベルでコネクションキープアライブが
> 規定されていますので、将来的にはjavascriptで書かなくてもよく
> なるかもしれませんが。。。
>
> 2011年3月20日22:36 @mitsuaki_i <griffith1007challen...@gmail.com>:

Toshiro Takahashi

unread,
Mar 31, 2011, 11:09:10 PM3/31/11
to html5-dev...@googlegroups.com
高橋登史朗です@少し落ち着いてきました^^


皆様は大丈夫でしたでしょうか。被災された方々には心からお見舞い申し上げま
す。

うちも茨城で震度6弱エリア付近でしたので WebSocket 用の socketapi.com
含めてサーバーが2台とPCが少し壊れましたが、なんとかほぼ復旧し、ようやく
落ちついてきました。次は復興へ向けて頑張ろうかなと思います^^。

さて、最近は空間線量も下がってきましたが、関東含め福島近県では特にお子さ
んのいらっしゃる家庭では心配してるかなぁと思います。

でも、ガイガーカウンターの値を常時見ているわけにも行かないので、、、

防災Nネットさんの空間放射線量率を JSON化 して (復旧した!) socketapi.com
の WebSocket で10分毎に流してみました。

http://socketapi.com/user/atom/1/ref.htm

こんな感じです。

[環境防災Nネット]→[WSクライアント(送信専用)JSONへ加工]
                ↓
             [WSサーバーで中継]
              ↓↓↓↓↓↓↓
        [WSクライアント(受信専用)JSONを加工]

まぁ、データデータは勝手に取得してますので、このJSONの仕様は防災Nネット
からのデータが変われば変わる可能性があります。また、提供を継続できるとい
う保証もありません。

一応、加工したサンプルはたとえばこんな感じです。

放射線量(ナノグレイ値/時)だけを自動更新 10分毎
http://socketapi.com/user/atom/1/sample3.htm

あと、@mitsuaki_iさんの、緊急地震速報(http://goo.gl/ON751)にリスペクト
しつつ、今夜あたり、Chrome拡張で指定した地域の放射線量が指定した値に変化した時、 お
知らせノーティフィケーションを表示するというのをアップしようかなぁと思っ
てます。

--
高橋登史朗

Toshiro Takahashi

unread,
Apr 1, 2011, 1:05:13 AM4/1/11
to html5-dev...@googlegroups.com
高橋登史朗です@少し感動中

コマンドラインからJavaScriptを使用してWebKitをブラウザなしで操作できるPhantomJS
を試してみたら、WebSocketが簡単に動作しました!

PhantomJS
http://www.phantomjs.org/

PhantomJS - 姿の見えないブラウザをコマンドラインから操作
http://dendro.screw-axis.com/phantomjs

Winならダウンロードして
phantomjs パスto\hello.js
という感じで動きます。

試したのは先ほど書いた、
http://socketapi.com/user/atom/1/sample1.htm
のJSだけ取り出し、ws.jsなどとしてファイルしたものです。

とりあえず、こんな↓コードですけど、今もWinのコマンドプロンプト上で受信
したJSONを出力中です。

//WebSocketサーバーへの接続とインスタンス生成
var ws = new WebSocket("ws://socketapi.com/api/atom/1");

//サバーから受信した時の動作
ws.onmessage = function(msg) {

//受信データを表示する
console.log( "-----" + msg.data);
};


//ハートビート 1分毎に接続継続用の信号を送信 (5)
var hbtimer = setInterval(
function(){ws.send("Heartbeat")}
,50000);


#WebSocketのクライアント処理に限らずいろいろ出来そう。。

--
Toshiro <Takahashi>

Toshiro Takahashi

unread,
Apr 1, 2011, 7:44:03 AM4/1/11
to html5-dev...@googlegroups.com
高橋登史朗です

> あと、@mitsuaki_iさんの、緊急地震速報(http://goo.gl/ON751)にリスペクト
> しつつ、今夜あたり、Chrome拡張で指定した地域の放射線量が指定した値に変化した時、 お
> 知らせノーティフィケーションを表示するというのをアップしようかなぁと思っ
> てます。

ということで、とりあえず作ってみました。

Chrome拡張 放射線量率モニタ
https://chrome.google.com/extensions/detail/cnmonfpkkmdhagghighdnkmjcajegfki?hl=ja

一応、notificationは10秒で消えますが、今はエリアごとのレンジが広いので、
ちょうど良い具合の設定が難しいかもです。

> --
> このメールは Google グループのグループ「html5-developers-jp」の登録者に送られています。
> このグループに投稿するには、html5-dev...@googlegroups.com にメールを送信してください。
> このグループから退会するには、html5-developer...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/html5-developers-jp?hl=ja からこのグループにアクセスしてください。

--
Toshiro Takahashi
高橋登史朗
http://allabout.co.jp/internet/javascript/profile/mbiopage.htm
Blog: http://jsgt.org/mt/01/
Twitter: http://twitter.com/toshirot

Toshiro Takahashi

unread,
Apr 3, 2011, 11:18:33 PM4/3/11
to html5-dev...@googlegroups.com
高橋登史朗です

デベロッパーが何かしたくても基礎データが手に入らないことであきらめるケー
スは多いと思いますが、放射線モニター関連の基礎データの情報共有を行ってい
るなかなか良いページがありましたので、ご存知かもしれませんけれど紹介しま
す。

「放射線モニターデータのまとめページ」
https://sites.google.com/site/radmonitor311/

有志でメンテナンスされている機械可読データ(CSV, TSV, JSONなど)、API、ス
プレッドシートなどデータベースへのリンクもあります。

状況を正しく「楽観」でも「悲観」でもなく冷静に理解するには、信頼できる
複数の情報(あるいは、複数の視点を知ることで信頼性の上がる状況)が必要であ
るなぁ、と思う今日この頃です。

On Fri, 01 Apr 2011 12:09:10 +0900
Toshiro Takahashi <ta...@game.gr.jp> さん wrote:

> --
> このメールは Google グループのグループ「html5-developers-jp」の登録者に送られています。
> このグループに投稿するには、html5-dev...@googlegroups.com にメールを送信してください。
> このグループから退会するには、html5-developer...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/html5-developers-jp?hl=ja からこのグループにアクセスしてください。

--
高橋登史朗
@toshirot Japan
http://allabout.co.jp/gm/gp/333/

Reply all
Reply to author
Forward
0 new messages