6

我在平均堆栈应用程序中工作,现在我需要使用 XMPP 协议制作聊天模块。
我是 XMPP 的新手,我在 node js 中使用了“node-xmpp-server”和“node-xmpp-client”,在 angular js 中使用了“Strophe.js”

我的代码如下:

app.js(服务器端文件)

"use strict";
var express = require("express");
var https = require('https');
var http = require("http");
var fs = require('fs');
var app = express();
var xmppClient = require('node-xmpp-client');
var xmppServer = require('node-xmpp-server');
var AES = require("crypto-js/aes");
var CryptoJS = require("crypto-js");
/**
 * @description all process variables
 */
require("./config/vars")(app);

var hostName = global.hzConfig.qualifiedHostName;

var config = require("./config/config.js")(app, express);



var friendsArr = [];
var server = null
var startServer = function(done) {
    // Sets up the server.
    console.log("start  server.....");
    console.log('xmpp server is listening on port ' + global.hzConfig.xmppServerPort + " on " + process.pid + ' !');
    server = new xmppServer.C2S.BOSHServer({
        port: global.hzConfig.xmppServerPort,
        domain: 'localhost'
    })

    console.log("server");
    console.log(server);
    // On connection event. When a client connects.
    server.on('connection', function(client) {
        // That's the way you add mods to a given server.
        // Allows the developer to register the jid against anything they want
        console.log('connection');
        client.on('register', function(opts, cb) {
            console.log('REGISTER')
            cb(true)
        })

        // Allows the developer to authenticate users against anything they want.
        client.on('authenticate', function(opts, cb) {
            console.log('server:', opts.username, opts.password, 'AUTHENTICATING')
            if (opts.password === '') {
                console.log('server:', opts.username, 'AUTH OK')
                cb(null, opts)
            } else {
                console.log('server:', opts.username, 'AUTH FAIL')
                cb(false)
            }
        })


        client.on('online', function() {
            console.log("client");
            console.log(client.jid);
            console.log('server:', client.jid, 'ONLINE');

            friendsArr.push(client.jid);

            console.log("friendsArr================>>>>>>>>>>>>>");
            console.log(friendsArr);

            //client.send(new xmppClient.Message({ type: 'chat' }).c('body').t("Hello there, little client."));
        })

        // Stanza handling
        client.on('stanza', function(stanza) {
            console.log(stanza);
            console.log('server:', client.jid, 'stanza', stanza.toString())

            var body = stanza.getChild('body');
            var message = body.getText();

            console.log("body===========>>>>>");
            console.log(body);

            console.log("message===========>>>>>");
            console.log(message);

            var from = stanza.attrs.from;
            stanza.attrs.from = stanza.attrs.to;
            stanza.attrs.to = friendsArr[0];
            console.log("stanza.attrs");
            var sendTo = "laxman@mailinator.com/";
            friendsArr.map(function(obj) {
                if (obj["user"] === "laxman") {
                    console.log(obj["_resource"]);
                    sendTo = sendTo + obj["_resource"];
                }
            });
            //client.send(stanza)
            // client.send(stanza)
            //console.log("stanza.attrs.from");
            //console.log(stanza.attrs.from);
            console.log("sendTo++++++++++ ::::: " + sendTo);


            var stanza = new xmppClient.Element('message', { to: sendTo, type: 'chat', 'xml:lang': 'ko' }).c('body').t('aaaaaMessage from admin1');
            client.send(stanza);
            console.log(stanza);


            //client.send(new xmppClient.Message({to : sendTo, type: 'chat' }).c('body').t("Hello there, little client."));



        })

        // On Disconnect event. When a client disconnects
        client.on('disconnect', function() {
            console.log('server:', client.jid, 'DISCONNECT')
        })
    })

    server.on('listening', function() {})
}

startServer();

message_service.js(客户端文件)

