XMPP~實作小敢想XD



由於某些原因有開始摸xmpp

然後覺得facebook的反應實在太快了

快到靠杯........

幾乎是一摸懶叫就噴的境界

對於有兩個fb帳號的我

我用雙螢幕

兩邊都開facebook不一樣帳號

我只要貼一張圖

別邊在動態馬上就噴出東西


我猜背後的原理就是用xmpp

整個facebook網頁都是用xmpp作溝通

(所以facebook點任何連結 會發現他都沒刷新整個網頁 因為刷新網頁xmpp要再連線一次BOSH)


而不是ajax

我猜der...........囧

不管是通知 或有人回應 有人按讚 動態的刷新等等

全部都是real-time的

因為xmpp就是一個即時的東西

所以我猜應該是一樣的技術@_@


然後我有實作了網頁端(strophe.js) 跟server端(php) 跟xmpp server的溝通

PHP是用XMPPHP

範例大概長這樣..........我貼這些大概可以幫要做這東西的人省了大半google的時間 囧rz....

$conn = new XMPPHP_XMPP('www.ggyy.tw', 5222, 'admin', '7788', 'ggyy.tw', 'ggyy.tw', $printlog=false, $loglevel=XMPPHP_Log::LEVEL_INFO);
try {
    $conn->connect();
    $conn->processUntil('session_start');
    $conn->presence();
    $conn->message2('admin@ggyy.tw', 'This is a test 11111111!');
    // $conn->message('admin@ggyy.tw', 'This is a test 222222222222!');
    $conn->disconnect();
} catch(XMPPHP_Exception $e) {
    die($e->getMessage());
}

其中 message2是我自己看source code 加上去的程式

因為我要傳送自訂的xml格式

關於自訂xml傳送的內容 我是去google找文章

我原本以為要去動xmpp server就是ejabberd

但其實這個問題跟xmpp server無關 他只負責傳送

而他傳送的是xml格式

本身就可以隨意自動xml的內容 沒有任何限制

所以隨便亂傳都可以

只要對方的client端 也看得懂 並且有座處理自己設定好的xml內容

像facebook我可能假設他會傳這樣的xml格式

這邊是通知區塊.......通知1, 通知2, 通知3
這邊是動態區塊.......大便1, 大便2, 大便3
這邊是按讚區塊.......尿尿1的post_id, 數量, by who
這邊是回應區塊.......狗屎3的post_id, by who, 內文

這些東西通通組成一個xml

回傳到client 端 就是我們的網頁或手機或任何裝置作處理

像網頁的話可能就是javascript對這收到的xml文件作parse  然後一個一個去做動作

如果遇到按讚區塊

他就觸發事件說在左下方顯示popup說誰誰誰按讚了


然後javascript端我是用strophe.js

這個它的範例已經提供的不錯完整了說

不過我還是貼個我覺得很關鍵的code

因為我也是弄了好久才射出來0rz


var message = 'ffqqfqfqf';
var reply = $msg({
to: 'admin@ggyy.tw',
type: 'chat'
}).cnode(Strophe.xmlElement('body', message)).up().cnode(Strophe.xmlElement('zxc', message)).up().cnode(Strophe.xmlElement('qweqwe', message))

connection.send(reply.tree());



cnode那邊是關鍵

就是建好一個xml文件 要再呼叫一次up再給他塞一個xml進去

才會組成同level的文件

不然會變成body底下有個zxc黏著body的文字~ zcc裡面的文字又年個qweqwe的tag

因為當我想對xml內容下手的時候


我試一直找Strophe底下的function並測試

而不是$msg的function.....0rz



至於xmpp的原理

據我使用strophe.js配firebug的console

我覺得他是一個對server定時呼叫request 的東西

發出的時候server不會馬上鳥你

但他會知道這個連線是誰

我看strophe.js都是1分鐘後

沒東西就回傳一個很無聊的東西

<body xmlns='http://jabber.org/protocol/httpbind'/>

然後馬上又做一次request

再繼續等待server回應

如果這過程server有任何需要回傳給他的 例如有人發訊息


就馬上回傳xml回去

這時client就會很及時的得到feedback

然後做動作 在馬上發request給server 繼續等待server回應

是用這種方式做到real-time

我猜der....囧

因為我也沒研究這東西

就開始實作了0rz

沒有留言: