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

5
所以我有一个非常基本的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"}]}

这似乎是客户端发送的数据实际上已经到达了服务器。然而,这似乎并没有解决实际的问题:控制台日志行以及客户端和服务器端都没有执行。此输出来自Firefox 5.0.1,它似乎会回退到xhr。
提前感谢您的帮助!

为什么要使用 http://127.0.0.1:8080/projectname/server/ 而不是 http://127.0.0.1:8080/ 或者仅仅是 io.connect() 呢? - alessioalex
我无法确定,这更多是通过试错得出的结果。这是服务器 app.js 的位置。其他所有内容都会在 socket.io.js 上抛出客户端 404 错误。也许是因为我同时在本地主机上运行了一个 Apache web 服务器。 - ngmir
你是通过Apache代理到Node还是其他方式? - alessioalex
听起来你可以放弃 projectname/server 直接连接到 127.0.0.1:8080。如果客户端直接连接到你的节点应用程序的8080端口,那么你的app.js所在的位置就无关紧要了...它位于 8080。你在第二个日志中使用的是哪个版本的Firefox?Socket.io退回到了xhr轮询...甚至没有运行web sockets。 - Wes Johnson
是的,不同的输出只是因为Firefox版本过旧。使用最新版本时,输出与Chrome相同。 - ngmir
显示剩余2条评论
1个回答

4
如果你的projectnamestock,那么这就是你的问题。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端口上提供的文档中引用该资源,则可能会遇到跨域源策略问题。快速解决方法可以是从socket.io-client模块的dist文件夹中提供客户端lib。

谢谢!关于您的PS,这就是我刚刚做的。 - ngmir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接