Связка Socket.IO и NodeJS у меня отлично работала во всех браузерах, кроме оперы, т.к. транспорт по умолчанию там шёл XHR, пишу проблемы которые были с разными типами транспорта:
- XHR - выдавало ошибку безопасности при посылке запроса
- JSONP - сообщения от сервера до оперы шли, а вот от оперы до сервера нет
- FlashSocket - происходил connect и тут же disconnect
- WebSocket - с ним всё работает отлично (!)
Инструкция по изменению типа транспорта Socket.IO в Opera:
В комбинированном файле socket.io.js можно увидеть деление файла на транспорты такого вида(пример с WebSocket):
(function(){
var WS = io.Transport.websocket = function(){
io.Transport.apply(this, arguments);
};
.......
})
У каждого транспорта есть функция проверки на доступность в браузере пример:
WS.check = function(){...}
У меня была версия Socket.IO '0.7pre', там самым первым шёл транспорт XHR, функцию check() я изменил так:
XHR.check = function(xdomain){
if(io.util.opera) return false; //(!!! Если браузер опера, то не использовать)
try {
if (request(xdomain)) return true;
} catch(e){}
return false;
};
А вот с WebSocket наоборот:
WS.check = function(){
if(io.util.opera) return true; //(!!! Если браузер опера, то использовать)
return 'WebSocket' in window && WebSocket.prototype && ( WebSocket.prototype.send && !!WebSocket.prototype.send.toString().match(/native/i)) && typeof WebSocket !== "undefined";
};
Аналогично можно поступать с другими транспортами, только делать нужно с умом. Таким образом Socket.IO можно настроить под все основные браузеры(Opera, FireFox, Safari, Chrome, IE). У меня после таких изменения стало работать везде. Надеюсь тем кто столкнётся с этой проблемой эта инструкция поможет.