聊天应用程序
PUBLISHED
概述
本文演示了如何使用开源的JavaScript库strophe创建基于XMPP的聊天应用程序。 strophe库的详细内容请见 Strophe.js文档.
本文主题包括:聊天应用程序和服务器之间的验证,获取联系人列表,打开一个聊天窗口,添加联系人和发送信息给联系人等。 本文所有的内容均来自开源库 Conversejs
Jabber聊天应用程序简介
XMPP(Extensible Messaging and Presence Protocol)是由Jabber开源社区推出的,并作为即时消息的通信协议。 如今,大多数的聊天应用程序,如Gmail,Facebook等,均遵循此协议。
Jabber的登录页面
在登录页面中,用户必须输入Jabber证书才能登录。 用户可以在 jabber site注册自己的账户。
HTML登陆页面
HTML方式登陆服务器的代码如下所示。
<div data-role="page"> <div data-role="header" data-position="fixed"> <h1>Sign In</h1> </div> <div data-role="content"> </br>XMPP/Jabber Username: <input type="text" data-clear-btn="true" id="username" value="" class="ui-input-text ui-body-c"> </br> Password: <input type="password" data-clear-btn="true" id="pwd" value="" class="ui-input-text ui-body-c"></br> <a data-role="button" data-mini="true" data-inline="true" id="login">Log In</a></br> </div> <div data-role="footer" data-position="fixed"> <div id="status"></div> </div> </div>
Javascript进行登录的代码
下面的代码用于使用strophe API 认证连接服务器。 用户一旦连接上一台服务器,所有的认证
工作均有strophe库来处理。 它返回的帐户联系名片,连同他们的状态,如下面的截图。
connection = new Strophe.Connection(service_url); connection.connect(jid, password, $.proxy(function (status, message) { console.log( "Status:"+ status + "Message:"+ message ); }
联系人列表
一旦用户成功连接到服务器,认证通过后,strophe库便会请求详细的联系人列表。 应用程序必须注册一个回调来获取联系人列表。
下面是更新网页上的联系人的代码:
connection.roster.registerCallback( $.proxy(rosterHandler ), null, 'presence', null); function rosterHandler (items) { this.items = items ; if( pageSHown == false){ pageSHown =true ; $.mobile.changePage("#page2"); $('#page2').add(display_contacts()); function display_contacts(){ $('contactsList').remove(); var str='<ul data-role="listview" id="contactsList">'; for(var i =0; i < items.length ;i++ ) { str+='<li id="CList"><i><a href="#chat_page">'+items[i].jid+'</a></i></li>'; } str+='</ul>'; $('#contacts').append(str).trigger("create").listview( ); $(document).on("click","ul#contactsList > li", function(){ index = $(this).index() ; var contact=$(this).text(); $('#chat_page').add(chatting(contact)); }); } } }
更新状态
更新用户状态时,可选的状态有:在线,离线,忙碌,离开。 如果用户更改他们的存在状态,这种状态会
更新到服务器上,并将状态反馈到联系人的聊天程序上。
选择一种存在状态的HTML代码如下。
<div data-role="header" data-position="fixed"> <h4>Contacts</h4> <div style="float: right;"> <select data-mini="true" data-inline="true" data-corners="false"> <option> Online </option> <option>Busy</option> <option>Away</option> <option>Offline</option> </select> </div> </div>
用于更新状态的JavaScript代码如下
使用Strophe方法 $pres . 并使用连接服务器的方法发送存在状态信息 send.
function updatePresence(status_message) { var presence = $pres(); presence.c('status').t(status_message); connection.send(presence); }
添加联系人
用户可以添加任何Jabber用户到联系人列表中。 添加联系人时,添加通知将被发送到收件人。 在收件人确认接触之前,添加操作会一直处于挂起状态。
添加联系人的HTML代码
在联系人列表中添加联系人的HTML代码如下所示。
<input type="text" placeholder="Type JID to search" /> <a data-role="button" data-mini="true" data-inline="true" id="addContact" style="float:right;top:-46px;">Add Contact</a>
添加联系人的JavaScript代码如下
绑定”添加“按钮click事件的Javascrip代码如下所示。 一旦用户输入一些联系人的电子邮件ID并点击添加按钮。 便使用 roster.add 和 roster.subscribe 将联系人卡片详细信息发送到服务器。
$("#addContact").click(function(){ connection.roster.add(jid, jid, [], function (iq) { connection.roster.subscribe(jid, null, converse.xmppstatus.get('fullname')); }); });
发送聊天消息
用于发送聊天信息的HTML代码
以下是聊天消息的新页面。 一旦用户点击任何一个连接,将会打开一个页面,在该页面上用户可以发送聊天信息。 并在页脚中添加一个文本输入框和按钮,如下面的屏幕截图。
<div data-role="page" data-add-back-btn="header" id="chat_page"> <div data-role="header" data-position="fixed"> <div id="chat_heading"></div> </div> <div data-role="content"> <div id="chat_content"> </div> </div> <div data-role="footer" data-position="fixed" id="footer"> <input type="text" id="text" class="ui-input-text ui-body-c" size="25" /> <div id="send">send</div> </div> </div>
用于发送聊天信息的Javascript代码如下
绑定”发送“按钮click事件的Javascript代码如下所示。 一旦用户输入了一些信息,点击发送按钮。 该消息便被添加到聊天页面,并且输入区域被清空。
$("#send").click(function(){ var text_message = $('#text').val() ; $('#text').val(""); var string= "<p> Me: " + text_message + "</p>" ; $("#chat_content").append( string) ; sendMessages( text_message ); });
使用的strophe连接管理器发送消息的代码如下所示。
function sendMessages( text_message) { if( text_message.length > 0) { var contact_jid = this.items[index].jid ; var timestamp = new Date().getTime(); var to_jid = Strophe.getBareJidFromJid(contact_jid); var message = $msg({from: bare_jid, to: to_jid, type: 'chat', id: timestamp}).c('body').t(text_message).up().c('active', {'xmlns': 'http://jabber.org/protocol/chatstates'}); var forwarded = $msg({to:bare_jid, type:'chat', id:timestamp}).c('forwarded', {xmlns:'urn:xmpp:forward:0'}) .c('delay', {xmns:'urn:xmpp:delay',stamp:timestamp}).up().cnode(message.tree()); connection.send(message); connection.send(forwarded); } }
屏幕截图
以下是聊天应用程序的屏幕截图。