(function() {
    'use strict';
    angular
        .module("myApp")
        .factory("HzXMPPService", ['$rootScope', '$cookies', '$location', 'HzServices',
            function($rootScope, $cookies, $location, HzServices) {

                console.log("*****************************************");
                return {
                    OnConnectionStatus: function(conn, obj) {
                        console.log("conn");
                        console.log(conn);

                        console.log("Strophe.Status");
                        console.log(Strophe.Status);

                        this.OnConnected(conn);
                    },

                    OnConnected: function(conn) {
                        console.log("OnConnected call");
                        //Callback fired when availability status of your's or your friends changes.
                        conn.addHandler(this.OnPresenceStanza, null, "presence");

                        //callback fired while receiving message
                        conn.addHandler(this.OnMessageStanza, null, "message");

                        //callback fired when a friend/authorize request is received
                        conn.addHandler(this.OnSubscribeStanza, null, "presence", "subscribe");

                        //callback when your friend/authorize request is responded by another user.
                        conn.addHandler(this.OnSubscribedStanza, null, "presence", "subscribed");

                        //send presence to all who have added you to their contact list i.e., send online status to other clients. We are sending "available" status 
                        //conn.send($pres());
                    },

                    OnPresenceStanza: function(stanza) {
                        console.log("OnPresenceStanza call");
                        var sFrom = $(stanza).attr('from');

                        console.log("sFrom");
                        console.log(sFrom);

                        var sBareJid = Strophe.getBareJidFromJid(sFrom);
                        console.log("sBareJid");
                        console.log(sBareJid);

                        var sTo = $(stanza).attr('to');
                        console.log("sTo");
                        console.log(sTo);

                        var sType = $(stanza).attr('type');
                        console.log("sType");
                        console.log(sType);

                        var sShow = $(stanza).find('show').text();

                        console.log("sShow");
                        console.log(sShow);
                        //OnSubscribeStanza();
                        //OnSubscribeStanza();
                        //sendAuthorizeRequest();
                        sendMessage();
                        return true;
                    },

                    //callback is also fired when other user is typing or paused. 
                    OnMessageStanza: function(stanza) {
                        console.log("OnMessageStanza call");
                        console.log(stanza);
                        var STo = $(stanza).attr('to');
                        console.log("to");
                        console.log(STo);


                        var sType = $(stanza).attr('type');
                        console.log("sType");
                        console.log(sType);

                        var sBareJid = Strophe.getBareJidFromJid(STo);
                        console.log("sBareJid");
                        console.log(sBareJid);

                        var sBody = $(stanza).find('body').text();
                        console.log("sBody");
                        console.log(sBody);

                        if (sBody) {
                            console.log("A Message Received: " + sBody + " From " + STo);
                        }

                        return true;
                    },

                    OnSubscribeStanza: function(stanza) {
                        console.log("OnSubscribeStanza call");
                        if (stanza.getAttribute("type") == "subscribe") {
                            var from_id = stanza.getAttribute("from");

                            console.log("from_id");
                            console.log(from_id);
                            //send back authorize request to accept it.
                            conn.send($pres({ to: from_id, type: "subscribed" }));
                        }

                        return true;
                    },

                    OnSubscribedStanza: function(stanza) {
                        console.log("OnSubscribedStanza call");
                        if (stanza.getAttribute("type") == "subscribed") {
                            var from_id = stanza.getAttribute("from");

                            //send back confirm authorize request.
                            conn.send($pres({ to: from_id, type: "subscribed" }));
                        }

                        return true;
                    },

                    //make a friend request
                    sendAuthorizeRequest: function() {
                        conn.send($pres({ to: "rahul@mailinator.com", type: "subscribe" }));
                    },

                    //disconnect from XMPP server
                    disconnect: function() {
                        console.log("connected disconnect");
                        conn.flush();
                        conn.sync = true;
                        conn.disconnect();
                    },

                    //send a message.
                    sendMessage: function(conn, msg) {
                        console.log("Friends  call .....");
                        console.log("conn.jid");
                        console.log(conn.jid);
                        //return false;
                        var message = $msg({ to: "laxman@mailinator.com", from: conn.jid, type: "chat" }).c("body").t(msg);

                        conn.send(message.tree());
                    },

                    onMessage: function(message) {
                        console.log('service message = ');
                        console.log(message);
                        return true;
                    },

                    createAccount: function() {
                        conn = new Strophe.Connection("localhost");
                        conn.register.connect("localhost", OnConnectionStatus, 60, 1);
                    }

                }
            }
        ]);
}());

为了测试,我使用静态用户在服务器端文件中向 Laxman 发送消息。

我的主要问题是该消息无法广播给我的朋友。

4

0 回答 0