6

socket.io と最新のブラウザーで奇妙な問題が発生しています。驚いたことに、IE9 では flashsocket へのフォールバックの方が適切に動作するように見えるため、正常に動作します。

私のサーバーで(エクスプレスで)

var io = socketio.listen(server.listen(8080));
io.configure('production', function(){
    console.log("Server in production mode");
    io.enable('browser client minification');  // send minified client
    io.enable('browser client etag');          // apply etag caching logic based on version number
    io.enable('browser client gzip');          // gzip the file
    io.set('log level', 1);                    // reduce logging
    io.set('transports', [                     // enable all transports (optional if you want flashsocket)
        'websocket'
        , 'flashsocket'
        , 'htmlfile'
        , 'xhr-polling'
        , 'jsonp-polling'
    ]);
});

ブラウザの [ネットワーク] タブ (Chrome) で、Websocket が確立され101 Switching Protocols、保留モードになっていることがわかります。その後、xhr-polling と jsonp-polling が表示されます (flashsocket はどうなりましたか?)

最悪の部分は、情報が行き来しないことです。私はこれを接続しています:

io.sockets.on('connection', function (socket) {
    // If someone new comes, it will notified of the current status of the application
    console.log('Someone connected');
    app.sendCurrentStatus(socket.id);
    io.sockets.emit('currentStatus', {'connected': true);
});

そしてクライアント上で:

socket.on('currentStatus', function (data){ console.log(data) });

ただし、次のように起動したサーバーの電源を切ると、そのログしか表示されません。

NODE_ENV=production node server.js

私は何を間違っていますか?

4

2 に答える 2

9

最後に、本当に頭を壁にぶつけた後、マシンがいくつかの環境の背後にあるため、ファイアウォールの問題であるかどうかを確認するためにいくつかの環境でテストすることにしました。

問題が発生したのは私だけであることが判明したので、アンチウイルス (Trend Micro) をチェックし、無効にした後、Chrome/Firefox が魔法のように動作するようになりました。

この話の教訓

ここに書かれていること以外に - Socket.IO とファイアウォール ソフトウェア- インターネットの誰も持っていないように見える問題 (つまり、github にも socket.io グループにもログオンしていない) に直面したときはいつでも、おそらくアンチウイルスが原因です。彼らは悪です。時々。

于 2012-07-26T10:50:08.033 に答える
1

アプリ自体でsocketioをリッスンさせるだけです。
また、あなたがやっているソケットでサーバー側の設定をすべて行う必要はありません.socket.ioは、それをしなくてもほとんどのブラウザですぐに動作するはずです。構成せずに最初に試してみます。また、サーバーでは、io.sockets.on を実行するのではなく、コールバック関数に渡されるソケットから発行する必要があります。

var io = socketio.listen(app);

io.sockets.on('connection', function (socket) {
  // If someone new comes, it will notified of the current status of the application
  console.log('Someone connected');
  app.sendCurrentStatus(socket.id);
  socket.emit('currentStatus', {'connected': true);
});

クライアントでは、最初に接続する必要があります。

var socket = io.connect();
socket.on('currentStatus', function (data){ console.log(data) });

socket.io を使用した双方向通信の例を見たい場合は、私の Nodio アプリケーションをチェックしてください。

サーバー側: https://github.com/oveddan/Nodio/blob/master/lib/Utils.js

クライアント側: https://github.com/oveddan/Nodio/blob/master/public/javascripts/Instruments.js

于 2012-07-25T18:42:26.957 に答える