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
沒有留言:
發佈留言