2014-09-10 86 views
0

我有一個用Strophe編寫的JavaScript XMPP客戶端,它連接到託管在hosted.im上的服務器。我認爲hosted.im在其後端使用ejabberd。Strophe.js客戶端連接到服務器,disconnect/timeout

我建立使用

Strophe.Connection(myBoshService),連接,很能聊天消息發送來回。但是,在一段時間之後,看起來,如果沒有活動,則會自動斷開連接。

現在,我的問題是,保持活動會話的好方法是什麼,以便它不會斷開連接。斷開時間似乎很短,大約60秒左右。

我應該來回發送某種活動以保持其打開嗎?或者,對我來說這似乎更簡單,我應該以某種方式改變會議的時間安排。如果是這樣,我可以在哪裏更改?這是服務器設置,無論Strophe.Connection對象如何,還是可以在初始化Strophe.Connection時設置超時值?

感謝您的幫助。

最好的問候,

克里斯

編輯:這是我使用的連接代碼:

我設法通過一個全局變量你好連接(是的,名字是尷尬的,我把它從一個例子):

var Hello = { 
connection: null, 
start_time: null, 
partner: { 
    jid: null, 
    name: null 
}, 
log: function (msg) { 
    $('#log').append("<p>" + msg + "</p>"); 
}, 

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 + "."); 
    console.log("Sending ping to " + to + "."); 

    Hello.start_time = (new Date()).getTime(); 
    Hello.connection.send(ping); 
}, 

handle_pong: function (iq) { 
    var elapsed = (new Date()).getTime() - Hello.start_time; 
    Hello.log("Received pong from server in " + elapsed + "ms."); 
    console.log('Received pong from server in " + elapsed + "ms.'); 
    $('#login').hide(); 
    $('#chat').show(); 
    //window.location = "chat.html"; 
    //Hello.connection.disconnect(); 

    return true; 
}, 

//"<active xmlns="http://jabber.org/protocol/chatstates"/><body xmlns="http://jabber.org/protocol/httpbind">tuiuyi</body>" 

displayIncomingText: function (text) { 

    var body = $(text).find("xml > body"); 
    if (body.length === 0) 
    { 
     body = $(text).find('body'); 
     if (body.length > 0) 
     { 
      body = body.text(); 
      $('#chattext').append("<p>"+ body + "</p>"); 
     } 
     else 
     { 
      body = null; 
     } 
    } 
    return true; 
}, 

readRoster: function (iq) { 
    $(iq).find('item').each(function() { 
     var jid = $(this).attr('jid'); 
     var name = $(this).attr('name') || jid; 
     Hello.partner.name = name; 
     Hello.partner.jid = jid; 
    }); 
    return true; 
} 

}; 

這裏的主要相關對象是Hello.connect和Hello.partner,它存儲帳戶ro上唯一的人的jid因爲這是一對一的聊天。

然後,在$(文件)。就緒,我結合兩個按鈕連接並分別發送消息:

$(document).ready(function() { 
$('#chat').hide(); 
$('#chatSend').bind('click', function() { 
    Hello.connection.send(
     $msg(
      {to : Hello.partner.jid, type : 'chat'} 
      ).c('body').t($('#chattextinput').val()) 
      ); 
      $('#chattext').append("<p align='right'>" + $('#chattextinput').val() + "</p>"); 
    }); 


$('#SignIn').bind('click', function() { 
$(document).trigger('connect', { 
           jid: $('#eMail').val(), password: $('#password_f').val() 
           } 
        ); 
        }); 

}); 

點擊登錄按鈕觸發事件「連接」:

$(document).bind('connect', function (ev, data) { 
console.log('connect fired'); 
var conn = new Strophe.Connection("http://bosh.metajack.im:5280/xmpp-httpbind"); 
conn.connect(data.jid, data.password, function (status) { 
    console.log('callback being done'); 
    if (status === Strophe.Status.CONNECTED) { 
     alert('connected!'); 
     $(document).trigger('connected'); 
     alert('Connected successfully'); 
    } else if (status === Strophe.Status.DISCONNECTED) { 
     $(document).trigger('disconnected'); 
    } 
    else 
    { 
     Hello.log("error"); 
     console.log('error'); 
    } 
}); 

Hello.connection = conn; 
}); 

這將創建Strophe.Connection並將其存儲在Hello.connection中。此外,它還設置連接對象的回調函數。此代碼直接來自Strophe.js書中的示例。無論如何,回調檢查連接的狀態,如果狀態=== Strophe.Status.DISCONNECTED,觸發「斷開連接」,這不僅會:

$(document).bind('disconnected', function() { 
Hello.log("Connection terminated."); 
console.log('Connection terminated.'); 
// remove dead connection object 
Hello.connection = null; 
}); 

總之,正在發生的事情是,對於一些原因,在與conn.connect設置的回調,短時間後,狀態評估爲Strophe.Status.DISCONNECTED,我不知道爲什麼,除非在服務器或連接對象的某個地方,有一個超時指定似乎是ca. 60秒。

對於來回的節日日誌,我想我需要快速編寫一個處理程序來查看所有傳入節,或者是否可以在ejabberd中查看客戶端和服務器之間的所有節的日誌?

+1

看來奇怪的strophe無法當你斷開時保持了超過60秒..連接,是優雅?你從服務器上得到什麼類型的節?有一些與BOSH空閒超時相關的服務器端設置,但除非Strophe的連接已暫停,否則不應觸發這些設置,否則應保持連接狀態。 – fpsColton 2014-09-10 16:16:23

+1

您能否提供顯示您對Strophe Connection的connect()的調用的代碼,以及在斷開連接期間發送的節的日誌。 – fpsColton 2014-09-10 16:20:08

+0

嗨fpsColton,感謝您的輸入!在上面發佈我的代碼! – hansa 2014-09-10 18:06:26

回答

2

爲了其他遇到此問題並且存在類似問題的人,本例中的解決方案是hosted.im中的服務器每60秒發送一次ping請求以檢查客戶端是否仍處於聯機狀態。

這個ping請求是這樣的:

<iq from="testserver.p1.im" to="[email protected]/23064809721410433741569348" id="164323654" type="get"> <ping xmlns="urn:xmpp:ping"></ping> </iq> 

所需要的,當然,是要形成一個響應,這將是這個樣子:

<iq from="[email protected]" to="testserver.p1.im" id="164323654" type="result" xmlns="jabber:client"><ping xmlns="urn:xmpp:ping"/></iq> 

注意「到」 -屬性。我在開始的時候忽略了它,因爲我在假設下發送的沒有to-attribute的消息被自動假定爲客戶端 - >服務器消息。不過在這種情況下。不確定這是一般的情況,還是在hosted.im中的服務器是否有點怪異。

感謝大家的意見和建議!

最好的問候,

克里斯