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

Posted

技术标签:

【中文标题】在 node.js 中打开套接字时发送数据【英文标题】:Send data when opening a socket in node.js 【发布时间】:2012-08-20 20:20:23 【问题描述】:

我正在配置一个 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://***.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将为null...

【问题讨论】:

【参考方案1】:

我会在服务器上这样做,

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);
    );
);

这样,每当建立新连接时,首先在服务器上使用所需的配置变量调用 setup 事件。

【讨论】:

让我看看。最后两个问题。你为什么要“发射”设置和数据?为什么要发送昵称?我的意思是,我怎样才能在服务器上获得昵称? 太棒了!非常感谢!这按预期工作。最后一个问题。如果服务器关闭,当连接重新建立时,套接字不会再次发出配置。我该怎么做?我真的是使用套接字和 node.js 的新手。 我找到了:socket.on('reconnect', function () ); 再次感谢! 啊,我没有看到发射数据和设置昵称部分,等我到了我的电脑就会编辑掉。

以上是关于在 node.js 中打开套接字时发送数据的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从 Android 中的数据报套接字发送到 Node js 服务器?

从 PHP 向 Node.js 发送消息

将套接字从 python 发送到 Meteor (node.js)

可以通过套接字发送啥样的数据?

c# SocketIoClientDotNet, node js socket.IO

通过套接字发送命令,但每次都等待响应(Node.js)