Node.js - Socket.io io.emit() 什么都不做
Node.js - Socket.io io.emit() doing nothing
我的 socket.io 应用程序有问题,io.emit() 和 io.sockets.emit() 直接不起作用,它们什么都不做,并且 return 没有错误。
我在这里提供了我可以在这里编写的代码的最简化版本。
服务器:
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 你不能用那个方法让套接字加入房间。
这对我有用。一旦连接了另一个套接字,它就会向所有连接的套接字发送一条名为 'Event' 的消息。
我刚刚删除了未使用的代码,所以请先尝试这样做并从头开始。
此外,文档对我来说还不错..
http://socket.io/docs/ and for namespaces specific 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 次,然后检查控制台中的其他选项卡。它应该被记录 'data'几次。
套接字属于某个命名空间。
通过写入 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");
更新:
至于问题的第二部分,你可能想知道 join
是一个异步操作。这就是为什么 room1
不在 socket.rooms
的下一行代码中。
当插座在房间内时,您可能会收到通知,使用以下行:
socket.join("room1", function(err){
console.log("After join: ", socket.rooms);
});
我的 socket.io 应用程序有问题,io.emit() 和 io.sockets.emit() 直接不起作用,它们什么都不做,并且 return 没有错误。
我在这里提供了我可以在这里编写的代码的最简化版本。
服务器:
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 你不能用那个方法让套接字加入房间。
这对我有用。一旦连接了另一个套接字,它就会向所有连接的套接字发送一条名为 'Event' 的消息。
我刚刚删除了未使用的代码,所以请先尝试这样做并从头开始。
此外,文档对我来说还不错.. http://socket.io/docs/ and for namespaces specific 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 次,然后检查控制台中的其他选项卡。它应该被记录 'data'几次。
套接字属于某个命名空间。
通过写入 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");
更新:
至于问题的第二部分,你可能想知道 join
是一个异步操作。这就是为什么 room1
不在 socket.rooms
的下一行代码中。
当插座在房间内时,您可能会收到通知,使用以下行:
socket.join("room1", function(err){
console.log("After join: ", socket.rooms);
});