1

プッシュ通知のサーバーとして使用するために、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');

常にclient.xmlをリッスンするのではなく、どのxmlをリッスンする必要があるかを特定するために。

どうすればいいですか?私はserver.jsにこれを持っています:

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

ただし、サーバーは接続が開いているときにのみ実行され、ソケットが開いているときは実行されないため、クライアントとサーバー間の接続が失敗した場合、jquery がソケットを開こうとすると、id は null になります...

4

1 に答える 1

3

代わりにサーバーでこれを行いますが、

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、必要な構成変数を使用してサーバーでイベントが最初に呼び出されます。

于 2012-08-20T21:05:48.747 に答える