當前位置:
首頁 > 知識 > 使用Strophe.js基於xmpp服務實現即時通訊

使用Strophe.js基於xmpp服務實現即時通訊

最近要做一個直播的禮物功能。剛開始打算使用websocket去實現數據的時效性,但是考慮到後期的並發以及pc+h5+app三端的對接,最終選用 ejabberd作為服務,ejabberd是基於Jabber/XMPP協議的即時通訊伺服器,是可擴展性最好的一種Jabber/XMPP伺服器,支持分布多個伺服器,並且具有容錯處理,單台伺服器失效不影響整個cluster運作。

最初,同事給了一個converse.js作為web端的客戶端,但由於對此不熟,加之converse.js的耦合性較高,不容易實現個性化定製(可能是我太菜了。。。)。最終,選擇了Strophe.js作為web端的客戶端,一路艱辛,特此記錄。

html代碼

<!DOCTYPE html>

<html>

<head>

<script src="http://cdn.bootcss.com/jquery/1.9.1/jquery.min.js"></script>

<script src="http://cdn.bootcss.com/strophe.js/1.1.3/strophe.min.js"></script>

<script src="test.js"></script>

</head>

<body>

JID:<input type="text" id="input-jid">

<br>

密碼:<input type="password" id="input-pwd">

<br>

<button id="btn-login">登錄</button>

<div id="msg" stylex="height: 400px; width: 400px; overflow: scroll;"></div>

<br>

消息:

<br>

<textarea id="input-msg" cols="30" rows="4"></textarea>

<br>

<button id="btn-send">發送</button>

</body>

</html>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

js代碼:test.js

// XMPP伺服器BOSH地址

var BOSH_SERVICE = "http://192.168.1.204:5280/http-bind/";

// 房間JID

var ROOM_JID = "fangjainhao@conference.192.168.1.204";

// XMPP連接

var connection = null;

// 當前狀態是否連接

var connected = false;

// 當前登錄的JID

var jid = "";

// 連接狀態改變的事件

function onConnect(status) {

if (status == Strophe.Status.CONNFAIL) {

alert("連接失敗!");

} else if (status == Strophe.Status.AUTHFAIL) {

alert("登錄失敗!");

} else if (status == Strophe.Status.DISCONNECTED) {

alert("連接斷開!");

connected = false;

} else if (status == Strophe.Status.CONNECTED) {

alert("連接成功,可以開始聊天了!");

connected = true;

// 當接收到<message>節,調用onMessage回調函數

connection.addHandler(onMessage, null, "message", null, null, null);

// 首先要發送一個<presence>給伺服器(initial presence)

connection.send($pres().tree());

// 發送<presence>元素,加入房間

var pres = $pres({

from: jid,

to: ROOM_JID + "/" + jid.substring(0,jid.indexOf("@"))

}).c("x",{xmlns: "http://jabber.org/protocol/muc"}).tree();

connection.send(pres);

//connection.sendIQ(pres);//獲取房間列表

}

}

// 接收到<message>

function onMessage(msg) {

console.log(msg);

// 解析出<message>的from、type屬性,以及body子元素

var from = msg.getAttribute("from");

var type = msg.getAttribute("type");

var elems = msg.getElementsByTagName("body");

if (type == "groupchat" && elems.length > 0) {

var body = elems[0];

$("#msg").append(from.substring(from.indexOf("/") + 1) + ":<br>" + Strophe.getText(body) + "<br>")

}

return true;

}

$(document).ready(function() {

// 通過BOSH連接XMPP伺服器

$("#btn-login").click(function() {

if(!connected) {

connection = new Strophe.Connection(BOSH_SERVICE);

connection.connect($("#input-jid").val(), $("#input-pwd").val(), onConnect);

jid = $("#input-jid").val();

}

});

// 發送消息

$("#btn-send").click(function() {

if(connected) {

// 創建一個<message>元素並發送

var msg = $msg({

to: ROOM_JID,

from: jid,

type: "groupchat"

}).c("body", null, $("#input-msg").val());

connection.send(msg.tree());

$("#input-msg").val("");

} else {

alert("請先登錄!");

}

});

});

使用Strophe.js基於xmpp服務實現即時通訊

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

Kubernetes 最佳實踐:正常終止
學生信息管理系統——終極優化

TAG:程序員小新人學習 |