我有一个像这样的应用程序:
io.of('/hello').on('connection', function(socket) {
socket.emit('world', {});
});
app.post('/', function *(next) {
console.log("At here......");
var pushMessage = (yield parse.json(this));
console.log(pushMessage);
if(flag !== 0) {
// io.of('/hello/').emit('world', pushMessage);
io.sockets.emit('world', pushMessage);
} else {
console.log("Do Nothing");
}
});
它收到一个http请求并发出一个事件。当我使用io.sockets.emit时效果很好,但是当我用'io.of('hello')指定命名空间时,发出'它'不起作用,为什么?
我的客户方是:
var socket = io.connect('http://localhost:3000', {
'reconnection delay': 100,
'reconnection limit': 100,
'max reconnection attempts': 10
});
//server side use io.sockets.emit
socket.on('world', function(data) {
alert(data.a);
});
//if server side use io.of('/hello/').emit
//socket.of('/hello/').on('world', function(data) {
// alert(data.a);
//});
答案 0 :(得分:10)
您的代码或多或少都很好,但您使用的是不同的命名空间。
io.sockets.emit()
向当前通过套接字连接到服务器的所有人广播。这就是它起作用的原因。从技术上讲,这是因为io.of('').emit()
(''
是命名空间)的“捷径”。
假设您要使用/hello
命名空间,这就是您必须在客户端上执行的操作:
var socket = io.connect('http://localhost:3000/hello'); // your namespace is /hello
首先必须在服务器上监听该命名空间上的连接:
io.of('/hello').on('connection', function(socket) {
socket.emit('world', { a: 'hi world' });
});
然后:
io.of('/hello').emit('something');
您可能需要查看以下内容:socket.io: How to use和socket.io rooms on GitHub
###更新###
我做了一点测试:
客户端:
$('document').ready(function() {
var socket = io.connect("localhost:3000/hello");
socket.on('hello', function() {
console.log('hello received');
});
var data = {};
data.title = "title";
data.message = "message";
setTimeout(function() {
$.ajax({
type: 'POST',
data: JSON.stringify(data),
contentType: 'application/json',
url: 'http://localhost:3000/hello',
success: function(data) {
console.log('success');
console.log(JSON.stringify(data));
}
});
}, 2000);
});
服务器:
io.of('/hello').on('connection', function() {
console.log("client connected");
});
app.post('/hello', function(req, res) {
io.of('/hello').emit('hello');
});
......它奏效了。我从here复制了jquery-ajax代码。