Socket.io 未断开连接,xhr-polling 400 错误请求
Socket.io not disconnecting, xhr-polling 400 bad request
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']);
Angular代码;
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;
});
知道我做错了什么吗?
好吧,是的,这可能会发生,不幸的是,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
事件的情况,我建议使用浏览器 windows 的 onbeforeunload
事件并添加类似这样的内容
window.onbeforeunload = function() {
console.log( "unloading resources" );
$scope.socket.disconnect();
$scope.socket.close();
};
您可以在客户端收到 connect
事件后立即添加此事件处理程序。
希望这对您有所帮助。
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']);
Angular代码;
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;
});
知道我做错了什么吗?
好吧,是的,这可能会发生,不幸的是,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
事件的情况,我建议使用浏览器 windows 的 onbeforeunload
事件并添加类似这样的内容
window.onbeforeunload = function() {
console.log( "unloading resources" );
$scope.socket.disconnect();
$scope.socket.close();
};
您可以在客户端收到 connect
事件后立即添加此事件处理程序。
希望这对您有所帮助。