在node.js中打开套接字时发送数据

我正在configuration一个nodejs服务器,以便将其用作推送通知的服务器。

我有这个代码:

io.sockets.on('connection', function(socket) { console.log(socket); // watching the xml file fs.watchFile('client.xml', function(curr, prev) { // on file change we can read the new xml fs.readFile('client.xml', function(err, data) { if (err) throw err; // parsing the new xml datas and converting them into json file parser.parseString(data); }); }); // when the parser ends the parsing we are ready to send the new data to the // frontend page parser.addListener('end', function(result) { socket.volatile.emit('notification', result); }); }); 

在服务器上。 在客户端这一个:

 <script> function test(data) { console.log(data); jQuery('#' + data.id).html(data.content); } </script> <script> // creating a new websocket var socket = io.connect('http://10.0.0.113:8000'); // on every message recived we print the new datas inside the #container div socket.emit('data', {id : 'id'}); socket.set('nickname', {id : 'test'}); socket.on('notification', function(data) { _efbn(data.callback, window, data.response, data); }); /** * Función que ejecuta una función por nombre. Puede usar namespaces * (algo.algo.algo.funct) * * @see http://stackoverflow.com/questions/359788/javascript-function-name-as-a-string/359910#359910 */ function _efbn(functionName, context) { var args = Array.prototype.slice.call(arguments); args = [ args[2], args[3] ]; // Fix para IE. var namespaces = functionName.split("."); var func = namespaces.pop(); for ( var i = 0; i < namespaces.length; i++) { context = context[namespaces[i]]; } try { if (typeof context[func] == 'function') { return context[func].apply(this, args); } } catch (e) { console.log(e); } return null; } </script> 

一切正如我所愿。 但是,我想发送像这样的东西:

 socket.set('site', '12345'); socket.set('object', 'ABCDE'); 

为了确定我应该监听哪个xml,而不是一直监听client.xml。

我该怎么做? 我有这个server.js:

 id = require('url').parse(req.url, true).query.id; 

但是,因为服务器只有当连接打开时执行,但没有当套接字打开,如果客户端和服务器之间的连接失败,当jQuery重试打开套接字,ID将为空…

我会这样做,而不是在服务器上,

 io.sockets.on('connection', function(socket) { console.log(socket); socket.on('setup', function(config) { // use your connection specific config variables like var id = config.id; // and then use id in your logic below. // watching the xml file fs.watchFile('client.xml', function(curr, prev) { // on file change we can read the new xml fs.readFile('client.xml', function(err, data) { if (err) throw err; // parsing the new xml datas and converting them into json file parser.parseString(data); }); }); // when the parser ends the parsing we are ready to send the new data to the // frontend page parser.addListener('end', function(result) { socket.volatile.emit('notification', result); }); }); }); 

而在客户端,

 // creating a new websocket var socket = io.connect('http://10.0.0.113:8000'); socket.on("connect", function() { // Setup your connection on the server-side by providing it // some config variables. var config = { id: "id", nickname: "test" }; socket.emit("setup", config); // on every message recived we print the new datas inside the #container div socket.on('notification', function(data) { _efbn(data.callback, window, data.response, data); }); }); 

这样,每当build立一个新的连接时,首先在服务器上用所需的configurationvariables调用setup事件。