/* * 參考《XMPP高級編程+使用JavaScript和jQuery》第三章例子。 * 我修改了做者的XMPP服務器到本地的openfire。JavaScript跨域請求,使用Nginx代理。另外,添加了些備註筆記。 * * 幾個概念 * * 1) BOSH(Bidirectional streams Over Synchronous HTTP,在同步HTTP之上傳送雙向數據流),是一種XMPP的長輪詢橋接技術 * 2) Comet(反向HTTP),同上也是長輪詢一種 * 3) 不少XMPP服務器都內置了對BOSH的支持,這種服務叫作「BOSH鏈接管理器」,一般以URL http://example.com:5280/http-bind或者http://example.com:5280/xmpp-httpbind來提供服務。 * 4) 書上的鏈接管理器的測試URL爲http://bosh.metajack.im:5280/xmpp-httpbind * */ //命名空間對象(存儲應用程序狀態和全局變量) var myNamespace = { some_global: 0, another_global: true, my_adder: function(x, y){ return x+y; } }; // 建立本身的命名空間對象Hello var Hello = { connection: null, start_time: null, // 輸出日誌 log: function(msg){ $('#log').append(""+msg+"編程
"); }, // 定義打招呼用的節內容,並鏈接server。鏈接成功之後調用handler操做。 send_ping: function(to){ var ping = $iq({ to: to, type: "get", id: "ping1" }).c("ping", {xmlns: "urn:xmpp:ping"}); Hello.log("Sending ping to "+to+"."); Hello.start_time = (new Date()).getTime(); Hello.connection.send(ping); }, // 鏈接後的handler方法 handle_pong: function(iq){ var elapsed = (new Date()).getTime() - Hello.start_time; Hello.log("Received pong from server in "+elapsed+"ms"); Hello.connection.disconnect(); return false;//不銷燬 } } // XMPP鏈接經過Strophe.Connection對象管理 $(document).ready(function(){ // 控制出發按鈕,就出現id爲login_dialog的div $('#login_dialog').dialog({ autoopen: true, draggable: false, modal: true, title: 'Connect to XMPP', buttons: { "Connect": function(){ $(document).trigger('connect', {//啓動connect自定義事件,傳入jid和password jid: $('#jid').val(), password: $('#password').val() }); $('#password').val('');// 一旦觸發,密碼口令被清空 $(this).dialog('close'); } } }); // 1) 處理XMPP的connect事件,即建立Strophe.Connection對象並調用connect()方法。 // 2) 提供一個可以相應鏈接狀態變化的回調函數 $(document).bind('connect', function(ev, data){ // var conn = new Strophe.Connection("http://bosh.metajack.im:5280/xmpp-httpbind"); var conn = new Strophe.Connection("http://timelyxyzmacbookpro.local:7070/http-bind/"); conn.connect(data.jid, data.password, function(status){ if(status === Strophe.Status.CONNECTED){ $(document).trigger('connected'); }else if(status === Strophe.Status.DISCONNECTED){ $(document).trigger('disconnected'); } }); Hello.connection = conn; }); $(document).bind('connected', function(){ Hello.log("Connection established.");// 通知用戶 Hello.connection.addHandler(Hello.handle_pong, null, "iq", null, "ping1");// handler在send_ping裏的send完成以後立馬執行,此處只是提早聲明handler var domain = Strophe.getDomainFromJid(Hello.connection.jid); console.log(domain); Hello.send_ping(domain); }); $(document).bind('disconnected', function(){ Hello.log("Connection terminated."); Hello.connection = null;// 釋放已銷燬的connection對象引用 }); });