【发布时间】:2015-08-23 12:14:58
【问题描述】:
我的 socket.io 应用程序出现问题,io.emit() 和 io.sockets.emit() 直接不起作用,它们什么也不做,也不返回错误。
我在这里提供了最简化的代码版本。
服务器:
var server = require('http').createServer();
var io = require('socket.io')(server);
var port = 8080;
io.use(function(socket, next){
next();
});
io.of('/projects/test_cases').on('connection', function(socket){
io.sockets.emit("test_case_changed", "test1"); // Doesn't do anything
io.emit("test_case_changed", "test2"); // Doesn't do anything
socket.emit("test_case_changed", "test3"); // Works
io.to(socket.id).emit("test_case_changed", "test4"); // doesn't work
});
io.on('connection', function(socket){
socket.on('disconnect', function(){
});
});
server.listen(port, function(){
console.log('listening on *:' + port);
setTimeout(function(){
io.sockets.emit("test_case_changed", "test"); // does nothing
io.emit("test_case_changed", "test"); // does nothing
}, 3000);
});
客户:
<script>
var socket = io('http://localhost:8080/projects/test_cases');
socket.on('error', function (reason){
console.error('Unable to connect Socket.IO', reason);
});
socket.on('connect', function (){
console.info('Connected');
});
socket.on("test_case_changed", function (data){
console.log(data);
});
</script>
如您所见,在客户端 test1、test2、test3 和 test4 应该都在客户端打印,但只有 test3 可以。
另外,如果在 on('connection') 方法中添加以下内容
console.log("Pre join: ", socket.rooms);
socket.join("room1"); // Doesn't work
console.log("After join: ", socket.rooms);
这也不起作用。 IE 你不能用那个方法让socket加入一个房间。
【问题讨论】:
-
io.sockets不是连接的套接字数组吗? -
@agconti - 它是一个带有一些方法的对象。 socket.io 中一个非常令人困惑且大多未记录的接口。很棒的图书馆,糟糕的文档。
-
@agconti 是一个对象。该行没有返回任何未定义的方法错误,或者根本没有任何错误,而且我在其他人的实现中也看到过,所以我相信这是一个有效的调用。
-
@jfriend00 啊谢谢你把它弄明白了。
-
@jfriend00 它是如何安装 socket.io 中间件的。它仅在源代码中可用。
标签: javascript node.js socket.io