openfire web client 開發系列(5) -- 簡單的1對1聊天

openfire web client 開發系列(5) -- 簡單的1對1聊天

一、目的:一個簡單一對一聊天的web client。需安裝Pidgin或其他支持XMPP的通訊端軟體,以便驗證。

 

二、準備

1. 開發語言:HTML5 + javascripts

2. 開發環境:(可以使用其他,僅供參考)

Webstorm

3. 程式庫&工具:

jQuery 2.1.0

jQuery Mobile 1.4.2(非必要)

Strophe

4. 通訊伺服器:安裝在Ubuntu14.04上的openfire 3.9.3

 

三、介面說明

傳送方(t002),使用我們開發的範例。

image

接收方(t004),使用Pidgin,安裝在另一台主機上,以便與我們開發的範例進行對話實驗,以確認雙方能接收及傳遞訊息。

image

 

四、程式碼(部分說明已嵌寫在程式碼的註解中,請自行參看。)

(1) 傳送關鍵在使用strophe connection的send方法。

(2) 為讓程式碼簡單易懂,登入者、通訊對象及伺服器位置,都直接寫在程式碼中,在實務上一般是不這樣做的。

(3) 接收訊息的原理,在connection的物件上,加上聆聽事件,過濾我們所要的XMPP stanz標籤及種類屬性。

(4) 實務上應搭配擷取通訊人好友清單功能,方便點選變更通訊對象。

(5) 此範例重點在演示一對一使用者,訊息送出,及回應截收。程式碼並不複雜,改寫一番,亦可修改整合在企業內部網站。

 

index.html

<html>
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="css/jquery.mobile-1.4.2.css">
    <link rel="stylesheet" href="css/jquery.mobile.structure-1.4.2.css">
    <link rel="stylesheet" href="css/jquery.mobile.theme-1.4.2.css">
    <link rel="stylesheet" href="css/jquery.mobile.inline-svg-1.4.2.css">
    <link rel="stylesheet" href="css/jquery.mobile.inline-png-1.4.2.css">
    <link rel="stylesheet" href="css/jquery.mobile.icons-1.4.2.css">
    <link rel="stylesheet" href="css/jquery.mobile.external-png-1.4.2.css">
    <link rel="stylesheet" href="css/index.css">
    <script src="js/jquery-2.1.0.js"></script>
    <script src="js/jquery.mobile-1.4.2.js"></script>
    <script src="js/strophe.js"></script>
    <script src="js/index.js"></script>
    <title>OfTalk</title>
</head>
<body>
<div data-role="page" id="page_main" style="margin-top: 20px">
    <div data-role="header">
        <h1>OFTalk</h1>
    </div>
    <div data-role="content">
        <div id="chat_area"></div>
            <textarea id="chat_input"></textarea>
            <a href="#" id="chat_send_btn" data-role="button" data-inline="true" onclick="btn_chat_send();">傳送</a>
        <div id="message"></div>
    </div>
</div>
</body>
</html>
var SHORT_HOST_NAME = "of3";
var LOGON_USER = "t002";
var LOGON_PWD = "t002";

var my = {
    connection: null,
    connected:false,
    receiver:"t004@of3"
};

$(document).ready(function () {
    connect_server();
});

/*==============================================*/

//連線伺服器

//Connect
function connect_server() {
    var conn = new Strophe.Connection(BOSH_HOST);//使用Strophe的連線方法
    // connect: function (jid, password, callback, wait, hold, route)
    // jid: 登入帳號需含域名以@隔開,
    // password: 登入帳號密碼
    // callback: 回呼函數這裡我們用來處理連線狀態以便確認連線成功與否
    // wait、hold、route 均為非必要參數,詳細作用請翻閱官方說及參閱XEP-124規範
    conn.connect(LOGON_USER+"@"+SHORT_HOST_NAME, LOGON_PWD, function (status) {
        // 判斷連線狀態,開發者依據目前連線狀態,附加動作或聆聽事件
        if(status === Strophe.Status.CONNECTED) {
            //連線成功
            my.connected = true;
            $("#message").append("<p>Connected!!!</p>");
            //連線附掛上訊息聆聽事件,才能接收對方回應
            //只針對 <message /> 類別為 chat 處理
            conn.addHandler(handle_message,null,"message",'chat');
            conn.send($pres());
        }else if(status === Strophe.Status.CONNECTING){
            //連線中,尚未確認成功
            $("#message").append("<p>Connecting!!!</p>");
        }else if(status === Strophe.Status.DISCONNECTED) {
            //斷線
            my.connected = false;
            $("#message").append("<p>Disconnected!!!</p>");
        }else if(status === Strophe.Status.DISCONNECTING) {
            //斷線中
            $("#message").append("<p>Disconnecting!!!</p>");
        }else if(status === Strophe.Status.ERROR){
            //連線錯誤
            $("#message").append("<p>An error has occurred</p>");
        }else if(status === Strophe.Status.CONNFAIL){
            //連線失敗
            $("#message").append("<p>Connection fail!!!</p>");
        }else{
            //其他不在篩選範圍的狀態顯示
            $("#message").append("<p>Status:"+status+"</p>");
        }
    });
    my.connection = conn;
}

//Disconnect
function disconnect_server() {
    my.connection.disconnect();
    my.connected = false;
}

/*==============================================*/

//送出訊息
function btn_chat_send(){
    var input = $("#chat_input").val();
    if(input.length<=0){
        return false;
    }
    if(my.connected === false){
        $("#message").append("<p>伺服器未連線...</p>");
        return false;
    }
    var msg = "$msg({to: '"+my.receiver+"', type: 'chat'}).c('body').t('"+input+"')";
    try{
        var currentdate = new Date();
        my.connection.send(eval(msg));//使用connection的send方法送訊息
        $("#chat_area").prepend("<p>"+currentdate+"("+LOGON_USER+"): "+input+"</p>");
    }catch (e){
        $("#message").append("<p>"+ e.toString()+"</p>");
    }

}

/*==============================================*/

//Handler receiving message
function handle_message(message){
    var from = $(message).attr("from");
    var body = $(message).children("body").text();
    $("#chat_area").prepend("<p>("+from+"): "+body+"</p>");
    //$("#chat-area").prepend("<p>"+body+"</p>");
    return true;
}