我有一個用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中查看客戶端和服務器之間的所有節的日誌?
看來奇怪的strophe無法當你斷開時保持了超過60秒..連接,是優雅?你從服務器上得到什麼類型的節?有一些與BOSH空閒超時相關的服務器端設置,但除非Strophe的連接已暫停,否則不應觸發這些設置,否則應保持連接狀態。 – fpsColton 2014-09-10 16:16:23
您能否提供顯示您對Strophe Connection的connect()的調用的代碼,以及在斷開連接期間發送的節的日誌。 – fpsColton 2014-09-10 16:20:08
嗨fpsColton,感謝您的輸入!在上面發佈我的代碼! – hansa 2014-09-10 18:06:26