使用node.js上的socket.on方法从浏览器获取数据
问题描述:
使用nodejs我将数据流式传输到客户端/浏览器,并且没有任何问题地列出它们。我想要做的是通过点击它们将一些ID发送回服务器。无论如何,这里是我的代码。我希望你能告诉我在这种情况下我做错了什么。使用node.js上的socket.on方法从浏览器获取数据
服务器端
var socketServer = io.listen(server);
socketServer.set('log level', 1); //don't log all emits etc
socketServer.sockets.on('connection', function(socket) {
console.log('New connection logged');
socketServer.sockets.emit('data', t.globalState);
});
//This is not working!
//I tried to put it in different places, no changes!
socketServer.sockets.on('hello', function(data) {
console.log('Hello!');
});
socketServer.sockets.on('close', function(socket) {
console.log('socketServer has closed');
});
var t = new conwit(config.conwit);
t.openStream = function() {
console.log('Opening Stream');
t.createStream();
};
t.createStream = function() {
t.stream('statuses/filter', {
track: t.globalState.tags,
language: config.language
}, function(stream) {
stream.on('data', t.emitT);
stream.on('error', function(error) {
console.log("My error: ", error);
setTimeout(function() {
t.openStream();
}, 30000);
});
});
};
t.emitT = function (data) {
console.log(' receiving');
if (data.text !== undefined) {
socketServer.sockets.emit('data', data);
}
};
t.openStream();
return t;
};
浏览器端
TM.socket.on('data', function(msg) {
alert('News from server: ' + msg); //this works
TM.socket.emit('hello', {msg:'Hello server'}); //this doesn't work!
});
$('#send').on('click', function(event) {
event.preventDefault();
TM.socket.emit('hello', { //this doesn't work
rF: "foo",
rT: "zazz",
ea: "limk"
});
});
没有错误/两侧日志消息。
答
更改服务器的代码如下:
var socketServer = io.listen(server);
// Are you sure you have instantiated the config variable you use here?
var t = new conwit(config.conwit);
socketServer.set('log level', 1); //don't log all emits etc
// Every time a socket connects to the server, this callback executes.
// Notice that there is a convenient 'socket' variable to use as a
// handle for this specific socket.
socketServer.sockets.on('connection', function(socket) {
console.log('New connection logged');
socketServer.sockets.emit('data', t.globalState);
// This broadcasts the message to all the sockets (including the current
// one)
socketServer.sockets.emit('data', 'Hey everybody! A new client has connected!')
// This broadcasts the message to all the sockets but not the current
// one
socket.broadcast.emit('data', 'Hey everybody! A new client has connected!')
// Now when a specific socket emits the 'hello' event, this callback will
// execute...
socket.on('hello', function(data) {
console.log('Hello!');
// ...and it will send a 'data' event back to the socket
socket.emit('data', 'Hello client! This is your server speaking.');
});
// ...add more socket and/or t events here
});
注意,有三种方式与插座进行沟通;
-
socketServer.sockets.emit(EVENT_NAME,EVENT_DATA):此发出一个事件,所有连接的插座,包括触发事件的一个。例如,假设一个网页绑定使用此代码在一个红色的按钮:
socket.emit('red button clicked');
然后,您的服务器上,你有这样的代码:
socket.on('red button clicked', function() { socketServer.sockets.emit('boom', 'A user clicked the red button'); });
用户每次点击在页面上的按钮上,所有客户端(包括点击按钮的客户端)都将收到“繁荣”事件。
socket.broadcast.emit(EVENT_NAME,EVENT_DATA):这是与上面,所有的客户端将收到的情况下,除了谁上的按钮点击一个唯一的区别。
socket.emit(event_name,event_data):这只会将'boom'事件发送给点击按钮的客户端。
欲了解更多信息,请参阅Socket.IO documentation。
这就像一个魅力。我错过了socketServer.sockets.on中的** socket **变量('connection',function(** socket **)),并且yes ** config.conwit **正确传递。 – hayzem 2014-11-23 10:41:06