Socket.io а современные браузеры не работают
У меня возникли некоторые странные проблемы с socket.io и современные браузеры. Удивительно, но с IE9 работает нормально, потому что резервные копии для flashsocket, которые, кажется, работают лучше.
В моем сервере (с express)
var io = socketio.listen(server.listen(8080));
io.configure('production', function(){
console.log("Server in production mode");
io.enable('browser client minification'); // send minified client
io.enable('browser client etag'); // apply etag caching logic based on version number
io.enable('browser client gzip'); // gzip the file
io.set('log level', 1); // reduce logging
io.set('transports', [ // enable all transports (optional if you want flashsocket)
'websocket'
, 'flashsocket'
, 'htmlfile'
, 'xhr-polling'
, 'jsonp-polling'
]);
});
В браузере я вижу на вкладке Сеть (в Chrome), что websocket стабилизирован и входит в 101 Switching Protocols
в режиме ожидания. После этого появляется xhr-опрос и JSONP-опрос (Что случилось с flashsocket ? )
Хуже всего то, что информация не идет туда и обратно. Я имейте это на связи:
io.sockets.on('connection', function (socket) {
// If someone new comes, it will notified of the current status of the application
console.log('Someone connected');
app.sendCurrentStatus(socket.id);
io.sockets.emit('currentStatus', {'connected': true);
});
И на клиенте:
socket.on('currentStatus', function (data){ console.log(data) });
Однако я смогу увидеть этот журнал только тогда, когда выключу сервер , который запускается с:
NODE_ENV=production node server.js
Что я делаю не так?
2 ответа:
Наконец, после того, как я действительно ударился головой о стену, я решил проверить в нескольких средах, чтобы увидеть, Была ли это проблема брандмауэра, так как машина находится за несколькими из них.
Оказалось, что ни у кого, кроме меня, не было этой проблемы, поэтому я проверил антивирус (Trend Micro) и после отключения Chrome/Firefox смогли сделать свою магию.
Мораль рассказа
Кроме того, что здесь написано - Socket.IO и брандмауэр программного обеспечения - всякий раз, когда вы сталкиваетесь с проблемой, что никто в интернете вроде бы есть (т. е. не заходил на github ни в socket.io группа) это, вероятно, вызвано вашим антивирусом. Они-зло. Иногда.
Вы должны просто иметь socketio слушать само приложение.
Кроме того, мне никогда не нужно было делать всю конфигурацию на стороне сервера с сокетом, который вы делаете - socket.io должно работать из коробки на большинстве браузеров, не делая этого. Я бы попробовал сначала без настройки. Кроме того, на сервере, вы должны излучать из сокета, который передается функции обратного вызова, а не делать io.разъемы.на.var io = socketio.listen(app); io.sockets.on('connection', function (socket) { // If someone new comes, it will notified of the current status of the application console.log('Someone connected'); app.sendCurrentStatus(socket.id); socket.emit('currentStatus', {'connected': true); });
На клиенте вам необходимо подключиться первый:
var socket = io.connect(); socket.on('currentStatus', function (data){ console.log(data) });
Если вы хотите увидеть пример двухсторонней связью, используя сокет.Ио, проверить мои приложения Нодио.
Серверная сторона: https://github.com/oveddan/Nodio/blob/master/lib/Utils.js
И клиентская сторона: https://github.com/oveddan/Nodio/blob/master/public/javascripts/Instruments.js