socket-ioを利用したデータの受け渡しについて

1,864 views
Skip to first unread message

matton

unread,
Jan 23, 2013, 9:03:59 PM1/23/13
to node...@googlegroups.com
お世話になります。 松尾と申します。

node.jsにて下記の様な仕組みを作成しております。

現在、バッチプログラム(vs.net C#)にてDB監視を行い、結果をクライアントに通知する仕組みを作成しています。
監視バッチ→node.js→ios/android
として、node.js→ios/androidはリアルタイム通知の為、soket-ioを使用しています。(※ちなみに監視バッチ→node.jsはwebsocketが使用できない為、URLにてデータを渡しています。http://xxx?1=a&2=B
node.js内でアクセスされたURL引数をJSONに変換してクライアントへsocket-ioにて一斉配信しています。

とりあえず動いてはいるのですが、URLで受け取ったデータをsocket-ioにて配信する際、一度、自分自身のsocket-ioにconnectしてsocketにセットしています。
connectが非同期となる為setTimeoutを利用している為、サーバの負荷次第ではconnect処理(serversocket1)を配信処理(serversocket2)が追い越してしまうと考えています。

何か良い制御方法は無いのでしょうか?

よろしくお願いします。

環境
windows2003 sp2
node v0.8.17


メイン部分のソースです。
-------------------------------------------------------------------------------------------
var http = require("http");
var url = require("url");

var socketval = 0;

  
function start(route,handle){
    var query = "";
    function onRequest(request,response){
        var queryData = url.parse(request.url, true).query;
        var url_parts = url.parse(request.url,true);
        query = url.parse(request.url, true).query;
        var pathname = url.parse(request.url).pathname;
        if(socketval===0){
            setTimeout(function(){serversocket1("Appname",query)},1);
        };

            setTimeout(function(){serversocket2("Appname",query)},1000);
        request.setEncoding("utf8");
            
        request.addListener("end",function(){
            route(handle,pathname,response);   
        });
    }
    
    var server = http.createServer(onRequest).listen(8080);
    //console.log("Serevr has sterted.");
    
    // socket.io
    var io = require('socket.io').listen(server);


    var archiveMessages = {};
    var channels = ['Appname'];
    
    var appname = io.of('/appname');
    var socket = "";
    var socket_c = "";
    appname.on('connection', function(socketin){
        console.log('connected: %s', socket.id);
        socket = socketin;
    
        // push available channel list
        socket.emit('available_channel', channels);
    
        socket.on('join', function(value){
            console.log('%s joined channel: %s', socket.id, value.channelId);
    
            socket.join(value.channelId);
        });
        socket.on('join_c', function(value){
            console.log('clientjoin %s joined channel: %s', socket.id, value.channelId);
    
            socket.join(value.channelId);
            socket_c = socket;
            socketval=1;
        });
    
        socket.on('post', function(message){
            socket.get('channel_id', function(err, channelId){
                console.log(' %s says<%s channel>: %s', socket.id, channelId, message);
    
            });
        });
    
        socket.on('disconnect', function(){
            console.log('%s disconnected', socket.id);
            socket.get('channel_id', function(channelId){
                socket.leave(channelId);
            });
        });
        
    });

    var io_c = require('socket.io').client;
    var appname_c = "";
    function serversocket1(channelId,data){
        var appname_c_1 = io_c.connect('http://localhost:8080');
        appname_c = appname_c_1.of('/appname');

        appname_c.emit('join_c', {
          channelId: 'Appname'
        });
        
    }
    function serversocket2(channelId,data){
        socket_c.set('channel_id', channelId, function(){
          socket_c.emit('posted', data);
          socket_c.broadcast.to(channelId).emit('user:message', data);
        });
    }
};

exports.start = start;
------------------------------------------------------------------------------------------------



小林秀和

unread,
Jan 24, 2013, 5:36:23 AM1/24/13
to node...@googlegroups.com
KOBA789 です。

指摘したい点はたくさんありますが、まず1点だけ失礼します。
なぜ、わざわざ setTimeout による時間差によって実行順序を指定するということをしているのでしょうか。
素直に考えて、コールバックをネストさせることで対応するのが最善だと思うのですが、そうしなかった理由を教えていただきたいです。その理由知ることでより踏み込んだアドバイスができると考えています。

2013年1月24日 11:03 matton <matsuo...@gmail.com>:
> --
>
>
>

matton

unread,
Jan 24, 2013, 6:28:31 AM1/24/13
to node...@googlegroups.com
KOBA789さん返信ありがとうございます。

はじめにnode初めて間もない為、ソースが汚く申し訳ございません。

setTimeoutを使用している理由は"serversocket1"にてクライアント(自分)→サーバ(自分)にjoinを行っているのですが、サーバ側の処理(socket.join)が終わる前に"serversocket2"が動くと"socket_c"が空の状態となる為、setTimeoutを用いています。
※"socket_c"は"socket.join"にてセットしています。
 http.createServerの処理とsocket.io間でコールバックをネストさせる方法はわかりませんでした。

お手数ですが、アドバイスよろしくお願いします。


2013年1月24日木曜日 19時36分23秒 UTC+9 KOBA789:

小林秀和

unread,
Jan 24, 2013, 8:33:49 AM1/24/13
to node...@googlegroups.com
KOBA789 です。

なるほど、問題点の本質がわかりました。
まず、Socket.IO の仕様をよく知った方がよいかと思います。標準機能を適切に活用することで解決できる問題は多くあります。自身に接続してチャンネルに
join している点に関してはこれで解決できます。
また、現状の外側のスコープの変数による状態の受け渡しでは、ロックが必要になってしまいますし、クロージャを使える JavaScript
を用いた実装としては素直ではありません。はっきり言って悪い実装ですから避けなければなりません。なお、変数に無駄なスコープを持たせないことはバグの発見の容易さや、バグの回避につながります。
最後に重箱の隅をつつくようで申し訳ありませんが、変数の初期化に空文字列を乱用するのは避けたほうがよいでしょう。型に合わせた初期化をすることで、VM
はメモリ確保に関して最適化をします。ですから、不適切な型による初期化はパフォーマンス劣化につながります。
以上の点を踏まえてソースを書き直すと以下のようにできるかと思います。ただ、typo
と考えられるものなどがいくつかあり、ソースの真意が読めない部分が多いため、どうしても多くを憶測で書いてしまいました。挙動が異なってしまっていたら申し訳ありません。

======================================================================

var http = require("http");
var url = require("url");

function start(route,handle){
function onRequest(request,response){
var queryData = url.parse(request.url, true).query;
var url_parts = url.parse(request.url,true);
var query = url.parse(request.url, true).query;
var pathname = url.parse(request.url).pathname;

serversocket2("Appname",query);
request.setEncoding("utf8");

request.addListener("end",function(){
route(handle,pathname,response);
});
}

var server = http.createServer(onRequest).listen(8080);
//console.log("Serevr has sterted.");

// socket.io
var io = require('socket.io').listen(server);


var archiveMessages = {};
var channels = ['Appname'];

var appname = io.of('/appname');
appname.on('connection', function(socket){
console.log('connected: %s', socket.id);

// push available channel list
socket.emit('available_channel', channels);

socket.on('join', function(value){
console.log('%s joined channel: %s', socket.id, value.channelId);

socket.join(value.channelId);
socket.set('channel_id', value.channelId);
});

socket.on('post', function(message){
socket.get('channel_id', function(err, channelId){
console.log(' %s says<%s channel>: %s', socket.id, channelId, message);

});
});

socket.on('disconnect', function(){
console.log('%s disconnected', socket.id);
socket.get('channel_id', function(channelId){
socket.leave(channelId);
});
});

});

function serversocket2(channelId,data){
appname.in(channelId).emit('user:message', data);
}
};

exports.start = start;

2013年1月24日 20:28 matton <matsuo...@gmail.com>:
> --
>
>
>

matton

unread,
Jan 24, 2013, 9:18:19 AM1/24/13
to node...@googlegroups.com
KOBA789 さん ご丁寧にありがとうございます。

まず、socket.ioの標準機能を再度確認致します。
自身に接続してチャンネルに join している部分を見直します。
変数の件、知りませんでした。ありがとうございます。
また、typo と思われたのは"_c"付きの部分のことだと思います。
socket_c ” とか "join_c"です。
URL引数にてデータを受け取る為、データ受信の回数分http.createServerが行われるのでその都度ではなく、自身に接続してチャンネルに joinは一度だけとする為の部分です。
それで最適な方法が思いつかず、外側のスコープの変数による状態の受け渡しを行ってしまった次第です。

明日になりますが、ソース見直し致します。

よろしくお願いします。


2013年1月24日木曜日 22時33分49秒 UTC+9 KOBA789:

Jxck

unread,
Jan 24, 2013, 11:36:16 AM1/24/13
to node...@googlegroups.com
Jxck です。

KOBA からのでいいかなと思ったんですが、
一応書いたので置いておきます。

最初は正直何がしたいのかよくわかりませんでした。
ただ、話を聞いてる感じだとやろうとしていることに対して、
やってることが過度に複雑なだけのようだったので。
(同じサーバなのに、わざわざ自分自身にソケットを経由するとか)

KOBA のも参考にしつつこんな感じかと。
(コメントを読んで下さい。)



拙作ですが、翻訳してるのでこちらもご参考まで。


Jxck

matton

unread,
Jan 24, 2013, 11:33:47 PM1/24/13
to node...@googlegroups.com
Jxckさん KOBAさん ありがとうございます。

(同じサーバなのに、わざわざ自分自身にソケットを経由するとか)
バッチからのURLデータ渡しをクライアント処理と思い込んでいたのが問題でした。
なのでクライアントとして接続する必要があると考え、ソケット経由に・・・
そんな必要ないですね。

添付のソースで動く様になりました。ありがとうございます。
※現在mysqlの認証コードが入っています。

ただ一点Jxckさんのindex.htmlに通知が届きません。
結構嵌ってしまいました・・・
"channels.pop()" じゃなくて"{channelId: channels}"じゃ無いとサーバ側で判断できなかったみたいです。
あとlocalhost・・・ほかのpcから動かしてました。

一通り、処理の内容を理解することができました。

ありがとうございました。

で、もうひとつ質問なんですが・・・disconnectしていないソケットってどうなるんですか?
webは無理ですが、iphoneやandroidで接続した場合、nodeを停止して起動しても再度接続されます。
もしかするとiphoneやandroidは接続しっぱなしだけかもしれませんが。

なにか情報があれば教えて頂けないでしょうか?

申し訳ございません。質問ばかりで


2013年1月25日金曜日 1時36分16秒 UTC+9 Jxck:
server.js

Shigeki Ohtsu

unread,
Jan 25, 2013, 3:53:08 AM1/25/13
to node...@googlegroups.com
大津です。

ご本人が解決しているんですが、サンプルを作りかけだったので私の意見を。

# この質問を元に自分主催のNode.js勉強会の課題を作らさせていただきまし
た。ありがとうございます。

(2013/01/25 13:33), matton wrote:
> (同じサーバなのに、わざわざ自分自身にソケットを経由するとか)
> バッチからのURLデータ渡しをクライアント処理と思い込んでいたのが問題でした。
> なのでクライアントとして接続する必要があると考え、ソケット経由に・・・
> そんな必要ないですね。

私も最初なぜ?? と不思議に思ってたのですが、よくよく考えてみるとそれほ
どおかしいことではないんじゃないかと思い始めました。

DB監視のエージェントの方は WS をしゃべれないわけで、 HTTP GET <-> WS の
リレーを作って接続するのは*あり*じゃないかなと思います。(今回たまたま
ローカルで同じポートだっただけ)

監視エージェントを受けるロジックと、端末への配信ロジックをきっちり分けら
れれば、今後様々な監視端末からの情報を受け取ったりする拡張も容易になる
し、各種 room や channelId の使い分けもやりやすくなるんじゃないかと思い
ます。

以前のコードの一番問題点は、

socket_c = socket;

の部分で、2つのロジックをごちゃごちゃにしている元凶じゃないかかと個人的
には見てます。

ということで、私の方でサンプルの方を作ってました。

https://gist.github.com/4632789

roomserver.js (端末配信用)
wsrelay.js (監視エージェントの HTTP GET -> WS リレー用)

の2つのモジュールからなっています。

それぞれ別々に動作させることもできますし、 start.js では両方とも同じ
port で動作させています。
(index.html は Jxck さんのを拝借して少し変えました。)

まぁいろいろ賛否両論あるとは思いますが、こういうアプローチもあるというこ
とで、皆さんのフィードバックがあるとうれしいです。

> で、もうひとつ質問なんですが・・・disconnectしていないソケットってどうな
> るんですか?
> webは無理ですが、iphoneやandroidで接続した場合、nodeを停止して起動しても
> 再度接続されます。
> もしかするとiphoneやandroidは接続しっぱなしだけかもしれませんが。

確か http.Server サーバのセッションは 2分ぐらいのアイドルタイムアウトが
あったけど WS で upgrade するとずっと接続しっぱなしだと思います。

今回 disconnect の処理を入れませんでしたが、タイムアウト処理ぐらいはいれ
るべきかなと思ってます。

yusuke

unread,
Jan 25, 2013, 6:55:34 AM1/25/13
to node...@googlegroups.com
Jxck です。

自分のは動いてます。

> "channels.pop()" じゃなくて"{channelId: channels}"じゃ無いとサーバ側で判断できなかったみたいです。
元のソースは value を受け取って value.channelId だかになってましたが、オブジェクトである必要が無かったので、
自分のは文字列だけ送ってます。写し?間違えかと。コメントも読んでください。

> あとlocalhost・・・ほかのpcから動かしてました。
https://gist.github.com/4624554#comment-750044 コメント読んでもらってます?

元のソースが(クライアントは無かったけど) localhost ベタ書きだったんで合わせたんですが。。
ちなみに Socket.IO の connect は同一オリジンならパスだけで良いです。
ルートなら引数すらいらない。

io.connect("http://localhost:3000") => io.connect();

書いちゃうとデプロイする時困るので、同一ホストの場合は書かないのが普通です。
(って話をコメントで指摘して修正しておくべきだったのか。。)


> で、もうひとつ質問なんですが・・・disconnectしていないソケットってどうなるんですか?
これなんか引っかかるんですが、 Socket.IO の disconnect してない接続という意味ですか?


> webは無理ですが、iphoneやandroidで接続した場合、nodeを停止して起動しても再度接続されます。
> もしかするとiphoneやandroidは接続しっぱなしだけかもしれませんが。
再接続って Socket.IO のリトライによる再接続のことですか?
Socket.IO は Socket.IO の接続が切断しても、何度もリトライしてサーバが復活したら再接続します。
"webはムリですが" の web ってたぶん PC ブラウザのこと?だと思うんですが、
PC ブラウザでもそれはなるはずです。


# 全体的に主語を書いて下さい。
# 「これ何を言ってるんだろう?」まで想像しながら答えるのはコストが高いので、
# そのせいで放置される質問も多いです。
# 丁寧すぎるくらい丁寧に説明して頂いたほうが、無駄な確認が減るのでいいと思います。
# あと、ソースベタ書きも読みにくいので、ある程度の量なら gist とかどっかに上げるとより読みやすいです。

Jxck

2013年1月25日 13:33 matton <matsuo...@gmail.com>:
--
 
 
 

matton

unread,
Jan 27, 2013, 8:52:05 PM1/27/13
to node...@googlegroups.com
松尾です。
大津さん 返信ありがとうございます。

KOBAさんやJACKさんに教えて頂いた内容で
socket_c = socket; 
が意味不明の文であることは理解しています。
※今となれば結構お恥ずかしいですね。


サンプル拝見させて頂きました。コテコテの汎用系人間としてどうしても出ない発想ですね。
企業システムへの導入などもできそうな気がします。
サンプルとても素敵ですね。
・生産管理システム上でアラートのリアルタイム通知
・既存システムのログをネットワーク介してリアルタイムに参照する。
とかできそうですね。



2013年1月25日金曜日 17時53分08秒 UTC+9 shigeki:

matton

unread,
Jan 27, 2013, 10:00:18 PM1/27/13
to node...@googlegroups.com
松尾です。

Jxckさん ありがとうございます。
>>オブジェクトである必要が無かったので、自分のは文字列だけ送ってます。
申し訳ないです。ソース確認不足でした。
あと、”localhost”の件はまったく自分のミスです。

>>io.connect("http://localhost:3000") => io.connect();
>>書いちゃうとデプロイする時困るので、同一ホストの場合は書かないのが普通です。
そうなんですね。webで調べると書いてあるサンプルと無いサンプルがあって違いが今まで良くわかりませんでした。

>>> で、もうひとつ質問なんですが・・・disconnectしていないソケットってどうなるんですか?
>>これなんか引っかかるんですが、 Socket.IO の disconnect してない接続という意味ですか?
socket.ioサーバをsocket_serverとし、socket.ioクライアントはスマートフォンのネイティブアプリ(titaniumでsocket.io-titaniumを利用)にて接続を行っています。クライアントをsocket_client1,socket_client2とします。
1.socket_serverを起動します
2.socket_client1 ==> socket_server 接続
    io.connect(socket_serverのIP:PORT)
3.socket_client2 ==> socket_server 接続
    io.connect(socket_serverのIP:PORT)
4.socket_serverを停止します

上記の状態で、socket_client1 とsocket_client2がどのような状態にあるか知りたかった次第です。
>>再接続って Socket.IO のリトライによる再接続のことですか?
>>Socket.IO は Socket.IO の接続が切断しても、何度もリトライしてサーバが復活したら再接続します。
リトライ処理をしていたんですね。それすら知らなかったです。

今週、検証する予定なのですが「スマホ(iphone等)ネイティブアプリでのバッテリー消費量」
<パターン1>
1.socket_serverを起動
2.socket_client1 ==> socket_server 接続
3.2時間放置
<パターン2>
1.socket_serverを起動
2.socket_client1 ==> socket_server 接続
3.socket_serverを停止
4.2時間放置
<パターン3>
1.socket_client1 ==> socket_server 接続  ※socket_serverが起動していない為、接続できない
2.socket_serverを停止
3.2時間放置

パターン2の場合だと何度も再接続を行うのでバッテリーの消耗が一番激しいと思われます。パターン1とパターン2のバッテリー消耗の差を求めてアプリ的に対策が必要かどうか検証を行う予定です。※検証したらアップいたします。

>>"webはムリですが" の web ってたぶん PC ブラウザのこと?だと思うんですが、
webというのはPC限らずブラウザ経由(windows,mac,iphone,android※すべて標準ブラウザにて)socket.io接続の意味合いでした。
windows(ie8)とandroid(androidブラウザ)でしか確認していませんでした。双方ともにwebsocket未対応なんですね。
==> 対応しているブラウザ(Safari,chrome)であれば再接続されることを確認しました。

# 全体的に主語を書いて下さい。
フォーラムに投稿すること自体はじめてであった為、意味不明な文章になってしまっていました。
そのような文章にもかかわらず、回答して頂きありがとうございます。

# あと、ソースベタ書きも読みにくいので、ある程度の量なら gist とかどっかに上げるとより読みやすいです。
Jackさんや大津さんのサンプルですが確認しやすいですね。
正直gist等のサービス自体利用したことが無かったもので、とりあえずgistにユーザ登録いたしました。今後利用したいと思います。

今回、初めてフォーラム使用させて頂いたのですが、質問内容以外のことも教えて頂きありがとうございます。
いわれてみれば、当たり前のこと(主語が無い等)ですが、意外と気がつかないで投稿してしまいました。
もっとスキルを磨き、回答を記入できる様になりたいですね。

今後ともよろしくお願いします。

2013年1月25日金曜日 20時55分34秒 UTC+9 Jxck:

Jxck

unread,
Jan 27, 2013, 11:41:22 PM1/27/13
to node...@googlegroups.com
Jxck です。

インラインにて。

>>io.connect("http://localhost:3000") => io.connect();
>>書いちゃうとデプロイする時困るので、同一ホストの場合は書かないのが普通です。
そうなんですね。webで調べると書いてあるサンプルと無いサンプルがあって違いが今まで良くわかりませんでした。
念のためですが、書かないのは「同一オリジン」の場合です。
クライアントが、 socket.io.js をホストしているサーバと別な場合は、
普通にそのサーバのアドレスを書きます。
 
socket.ioサーバをsocket_serverとし、socket.ioクライアントはスマートフォンのネイティブアプリ(titaniumでsocket.io-titaniumを利用)にて接続を行っています。クライアントをsocket_client1,socket_client2とします。
1.socket_serverを起動します
2.socket_client1 ==> socket_server 接続
    io.connect(socket_serverのIP:PORT)
3.socket_client2 ==> socket_server 接続
    io.connect(socket_serverのIP:PORT)
4.socket_serverを停止します

上記の状態で、socket_client1 とsocket_client2がどのような状態にあるか知りたかった次第です。
>>再接続って Socket.IO のリトライによる再接続のことですか?
>>Socket.IO は Socket.IO の接続が切断しても、何度もリトライしてサーバが復活したら再接続します。
リトライ処理をしていたんですね。それすら知らなかったです。

例えば、自分が上げたサンプルを動かして、
1, server 起動
2, Chrome などえ接続(このとき、開発者コンソールを開く)
3, server を落とす、 Chrome はそのまま。
4, 開発者コンソールを観察
5, server を再度立ち上げる 

をやってみて、どのような動きをするのか見てみるといいと思います。
クライアントが reconnect を試みてるのを確認できると思います。

ちなみに、パラメータは変更できるものがあるので、
以下の reconnect が付く項目を確認してください。

 
今週、検証する予定なのですが「スマホ(iphone等)ネイティブアプリでのバッテリー消費量」
<パターン1>
1.socket_serverを起動
2.socket_client1 ==> socket_server 接続
3.2時間放置
<パターン2>
1.socket_serverを起動
2.socket_client1 ==> socket_server 接続
3.socket_serverを停止
4.2時間放置
<パターン3>
1.socket_client1 ==> socket_server 接続  ※socket_serverが起動していない為、接続できない
2.socket_serverを停止
3.2時間放置 
 
パターン2の場合だと何度も再接続を行うのでバッテリーの消耗が一番激しいと思われます。パターン1とパターン2のバッテリー消耗の差を求めてアプリ的に対策が必要かどうか検証を行う予定です。※検証したらアップいたします。

先ほどのパラメータ設定であるように、以下の4つが関わります。
訳が良くなかった(すいません、、)ので、ここに解説を。(訳はあとで直しておきます。)

reconnect (デフォルトは true)
接続の失敗やタイムアウトを発見した際、自動的に再接続を実行するかどうか。
reconnection delay (デフォルトは 500 ms)
再接続を開始するまでの、タイムアウト時間の初期値。この値は、再接続が試されるたびに値が指数的に大きくなる back off アルゴリズムが適用されている。
reconnection limit (デフォルトは Infinity)
再接続の間隔の最大値。ミリ秒かInfinityを指定。
max reconnection attempts (デフォルトは 10)
切断後、再接続を何回試みるか。 この値の回数試行した後 reconnect_failed イベントが発火する。

back off は、現状試行するたびに2倍になります。

つまりデフォルト設定だと、
1, 切断
2. 500 ms 後に reconnect 開始
3. 500 ms を 2 倍にしながら 10 回試みる
4. reconnect_faild

n 回試行までの全体時間を Tn とすると
T1 = 500
Tn = T(n-1) + 500^(2 - (n-1))


かな?(多分に怪しい)

一応こいつを計算すると。(面倒なので直張り)

```
def T(n)
  if n == 1
    return 500
  end
  T(n-1) + 500 * (2 ** (n-1))
end

(1..10).each{|n|
  p T(n)
}

__END__
500
1500
3500
7500
15500
31500
63500
127500
255500
511500
```

なぜ Ruby かは気にしたら負けです。
ということで、 8 分ちょいくらいしたらクライアントは諦めて
単純にここだけを見たいなら、 2 時間放置しても
沈黙の 1時間50分をすごしそうな気がします。
(適当に計算したので、まちがってたらすいませんw
検証して頂けると助かります。)


> バッテリー消耗の差を求めてアプリ的に対策が必要かどうか検証を行う予定です。※検証したらアップいたします。
ともあれ、こうした検証結果は非常に有益です。
もし公開が可能な情報なら、(結果に関わらず)ぜひ公開してください!!


>>"webはムリですが" の web ってたぶん PC ブラウザのこと?だと思うんですが、
webというのはPC限らずブラウザ経由(windows,mac,iphone,android※すべて標準ブラウザにて)socket.io接続の意味合いでした。
windows(ie8)とandroid(androidブラウザ)でしか確認していませんでした。双方ともにwebsocket未対応なんですね。
==> 対応しているブラウザ(Safari,chrome)であれば再接続されることを確認しました。
ie は 10 からですね。
 

==> 対応しているブラウザ(Safari,chrome)であれば再接続されることを確認しました。
ん? WebSocket しか使わないんですかね?
Socket.IO の本領のひとつが、
「WebSocket 非対応/つながらない環境でも、フォールバックして同じように動く」
があるので、自分の上げたコードなんかは ie8 でも動くはずです。念のため。

Tsuyoshi Torii

unread,
Jan 28, 2013, 5:13:36 AM1/28/13
to node...@googlegroups.com
鳥居と申します。

横から失礼します。差し出がましいですが少しだけ補足させてください。

>つまりデフォルト設定だと、
>1, 切断
>2. 500 ms 後に reconnect 開始
>3. 500 ms を 2 倍にしながら 10 回試みる
>4. reconnect_faild
最新バージョンのsocket.io-client(0.9.11)だと4.のreconnect_failedが発火しないバグがあり、以下のパッチを当てる必要があります(まだ取り込まれていない様子)
https://github.com/LearnBoost/socket.io/issues/652#issuecomment-6250270

ちなみに現在自分が関わっている案件だと「max reconnection attempts」を少なめにして
reconnect_faildが発生したら他の生きているsocket.ioノードに再接続、といったことを実装したりしています。
(あらかじめsocket.ioノードを管理する仕組みが必要ですが)
もし再接続の要件があればご参考ください。



2013年1月28日 13:41 Jxck <block.rxc...@gmail.com>:
> --
>
>
>

matton

unread,
Jan 29, 2013, 4:26:03 AM1/29/13
to node...@googlegroups.com
松尾です。

Jxck さん 鳥居さん ありがとうございます。

socket.ioの再接続確認の件ですが、時間が取れずに確認できていません。申し訳ございません。

気にしていなかったためsocket.ioのバージョンを明記しておりませんでした。
server(node.js)  0.9.11
client(titanium)  0.8.7
です。
上記構成だと鳥居さんより補足いただいた現象は発生しないと考えております。

現在、Androidにてsocket.ioのエラーが出てしまう為、ソース上に何か不具合がある可能性があると考えています。
上記、不具合を解消後に再接続の確認をさせて頂きます。もしかすると原因が不具合にある可能性もありますので。

また、パラメータの解説ありがとうございます。

バッテリーの消費量の検証は行ったんですが、バックグラウンドになったときのアプリ対応が無かったもので対応後に再度検証いたします。
確認後アップさせて頂きます。

気づけばnode.jsでは無くTitaniumのsocket.ioの話になってしまいました。

お手数ですがもうしばらくよろしくお願いします。




2013年1月28日月曜日 19時13分36秒 UTC+9 toritori0318:
Reply all
Reply to author
Forward
0 new messages