Socket.io 未断开连接,xhr-polling 400 错误请求

001*_*221 1 sockets socket.io angularjs

Io 和 Angular。刷新页面时,不会触发 socket.io 中的断开连接事件。我在网上做了一些研究,这使我实现了以下内容

io.set('transports', ['xhr-polling']);

但是,当设置此项时,我收到以下错误;

GET http://app.local:3000/socket.io/?EIO=3&transport=polling&t=1448414100223-67 400(错误请求)

我有以下代码;

服务器.js

var express =   require('express'),
    http =      require('http'),
    server =    http.createServer(app),
    path = require('path'),
    cookieParser = require('cookie-parser'),
    bodyParser = require('body-parser');
var app = express();

const redis =   require('redis');
const io =      require('socket.io').listen(server);
const client =  redis.createClient();

server.listen(3000, '0.0.0.0');

io.listen(server).on('connection', function(client) {
    const redisClient = redis.createClient();
    redisClient.subscribe('user.joined');
    redisClient.on("message", function(channel, message) {
        client.emit(channel, message);
    });

    client.on('disconnect', function() {
        redisClient.quit();
    });
});
io.set('transports', ['xhr-polling']);
Run Code Online (Sandbox Code Playgroud)

角度代码;

var serverBaseUrl = 'http://app.local:3000';
myApp.factory('socket', function (socketFactory) {
    var myIoSocket = io.connect(serverBaseUrl, {'sync disconnect on unload' : true});

    var socket = socketFactory({
        ioSocket: myIoSocket
    });

    return socket;
});
Run Code Online (Sandbox Code Playgroud)

任何想法我做错了什么?

kay*_*nce 6

嗯,是的,不幸的是,这可能会发生,polling而是..故障安全传输,如果任何其他传输失败,应该使用。

首先,我建议为要使用的套接字定义几个传输。

// server
io.set('transports', [ 'websocket', 'flashsocket', 'polling' ] );

// client
io.connect( "/", { secure: true, transports: [ "flashsocket","polling","websocket" ] } );
Run Code Online (Sandbox Code Playgroud)

您定义它们的顺序很重要 - socket.io 将尝试按照您定义的相应顺序使用它们。顺便说一下,从socket.io1.0 开始就polling不是xhr-polling.

为了尽量减少未收到disconnect事件的情况,我可以建议使用浏览器窗口的onbeforeunload事件并添加类似的内容

window.onbeforeunload = function() { 
    console.log( "unloading resources" );   
    $scope.socket.disconnect();
    $scope.socket.close();
};
Run Code Online (Sandbox Code Playgroud)

您可以connect在客户端收到事件后立即添加此事件处理程序。

希望这可以帮助。