1

モバイル アプリケーション用のサーバーを作成しており、サーバーからアプリへのプッシュ通知に socket.io を使用することを選択しましたが、socket.io の設定に問題があります。

現在、io.connect(server:port) で開始されるハンドシェイクのエンドレス ストリームがあります。

debug - client authorized
info  - handshake authorized HXtC1UPzcsEzO8X7x2B1
debug - client authorized
info  - handshake authorized aE7hMGDpp5InO1UWx2B2
debug - client authorized
info  - handshake authorized GBx_3n-8Lvbuo4QJx2B3
debug - client authorized
info  - handshake authorized tOEl0F5wNlh4xkn1x2B4
debug - client authorized
info  - handshake authorized K55Oit22yN9JDWxhx2B5
debug - client authorized
...

アプリケーションのクライアント側に socket.io-titanium を使用していますが、どちらの端がこの接続の問題を引き起こしているのかわかりません。

クライアント:

var io = require('socket.io-titanium');
var socket = io.connect('http://myserver.com:3000');
socket.on('connect', function (data){
  Ti.API.log("socket.io connected");
});
socket.on('update', function (data){
  Ti.API.log(data);
});

サーバ:

index = fs.readFileSync(__dirname + '/index.html');
var updates = http.createServer(function(req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.end(index);
});

var io = require('socket.io').listen(updates);

var clients = {};

io.sockets.on('connection', function(socket) {
    console.log("Server Connection Event");
    socket.on('i am client', console.log);
});

io.set("polling duration", 10);
io.set("close timeout", 30);
updates.listen(3000, function(){
 console.log("Updates listening on port 3000");
 console.log("");
});

非常に長いストリーム (100 以上) の途中で「サーバー接続イベント」を一度受信しました

ハンドシェイクの考え方は、接続が閉じられるまで、ユーザーごとに1回だけ接続を承認して確立する必要があるということだと思います。

どんな助けでも大歓迎です!

4

1 に答える 1

3

これをローカルのラップトップでテストしていますか、それともインターネット経由でテストしていますか?

インターネット経由の場合、socket.io クライアントが古いポーリング ベースのプロトコルにフォールバックしている可能性があります。これは、たとえば、ISP がたまたま HTTP/1.0 プロキシを実行している場合に発生する可能性があります。このようなプロキシは、HTTP/1.1 で定義されている接続のアップグレードを拒否するため、Web ソケットは失敗し、クライアントはロング ポーリングなどの古い方法にフォールバックします。

ローカル ラップトップで実行しているときにこれが発生する場合は、別の問題である可能性があります。Chrome を開き、[開発者ツール] > [ネットワーク] を開いて、[Web ソケット] フィルターを選択できますか。サイトに移動して、Web Socket が正しく確立されているかどうかを確認します。

于 2013-11-14T08:32:07.803 に答える