我们昨天花了很多时间试图解决这个问题。所以,作为最后的努力,我在这里发帖。
我们的设置是Node.js / Express后端。使用Socket.io与express表示同一端口。
app.io = io.listen(server);
app.io.set('origin', '*');
app.io.set('log level', '2');
app.io.enable('browser client minification');
app.io.set('transports', [
'websocket',
'flashsocket',
'htmlfile',
'xhr-polling',
'jsonp-polling'
]);
我已明确启用了所有传输。我们希望jsonp或flash套接字在我们最不喜欢的浏览器上播放得很好......
但是,我想有一个原因是他们是我们最不喜欢的。 ; - )
客户端我们有一个带socket.io的Angularjs应用程序。非常宽松地基于this tutorial
window.WEB_SOCKET_SWF_LOCATION = 'https://api.ourdomain.com/socket.io/static/flashsocket/WebSocketMain.swf';
var socket = io.connect('https://api.ourdomain.com', {
'reconnect' : true,
'reconnection delay' : 1500
});
我们尝试添加SWF位置,如here所示,以使闪存套件正常工作。它正在提供政策并获取文件..所以没有运气。
无论如何在ie7-9上尝试通过jsonp轮询进行连接时,我们会收到此错误:
Object doesn't support this property or method
jsonp消息的内容将是这样的:
io.j[1]("1::");
偶尔会有更多内容。
io.j似乎被设置为主socket.io.js文件中的数组。
当我将它放在开发人员工具控制台中时,它会抛出相同的错误。
我已尝试在脚本之前移动所有元标记,如建议here。这并没有改变任何事情。
XHR-polling似乎也不起作用。我们已经看到一些关于更改设置的帖子..但显然我们不能要求我们的客户去请求他们的IT部门更改他们的浏览器设置只是为了访问我们的网站。所以我们放弃了这种方法。
还尝试创建一个空白页面,并连接..这是有效的。那会是什么干扰?
希望你们有事吗?
答案 0 :(得分:0)
我们无法通过简单地使Socket.io工作来解决这个问题。我不知道这是否是一个Socket.io问题,或者这是Angularjs和Socket.io的组合。
然而,我们通过添加自己的后备来解决此问题。在我们的Socket.io服务中,我们检查ie9 +以及webkit和firefox浏览器中是否存在功能。
var use_socketIO = true;
/*
I'd like to detect websocket, or jsonp.
But those transport methods themselves work.
Just not reliably enough to actually use
*/
if (typeof(window.atob) === 'undefined') {
console.log('browser appears to be < ie10.');
use_socketIO = false;
}
if (use_socketIO) {
var socket = io.connect('https://api.ourdomain.com', {
'reconnect' : true,
'reconnection delay' : 1500
});
}
// Fall back http method.
function httpReq(method, url, data) {
var defer = $q.defer();
$http({
method: method,
url: '//www.domain.com/api'+url,
data: data
}).success(function (data, status, headers, config) {
defer.resolve(data)
});
return defer.promise;
}
// Socket.io method.
function socketReq(method, url, data) {
var defer = $q.defer();
socket.emit(method, {url: url, data: data}, function (response) {
try {
var data = JSON.parse(response);
defer.resolve(data);
} catch (e) {
$log.error('Failed to parse JSON');
$log.info(response);
defer.reject(e);
}
});
return defer.promise;
}
// Main Request method
function request(method, url, data) {
if (use_socketIO) {
return socketReq(method, url, data || {});
} else {
return httpReq(method, url, data || {});
}
}
然后我们只需调用request('get','/ url');
服务器端我们做了一些魔法来构建一个req和res对象,如果它的Socket.io然后转发它来表达处理,否则表达就像正常一样处理它。