Node.js - Socket.io io.emit()什么都不做

时间:2015-06-08 21:09:41

标签: javascript node.js socket.io

我的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无法使套接字在该方法中加入房间。

2 个答案:

答案 0 :(得分:4)

套接字属于某个名称空间。

通过编写io.of('/projects/test_cases').on('connection', function(socket){});,您将所有连接的套接字放入'/ projects / test_cases'命名空间。

写作

 io.sockets.emit("test_case_changed", "test1");
 io.emit("test_case_changed", "test2");

您将发出与'/ projects / test_cases'

不同的默认命名空间'/'

您可以轻松查看使用的命名空间:

console.log(io.sockets.name) // '/'
console.log(io.of('/projects/test_cases').name) // '/projects/test_cases'

您可能希望显式指定套接字的名称空间以将消息发送到

io.of('/projects/test_cases').emit("test_case_changed", "test1");

<强> UPD: 至于问题的第二部分,您可能想知道join是一个异步操作。这就是为什么room1不在socket.rooms右下一行代码的原因。 当插座在房间内时,您可以使用以下行收到通知:

socket.join("room1", function(err){
    console.log("After join: ", socket.rooms);
});

答案 1 :(得分:2)

这对我有用。它正在发送一条名为&#39; Event&#39;连接另一个插座后连接到所有连接的插座。

我刚刚删除了未使用的代码,因此请先尝试先从头开始。

另外,我的文档工作并不是那么糟糕..  http://socket.io/docs/以及特定名称空间http://socket.io/docs/rooms-and-namespaces/

APP.JS

var server = require('http').createServer();
var io = require('socket.io')(server);
var port = 8080;

var nsp = io.of('/projects/test_cases');
nsp.on('connection', function(socket) {
    console.log('someone Connected!');
    nsp.emit('event', 'data');
});

server.listen(port, function(){});

index.html

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<script src="https://cdn.socket.io/socket.io-1.3.5.js"></script>
<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("event", function (data){
        console.log(data);
    });
</script>
</body>
</html>

要测试它在3或4个选项卡中打开index.html文件,只需在其中一个上按刷新5或6次,然后检查控制台中的其他选项卡..它应该被记录&#39;数据&# 39;几次。