我正在使用 node-xmpp 服务器作为 2 个客户端的聊天服务器:Psi 和 Spark。我为每个客户端注册了一个帐户。我想从 Psi 帐户向 Spark 帐户发送一条消息。每次我从一个帐户同一个帐户接收消息。我想将朋友添加到我的列表中(我不知道为什么不起作用..可能没有实现)并正确发送消息。我正在使用节点 xmpp 服务器/示例/ server-and-client.js。感谢您的建议。
问问题
892 次
2 回答
2
这个完整的代码对我来说工作得很好:
var xmpp = require('node-xmpp-server');
function generateRoster(jid, name, id, to) {
// This is a roster request, we create the response node
var roster = new xmpp.Element('iq', {
id: id,
to: to,
type: 'set'
});
roster.c('query', {xmlns: 'jabber:iq:roster', ver: 'ver13'})// We add a children tag `query`, with the two attribute xmlns and ver
.c('item', { // We add a children 'Item'
jid: jid, // We send the jid and the name
name: name,
subscription: 'both'
}).c('group').t('Connected Clients'); // We add it to the 'Connected Clients' group
return roster;
}
var startServer = function (done) {
// Sets up the server.
server = new xmpp.C2S.TCPServer({
port: 5222,
domain: 'localhost'
});
var connectedUsers = [];
var clientsHandles = {};
// On connection event. When a client connects.
server.on('connection', function (client) {
var userJid = null;
// That's the way you add mods to a given server.
// Allows the developer to register the jid against anything they want
client.on('register', function (opts, cb) {
console.log('REGISTER');
console.log(cb);
cb(false)
});
// 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 === 'secret') {
//console.log('server:', opts.username, 'AUTH OK')
cb(null, opts)
}
else {
//console.log('server:', opts.username, 'AUTH FAIL')
cb(false)
}
});
client.on('online', function () {
userJid = client.jid.user + '@' + client.jid.domain + '/' + client.jid.resource;
console.log(userJid + 'ONLINE');
for (var i = 0; i < connectedUsers.length; i++) {
var myRoster = generateRoster(userJid, userJid, 'myRandomId', connectedUsers[i]);
if (clientsHandles[connectedUsers[i]]) {
clientsHandles[connectedUsers[i]].send(myRoster);
console.log("Sending my new infos to ", connectedUsers[i]);
}
}
connectedUsers.push(userJid);
client.jid.userJid = userJid;
clientsHandles[userJid] = client;
});
// Stanza handling
client.on('stanza', function (stanza) {
if (stanza.is('message') && (stanza.attrs.type !== 'error')) {
if (clientsHandles[stanza.attrs.to]) {
clientsHandles[stanza.attrs.to].send(stanza);
}
}
else if (stanza.is('presence')) {
// We loop through the user list
for (var j = 0; j < connectedUsers.length; j++) {
console.log(stanza.toString());
var jid = connectedUsers[j];
stanza.to = jid;
clientsHandles[jid].send(stanza);
}
}
else if (stanza.is('iq') && stanza.attrs.type == 'get') {
for (var i = 0; i < stanza.children.length; i++) {
if (stanza.children[i].name == 'query' && stanza.children[i].attrs.xmlns == 'jabber:iq:roster') {
// We loop through the user list
for (var j = 0; j < connectedUsers.length; j++) {
var roster = generateRoster(connectedUsers[j], connectedUsers[j], stanza.attrs.id, stanza.attrs.from);
client.send(roster); // We send it back to the client
}
}
}
client.send(stanza);
}
else {
client.send(stanza);
}
});
// On Disconnect event. When a client disconnects
client.on('disconnect', function () {
if (userJid) {
console.log(userJid, "DISCONNECTED");
connectedUsers.splice(connectedUsers.indexOf(userJid), 1);
delete clientsHandles[userJid];
}
});
});
server.on('listening', done)
};
startServer(function () {
console.log("Server running");
});
当消息节到达时,我检查接收器是否已连接,如果是,我将节发送给它。
于 2015-08-25T10:50:24.043 回答
1
使用正确的客户端连接发送消息,即
1)。验证时将客户端的所有连接存储在一个数组中。
2)。当消息出现时,找到与消息节中的“to”字段相关联的正确客户端。
var receiverCleint = getClient(msgStanza.attrs.to)
3)。返回正确的客户端并通过该客户端发送消息。
receiverCleint.send(msgStanza)
我也在做同样的演示,我唯一担心的是当更多的用户添加时这将是一个问题,因为它必须通过所有客户端迭代每条消息。
任何更好的方法表示赞赏。
代码:
var clients = new Array();
c2sRouter.on("connection", function(client){
client.on("register", function(opts, cb){
console.log("client server", "register");
})
client.on("authenticate", function(opts, cb){
console.log("client server", "authenticate");
if(opts.password === "tushar" || opts.password === "tushar1"){
clients.push(client);
cb(null, opts);
}else{
cb(false, opts);
}
})
client.on("online", function(){
console.log("client server", "online");
})
client.on("stanza", function(stanza){
console.log("client server", stanza.toString());
if(stanza.is("message")){
var receiverClient = getClient(stanza.attrs.to)
if(receiverClient === undefined){
client.send(stanza);
} else {
receiverClient.send(stanza);
}
}
})
client.on("disconnect", function(){
console.log("client server", "disconnect");
})
})
var getClient = function (to) {
var clientLength = clients.length;
var client
var clientId;
for(var i = 0; i < clientLength; i++){
client = clients[i];
clientId = client.jid.user + "@" + client.jid.domain
if(to.indexOf(clientId) == 0){
return client;
}
}
}
于 2015-08-23T14:22:08.027 回答