Socket.on('connection'... событие никогда не запускалось nodejs + express + socket.io
Проблема socket.io НЕ работает
Подробнее
- Сгенерирован проект с
express [folder]; cd [folder]; npm install;
- Настройка socket.io
npm install socket.io
- Запустите node приложение с кодом ниже
- Клиент connect запускает событие, но сервер соединение НИКОГДА не запускается.
Настройка
- Сервер AWS Free Tier, Ubuntu 11.10, ami-a7f539ce
- nodejs v0.6.5
- express v2.5.1
- socket.io v0.8.7
Client
var socket = io.connect('http://example.com:3000');
socket.on('connect', function() {
console.log('connected');
});
socket.on('message', function(msg){
console.log(msg);
});
socket.on('disconnect', function() {
console.log('disconnected');
});
socket.on('error', function (e) {
console.log('System', e ? e : 'A unknown error occurred');
});
Сервер
[...]
app.listen(3000);
// socket.io setup
var socket = require('socket.io').listen(app);
// socket.io connection establishment
socket.on('connection', function (client) {
client.send("hello");
console.log("hello", client);
});
Почему событие соединение никогда не запускается?
Ответы
Ответ 1
Понадобилось время, чтобы заметить... событие connection
приведено в io.sockets
. В вашем коде это будет
socket.sockets.on('connection', function (client) {
client.send("hello")
console.log("hello", client)
})
Вы должны использовать io
вместо socket
как имя var, чтобы избежать этой путаницы.
Ответ 2
Рикардо Томаси прав, спас мою жизнь, я сошел с ума.
Если бы все изменилось, мы в 2013 году, все еще проблема открылась (с 2 лет) в этом
возможно, что-то изменилось, так или иначе, чтобы зарегистрировать событие "connect", я должен был сделать это:
var openSocket = function (uniqueID) {
var appSocket = io.connect('/'+uniqueID, { transports: ['websocket', 'xhr-polling']});
appSocket.socket.on('connect', function () {
console.log('i did connect.');
});
return appSocket;
};
Ответ 3
Следующее сделало для меня трюк: socket.io-client: "^ 0.9.16"
io.connect("http://localhost:4000", {'force new connection': true});
Событие "connect" постоянно срабатывает, и повторного использования не происходит.
Я понял эту опцию, исследуя строку socket.io-client/lib/io.js: 192
Поскольку я даже не могу найти этот файл io.js в github, я думаю, что в будущих выпусках есть рефакторинг, и этот вариант может не работать.
По крайней мере, это может быть полезно для тех, кто будет заниматься этой временной работой.