摘要:解析的最終結(jié)果是,上下線通知。解析的結(jié)果是,同時(shí)可以通過(guò)和構(gòu)建父子級(jí)別元素。單聊發(fā)送查詢(xún)歸檔歷史記錄漫游查詢(xún)歸檔之前,首先是要確保歸檔存庫(kù)成功,服務(wù)端查看傳送門(mén),自行處理,參見(jiàn)。栽過(guò)的坑轉(zhuǎn)的時(shí)候回調(diào)函數(shù)丟失參考文獻(xiàn)高級(jí)編程使用和
摘要
小編是個(gè)寫(xiě)了幾年php的碼農(nóng), 接觸純Js的項(xiàng)目這也是頭一次,另外,IM的服務(wù)端是Java(tigase框架) ,為了解決舊版本BOSH(長(zhǎng)輪詢(xún))即時(shí)消息不穩(wěn)定問(wèn)題,決定更換pc網(wǎng)頁(yè)版為websockt鏈接, App用socket直連,特此更新服務(wù)端到8.0,更新安裝期間遇到了不少坑,再次記錄,熟練IM或者xmpp協(xié)議用法的不用繼續(xù)看了。
怎么添加賬戶(hù),測(cè)試是否成功等工具方法見(jiàn)另一篇
傳送門(mén)基礎(chǔ)語(yǔ)法
xmpp尋址和節(jié),另一篇基礎(chǔ) 應(yīng)用層協(xié)議之xmpp基礎(chǔ)學(xué)習(xí)
xmpp主要是以xml格式傳輸數(shù)據(jù),詳細(xì)請(qǐng)看xep協(xié)議,這里用strophe的構(gòu)建器,主要用到的如下:
$iq,info query,主要用來(lái)查詢(xún)服務(wù)器信息,解析的最終結(jié)果是執(zhí)行流程 登陸認(rèn)證。 $pres,解析的最終結(jié)果是 ,上下線通知。 $msg, 解析的結(jié)果是 ,同時(shí)可以通過(guò).up()和.c()構(gòu)建xml父子級(jí)別元素。
im.connect = new Strophe.Connection("ws://localhost:5290/xmpp-websocket/"); im.connect.connect("jid@localhost","pass",function(){ console.info("this is login callback."); });
這里,服務(wù)端其實(shí)是分為兩步走,第一步是連接,連接成功后會(huì)返回狀態(tài)碼1,然后是登陸,登陸成功后返回狀態(tài)5,詳細(xì)的狀態(tài)碼參考源碼:
關(guān)于密碼認(rèn)證的問(wèn)題,暫時(shí)采取plain方式,后續(xù)更新其他方式,比如:sha1。
發(fā)送demo
var msg = $msg({ to: receiver, from: "jid@localhost", type: "one", name: "zeronlee", photo: "image.png" }).c("body", null,msg); im.connect.send(msg.tree());
查詢(xún)歸檔(歷史記錄漫游)
查詢(xún)歸檔之前,首先是要確保歸檔(存庫(kù))成功,服務(wù)端查看【傳送門(mén)】,自行處理,參見(jiàn)XEP-0136: Message Archiving。
最簡(jiǎn)單的demo:
var iq = $iq({type: "set"}).c("query", {xmlns: "urn:xmpp:mam:1"}); im.connect.sendIQ(iq, function(a){ console.log("sent iq",a); $(a).find("item").each(function(){ var jid = $(this).attr("jid"); // jid console.log("jid",jid); }); });
成功后返回以下信息:
nAhOrNd/DNXBFtivwbm/vrN8I4GL2SLkc76eNmN0ruw= cnosUN6U9Md6o8TvLD42rB6jJnfPKF2DxkEBFmuK/IQ= 14
表明查出了14條歷史消息,查詢(xún)歸檔更多見(jiàn)XEP-0313: Message Archive Management,示例代碼見(jiàn)《插件使用方法》。
群聊群聊相對(duì)單聊要復(fù)雜的多,首先是入群(這里的群沒(méi)有密碼),出席,發(fā)消息。
出席
var presence = $pres({from:"im7858@localhost",to:"6043@muc.localhost"}).c("x", {xmlns: "http://jabber.org/protocol/muc"}).c("history", {maxstanzas: 0, maxchars:0, seconds:0}); im.connect.send(presence, function(a){ console.log("sent presence",a); });
查詢(xún)?nèi)洪_(kāi)放功能信息
var presence = $iq({from:"im7858@localhost@muc.localhost"}).c("query", {xmlns: "http://jabber.org/protocol/disco#items"}); im.connect.send(presence, function(a){ console.log("sent presence",a); });
發(fā)消息同單聊
訂閱推送 內(nèi)網(wǎng)穿透 插件使用方法mam歸檔查詢(xún)demo
/* XEP-0313: Message Archive Management * Copyright (C) 2012 Kim Alvefur * * This file is MIT/X11 licensed. Please see the * LICENSE.txt file in the source package for more information. * * Modified by: Chris Tunbridge (github.com/Destreyf/) * Updated to support v0.3 of the XMPP XEP-0313 standard * http://xmpp.org/extensions/xep-0313.html * */ Strophe.addConnectionPlugin("mam", { _c: null, _p: [ "with", "start", "end" ], init: function (conn) { this._c = conn; Strophe.addNamespace("MAM", "urn:xmpp:mam:1"); }, query: function (jid, options) { var _p = this._p; var attr = { type:"set", from:jid }; options = options || {}; var mamAttr = {xmlns: Strophe.NS.MAM, with:jid}; if (!!options.queryid) { mamAttr.queryid = options.queryid; delete options.queryid; } var iq = $iq(attr).c("query", mamAttr); // var i; // for (i = 0; i < this._p.length; i++) { // var pn = _p[i]; // var p = options[pn]; // delete options[pn]; // if (!!p) { // iq.c("field",{var:pn}).c("value").t(p).up().up(); // } // } // iq.up(); // var onMessage = options.onMessage; delete options.onMessage; var onComplete = options.onComplete; delete options.onComplete; //////////////////////////////////////////////// // iq.cnode(new Strophe.RSM(options).toXML()); var _c = this._c; var handler = _c.addHandler(onMessage, null, "message", null); return this._c.sendIQ(iq, function (a) { console.log(a); _c.deleteHandler(handler); onComplete.apply(this, arguments); }, function (err) { //error callBack function console.log("Error Response from server:", err); }); } });
插件必須是Strophe.addConnectionPlugin("mam", {init:function(){}})結(jié)構(gòu)才得以成功加載,用webpack或者頁(yè)面加載進(jìn)來(lái)之后自動(dòng)實(shí)例化init,群聊就是以插件形式使用,當(dāng)然還可以自定義其他更高級(jí)的,具體參考《XMPP高級(jí)編程+使用JavaScript和jQuery》第三部分十四章。
栽過(guò)的坑addHandlers轉(zhuǎn)handlers的時(shí)候回調(diào)函數(shù)丟失.
參考文獻(xiàn)XMPP高級(jí)編程+使用JavaScript和jQuery
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/105596.html
摘要:摘要是一個(gè)應(yīng)用層協(xié)議,主要做網(wǎng)頁(yè)版即時(shí)通訊,是基于和實(shí)現(xiàn),服務(wù)端常見(jiàn)的框架有等,這三個(gè)都親自踩過(guò)坑,唯有相對(duì)牛逼完善一些,客戶(hù)端主要就是了。 摘要 xmpp是一個(gè)應(yīng)用層協(xié)議,主要做網(wǎng)頁(yè)版即時(shí)通訊,是基于RFC3920和RFC3921實(shí)現(xiàn),服務(wù)端常見(jiàn)的框架有openfire,tigase,prosody等,這三個(gè)都親自踩過(guò)坑,唯有tigase8.0相對(duì)牛逼(完善)一些,客戶(hù)端主要就是st...
摘要:網(wǎng)易云信即時(shí)通訊云服務(wù)的產(chǎn)品優(yōu)勢(shì)網(wǎng)易云信涉足多元行業(yè)提升用戶(hù)體驗(yàn)滿(mǎn)足內(nèi)外協(xié)同今年月,網(wǎng)易云信正式宣布通信與視頻業(yè)務(wù)實(shí)現(xiàn)戰(zhàn)略升級(jí)?! №n寒導(dǎo)演的影片《乘風(fēng)破浪》中,有這樣一個(gè)片段,在六一還堅(jiān)持囤BB機(jī)有前途的時(shí)候,從事電腦編程和軟件開(kāi)發(fā)的小馬則認(rèn)為即時(shí)通訊才是未來(lái)的發(fā)展方向??吹竭@里,很多觀影者都不謀而合地笑了,小馬口中的即時(shí)通訊就是在1999年誕生的OICQ。影片中阿浪說(shuō)的那句話(huà)沒(méi)錯(cuò),這個(gè)世...
閱讀 2232·2021-09-04 16:40
閱讀 1540·2021-08-13 15:07
閱讀 3670·2019-08-30 15:53
閱讀 3269·2019-08-30 13:11
閱讀 1146·2019-08-29 17:22
閱讀 1865·2019-08-29 12:47
閱讀 1540·2019-08-29 11:27
閱讀 2336·2019-08-26 18:42