Socket.IO not working in Chrome and Firefox on Win

2019-05-24 21:29发布

I have made a Facebook like chat server and client using node.js (0.10.10), socket.io (0.9.16) and Express (3.2.6). It works perfectly fine in all browsers including all versions of Internet Explorer, but Firefox (21.0) and Chrome (27.0.1453.116) on Windows just won't work. It does work in said browsers on OS X.

When I try to debug the errors by viewing the returned data of the error events, the data is always undefined. I have tried all possible transports.

This is the simplified code of the chat application I used for testing on Chrome and Firefox in Windows:

Client:

<script src="http://www.xserverx.com:8080/socket.io/socket.io.js"></script>
<script>
    var ioUrl = 'http://www.xserverx.eu:8080';
    var socket = io.connect(ioUrl, {
        'reconnect': true,
        'reconnection delay': 1500,
        //'sync disconnect on unload': true
    });

    $('#send-button').click(function() {
        socket.emit('message', { message: $('#message').val() });
    });

    // Event listeners
    socket.on('connect', function() {
        // Display socket transport type
        // Is empty in Chrome and Firefox on Windows
        $('#transport-type').html(socket.socket.transport.name);
    });

    socket.on('onlinechange', function(data) {
        $('#users-online').html(data.online);
    });

    socket.on('message', function(data) {
        $('#chat').append('<p>' + data.message + '</p>');
    });

    socket.on('error', function(data) {
        $('#errors').html('Error: Error. ' + JSON.stringify(data));
    });
    socket.on('connect_failed', function(data) {
        $('#errors').html('Error: Connect failed. ' + JSON.stringify(data));
    });
    socket.on('reconnect_failed', function(data) {
        $('#errors').html('Error: Reconnect failed. ' + JSON.stringify(data));
    });
</script>

Server:

var express = require('express'),
    app = express(),
    sio = require('socket.io');

var port = 8080;

var io = sio.listen(app.listen(port));
    io.set('log level', 1); // Only show warnings and errors
    io.set('polling duration', 10);
    io.enable('browser client minification');
    io.enable('browser client gzip');


var totalOnline = 0;

// Server
io.sockets.on('connection', function(socket) {
    socket.setMaxListeners(0);

    console.log('---- New user online ----');
    totalOnline++;
    socket.emit('onlinechange', { online: totalOnline });

    socket.on('disconnect', function() {
        console.log('---- User disconnected ----');

        totalOnline--;

        socket.emit('onlinechange', { online: totalOnline });
    });

    socket.on('message', function(data) {
        io.sockets.emit('message', { message: data.message });
    });
});
console.log('Listening on port ' + port);

This is the debug log from the server when connecting a single user with Chrome in Windows:

Listening on port 8080
   debug - served static content /socket.io.js
   debug - client authorized
   info  - handshake authorized NnDQmjFbOsc37kSRdPCg
   debug - setting request GET /socket.io/1/websocket/NnDQmjFbOsc37kSRdPCg
   debug - set heartbeat interval for client NnDQmjFbOsc37kSRdPCg
   debug - client authorized for 
   debug - websocket writing 1::
---- New user online ----
   debug - websocket writing 5:::{"name":"onlinechange","args":[{"online":1}]}
   debug - setting request GET /socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166541799
   debug - setting poll timeout
   debug - discarding transport
   debug - cleared heartbeat interval for client NnDQmjFbOsc37kSRdPCg
   debug - clearing poll timeout
   debug - xhr-polling writing 8::
   debug - set close timeout for client NnDQmjFbOsc37kSRdPCg
   debug - xhr-polling closed due to exceeded duration
   debug - setting request GET /socket.io/1/jsonp-polling/NnDQmjFbOsc37kSRdPCg?t=1372166551799&i=0
   debug - setting poll timeout
   debug - discarding transport
   debug - cleared close timeout for client NnDQmjFbOsc37kSRdPCg
   debug - setting request GET /socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166551918
   debug - setting poll timeout
   debug - discarding transport
   debug - clearing poll timeout
   debug - clearing poll timeout
   debug - xhr-polling writing 8::
   debug - set close timeout for client NnDQmjFbOsc37kSRdPCg
   debug - xhr-polling closed due to exceeded duration
   debug - setting request GET /socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166562023
   debug - setting poll timeout
   debug - discarding transport
   debug - cleared close timeout for client NnDQmjFbOsc37kSRdPCg

And this is the response from the initial /socket.io/1/?t=1372166652973 file:

NnDQmjFbOsc37kSRdPCg:60:60:websocket,htmlfile,xhr-polling,jsonp-polling

And this is a piece of the Chrome requests log:

XHR finished loading: "http://www.xserverx.com:8080/socket.io/1/?t=1372166531543". socket.io.js:2
XHR finished loading: "http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166541799". socket.io.js:2
XHR finished loading: "http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166551918". socket.io.js:2
XHR finished loading: "http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166562023". socket.io.js:2
XHR finished loading: "http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166572144". socket.io.js:2
XHR finished loading: "http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166582249". socket.io.js:2
XHR finished loading: "http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166592351". socket.io.js:2
XHR finished loading: "http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166602445". socket.io.js:2
XHR finished loading: "http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166612595". socket.io.js:2
XHR finished loading: "http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166622697". socket.io.js:2
XHR finished loading: "http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166632801". socket.io.js:2
XHR finished loading: "http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166642900". socket.io.js:2
XHR finished loading: "http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166653115". socket.io.js:2
GET http://www.xserverx.com:8080/socket.io/1/jsonp-polling/NnDQmjFbOsc37kSRdPCg?t=1372166551799&i=0  socket.io.js:2 (FAILED)
XHR finished loading: "http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166663203". socket.io.js:2
XHR finished loading: "http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166673295". socket.io.js:2
XHR finished loading: "http://www.xserverx.com:8080/socket.io/1/xhr-polling/NnDQmjFbOsc37kSRdPCg?t=1372166683405". socket.io.js:2

2条回答
虎瘦雄心在
2楼-- · 2019-05-24 21:47

I just found out that it was due to the anti virus of the person who was having issues in Chrome and Firefox. Apparently it blocks websockets and even polling on those browsers. I also change the port from 8080 to 8079.

查看更多
看我几分像从前
3楼-- · 2019-05-24 21:49

You can use following code for solve your problem

io.configure(function () { 
   io.set("transports", ["xhr-polling"]); 
   io.set("polling duration", 10); 
});
查看更多
登录 后发表回答