不使用socket.io和node.js发出/接收事件

时间:2012-06-07 13:33:30

标签: javascript node.js socket.io

所以我有这个非常基本的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。

提前多多感谢!

1 个答案:

答案 0 :(得分:3)

如果您的projectnamestock,那就是您的问题。 Socket.IO认为你正在使用namespace。您可以在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为客户端库提供服务,但是您可能会通过在端口80处从您的apache服务器提供的文档中引用该资产来遇到跨域原始策略问题。快速修复可以从您的apache服务器提供客户端lib,该服务器位于socket.io-client模块dist文件夹中。