Не излъчва/получава събития с socket.io и node.js

Така че имам тази много проста настройка на socket.io, която вероятно сте виждали вече хиляди пъти.

Моля, имайте предвид, че тук файловете се обслужват чрез apache.

сървър (app.js)

var io = require('socket.io').listen(8080);

io.sockets.on('connection', function(socket){ 
    socket.emit('server ready', {msg: 'hi'}) ;

    socket.on('random event', function(data) {
        console.log('received');
    })
}); 

иклиента

$(document).ready(function() {
    var socket = io.connect('http://127.0.0.1:8080/projectname/server/');

    socket.on('server ready', function(data){ 
        console.log('server ready!'); 
    });

    socket.emit('random event', {hurr: 'durr'});
});

Въпреки това, единственият резултат, който получавам, е

 debug - websocket writing 5:::{"name":"server ready","args":[{"msg":"hi"}]}

в конзолата на възела и нищо в конзолата на клиента. Което е грешно.

Опитах основния пример от уебсайта socket.io и той показва абсолютно същото поведение. Той регистрира излъчените данни в конзолата на възела, но изглежда нищо друго не се случва.

Редактиране: При допълнително проучване, посещението на сайта във Firefox създава различен изход в конзолата на възела:

info  - handshake authorized 178702677759276313
   debug - setting request GET /socket.io/1/xhr-polling/178702677759276313?t=1339080239192
   debug - setting poll timeout
   debug - client authorized for 
   debug - clearing poll timeout
   debug - xhr-polling writing 1::
   debug - set close timeout for client 178702677759276313
   debug - xhr-polling received data packet �17�1::/stock/server/�66�5::/stock/server/:{"name":"random event","args":[{"hurr":"durr"}]}
   debug - setting request GET /socket.io/1/xhr-polling/178702677759276313?t=1339080239263
   debug - setting poll timeout
   debug - clearing poll timeout
   debug - xhr-polling writing 5:::{"name":"server ready","args":[{"msg":"hi"}]}

Изглежда, че данните, излъчени от клиента, действително са достигнали сървъра. Изглежда обаче, че не решава действителния проблем: редовете console.log и както клиентската, така и сървърната страна не се изпълняват. Този резултат е от Firefox 5.0.1, където изглежда се връща към xhr.

Благодаря много предварително!


person ngmir    schedule 07.06.2012    source източник
comment
Защо http://127.0.0.1:8080/projectname/server/, а не http://127.0.0.1:8080/ или просто io.connect()?   -  person alessioalex    schedule 07.06.2012
comment
не мога да кажа точно, това е по-скоро резултат от проба и грешка. тук е сървърът app.js. всичко останало хвърля клиентска грешка 404 на socket.io.js. може би защото имам apache уеб сървър, работещ на localhost едновременно.   -  person ngmir    schedule 07.06.2012
comment
Използвате ли прокси към Node чрез Apache или какво точно?   -  person alessioalex    schedule 07.06.2012
comment
не съзнателно. нов съм в тези неща. файловете се обслужват с apache през някакъв стандартен порт (80 предполагам). клиентът се свързва към socket.io през порт 8080, както можете да видите.   -  person ngmir    schedule 07.06.2012
comment
Звучи сякаш можете да изпуснете projectname/server и просто да се свържете с 127.0.0.1:8080. Ако клиентът се свързва директно към вашето приложение за възел на порт 8080, местоположението, където е вашият app.js, няма значение.. то живее на 8080. Коя версия на Firefox сте използвали в този втори журнал? Socket.io се върна към xhr polling.. дори не изпълнява уеб сокети.   -  person Wes Johnson    schedule 07.06.2012
comment
не мога да изпусна пътя, в противен случай получавам грешка 404 при получаване на клиентския socket.io.js. версията беше 5.0.1 (обикновено не използвам ff). актуализира се сега.   -  person ngmir    schedule 07.06.2012
comment
да, различният изход просто идва от това, че firefox е остарял. с най-новата версия изходът е същият, отколкото с chrome.   -  person ngmir    schedule 07.06.2012


Отговори (1)


Ако вашето projectname е stock, тогава това е ваш проблем. Socket.IO мисли, че използвате именно пространство . Можете да видите това в дневния ред xhr-polling received data packet. console.log никога не се извиква, тъй като не слушате това пространство от имена от страна на сървъра.

Трябва да се отървете от /projectname/server от вашия клиентски адрес за свързване и да препратите правилно към библиотеката от страна на клиента, за да не получите 404. Дали това е проблем с Apache прокси или коригирането на script src в заглавката ви зависи от текущата ви настройка. Не мога да разбера от кода, който предоставихте.

PS: Socket.io трябва да обслужва клиентската библиотека на http://127.0.0.1:8080/socket.io/socket.io.js, но може да се сблъскате с проблем с политиката за произход между домейни, като се позовавате на този актив от документ, обслужван от вашия apache сървър на порт 80. Бързо решение може да бъде да обслужвате клиентската библиотека от вашия apache сървър, който е в папката socket.io-client модул dist.

person Wes Johnson    schedule 07.06.2012
comment
Благодаря ти! относно вашия PS, това е, което току-що направих. - person ngmir; 07.06.2012