【问题标题】:Socket.io not disconnecting, xhr-polling 400 bad requestSocket.io 未断开连接,xhr-polling 400 错误请求
【发布时间】:2015-11-25 01:19:01
【问题描述】:

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

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

但是,当它被设置时,我得到以下错误;

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

我有以下代码;

server.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']);

角度代码;

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;
});

任何想法我做错了什么?

【问题讨论】:

    标签: angularjs sockets socket.io


    【解决方案1】:

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

    首先,我建议为套接字定义几种传输方式。

    // server
    io.set('transports', [ 'websocket', 'flashsocket', 'polling' ] );
    
    // client
    io.connect( "/", { secure: true, transports: [ "flashsocket","polling","websocket" ] } );
    

    您定义它们的顺序很重要 - socket.io 将尝试按照您定义的相应顺序使用它们。顺便说一句,因为socket.io 1.0 它是polling 而不是xhr-polling

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

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

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

    希望这会有所帮助。

    【讨论】:

    • 我现在收到此错误; WebSocket connection to 'ws://app.local:3000/socket.io/?EIO=3&transport=websocket&sid=UccSYaNjJl4j_Pp7AAAA' failed: Connection closed before receiving a handshake response 有什么想法吗?
    • 代替io.listen(server).on('connection', function(client) {.. 试试io.on('connection', function(client) {。如果你定义了 io.listen 两次,它可能会发生。
    • 在服务器中我使用客户端传输:['flashsocket', 'polling', 'websocket', 'xhr-polling'] 并且在服务器中作为 ['websocket', 'flashsocket', 'polling ', 'xhr-polling'] 。在浏览器中,我收到相同的 websocket 连接错误。在服务器中,我使用的是 'io=socketio.listen(server, properties);io.on('connection', onSocketConnection);'
    猜你喜欢
    • 2013-08-01
    • 2013-04-06
    • 2012-02-10
    • 2015-04-26
    • 2014-03-08
    • 1970-01-01
    • 2013-04-03
    • 2014-08-24
    • 1970-01-01
    相关资源
    最近更新 更多