分享

基于openfire和xmpp协议的Webim客户端设计与实现

 WindySky 2017-10-26 发布于广东
    摘要:WebIM,是基于HTTP协议,系统采用B/S结构进行开发,客户端以网页的形式实现与openfire服务器及其它客户端的及时通信。这种B/S结构的系统功能在服务器端统一管理与维护,既降低了维护难度,也使系统部署费用得到减少。因此,Web IM技术将在基于即时通信及Web的远程监控、网站客服等方面有重大的意义。为解决现有WebIM系统客户端“拉”(Client_pull)模式周期请求而产生的系统消息延迟,以及客户端和服务器端通信量大的问题,提出了利用服务器“推”(Server-push)模式技术作为基础的WebIM系统,并选择openfire开源服务器及支持XMPP作为服务器和客户端的通信协议。并给出了实现HTTP长连接的策略。并开发实现了WebIM系统,采用服务器推送方式使用户在体验方面得到改进,Web用户将不会感觉到消息的延迟。
中国论文网 http://www./8/view-5662214.htm
  关键词:IM;WebIM;通信;网络
  中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2014)09-1971-05
  传统的基于WebIM的引擎设计方式大多使Ajax无刷新交互技术实现,设计一种时间间隔定期获取数据。它是一种基于客户端不断向服务器发出请求,以实现与服务器保持同步。 但从基于这技术的产品实际效果来看,客户与客户之间的数据信息延迟有时会很大,不是很稳定。同时,大量的同步请求数据使得服务器和客户端之间的通信量增大,使网络的性能下降,服务器负载过重。该文通过对现有WebIM进行了研究,分析了XMPP技术,提出了以支持XMPP的openfire服务器推送技术来代替传统客户周期性的请求保持同步,致使客户数据更新的基于B/S结构的WebIM系统,并通过佛山一呼百应移动电子商务平台项目的WebIm系统验证了该方案的可行性,有效性。原型系统也可以扩展到类似系统中。
  本文设计与实现的Webim系统是以openfire为服务器,以xmpp技术更新数据。客户端通过浏览器登录服务器后,即时更新用户UI数据。Openfire服务器通过xmpp技术得到新的数据后,即时向客户端推送。发送完后,客户端浏器与openfire继续保持连接,等待下一次数据的更新。xmpp技术采用长连接及服务器的推送方式,减少了客户端的请求,同时也减少了openfire服务器的响应时间,也节省了网络带宽,改善了服务器也与客户端的传输性能,从而延迟得到减少,用户的体验会更好。
  1 传统的WebIM存在的问题
  1.1延迟
  现有许多WebIM系统为了增强用户体验,使用AJAX技术进行异步通信,WebIM客户端游览器按照设定的时间间隔定时向服务器刷新数据。当客户端与客户端交换信息时,发送端先把数据发送到服务器存储,然后当接收端向服务器端请求数据时,才能获取新的数据。在这个过程中客户端通信延迟的最小时间间隔将是AJAX异步请求。但在实际的应用中,客户端消息的延迟将大于这个时间间隔,因为服务器端需要处理数据库事务以及实例化AJAX客户端的对象。所以现有WebIM系统中,普遍存在消息延迟的情况。
  1.2 通信量大,通信性能差
  WebIM客户端为了与服务器保持同步,需周期性向服务器发送信息,为了减少传送信息的延迟,必须将周期访问时间设置很小,这将对服务器产生压力,因为这些“心跳”信息只是使服务器与客户端维持同步,使用户和用户维持在线状态,相当一些控制,而不是实际有效信息。过多的这些数据增加了服务器的负载,增大延迟。另外如果客户之间的消息更新的频率很慢时,服务器需要额外去响应客户端的心跳信息,并还需返回类似于false的数据给客户端,这样就为服务器端带来了负载上的压力,也增大延迟。
  2 xmpp技术带来的改变
  xmpp通过建立一个和Openfire服务器的长连接,当openfire服务器获取了新的数据时,通过该长连接即时向客户端进行推送,客户端从长连接管道中得到了数据的更新。使用xmpp技术所建立的长连接机制,能很好地解决了二个问题,第一,即时推送,消息即时,无延迟。第二,长连接机制,减少了建立与关闭连接数,在整个通信过程中,长连接一直维持,直至客户端主动退出系统,从而减少了通信量,改善了能信性能。
  HTTP长连接策略:
  openfire服务器支持xmpp技术采用推送。当服务器端的信息有变化时,主动推送,而不需要客户端请求。推送技术主要有以下两种: (1)HTTP流方式(2)长轮询方式
  在HTTP1.1规范中规定,客户端与服务器端的HTTP的连接不能超过两个,如果超过二个的连接,将会被阻塞丢掉。所以在每个WebIM客户端和服务器之间只建立一个HTTP的长连接,也符合HTTP规范要求,也改善了网络的性能。长连接管道中XMPP消息按优先级排列:聊天消息:联系人的消息:公告消息,来进行发送。在openfire中与客户的连接中最核心的Servlet技术是Connection_Servlet,它实现HttpServlet接口类,private的成员变量中保留了Continuation类的对象,使浏览器客户端和openfire服务器端的HTTP长连接得到维持。
  3 客户端设计与实现
  3.1 通信协议
  WebIM系统设计使用XMPP(exten-siblemessagingandpresenceprotocol,可扩展消息处理在线协议)协议,它是基于可扩展标记语言 (XML)的协议,用于即时信息(IM)以及实时在线探测。XML流通过在TCP/IP链路上完成服务器端和客户端的传输通信,所有通信开始以流结点开始,通信结束以流作为结束。web客户端通过解析XML来获取传输的信息内容。
  图1 XMPP工作原理,所有从一个client到另一个client的jabber消息和数据都要通过xmpp server。   1)client连接到server
  2)server利用本地目录系统的证书对其认证
  3)client制定目标地址让server告知目标状态
  4)server查找连接并进行相互认证
  5)client间进行交互
  3.2 web客户端与openfire通信线程的设计
  web客户端与openfire通信线程设计分三个过程,第一个过程是登录,接着第二个过程是正常即时通信,第三个过程,退出系统。登录与退出启用相同的线程,由webim的发起。正常通信,由openfire发起。当客户端首次登录时,启用一个客户端请求线程,用来从openfire获取用户好友列表信息和用户个人信息及用户状态信息来更新当前用户的信息。当通信结束客户退出系统,该线程立即被激活,通过发送XMPP的XML数据流,类似于truetrue等信息用来描述用户下线状态或离线状态信息给openfire,openfire通过长连接进行推送该用户的列表用户。好友的客户端得到更新,同时客户端和服务器端所建立的HTTP长连接的进行释放,流程如图2所示。
  当客户端登录成功后,WebIM端将启动一个HTTP的长连接来监听服务器端更新的数据,服务器将是将变化的数据以基于xmpp的XML流方式通过长连接通道传输客户端浏览器,客户端UI界面及交换的数据信息得到更新。具体流程如图3所示。
  3.3 客户端的实现
  本系统客户端的实现使用xmpp的Http和Openfire通信的JabberHTTPBind。JabberHTTPBind是jabber提供的XMPP协议通信的Http bind发送的形式,它可以完成WebBrowser和Openfire建立长连接通信。Web客户端用户ClientA通过jsjac.js核心通信模块库发送一条消息到JabberHTTPBind,然后JabberHTTPBind会向Openfire发送XMPP协议的XML的信息。Openfire服务器接收到xml流后进行解析,然后发送给指定的ClientB。用户。JabberHTTPBind获取到Openfire 服务器发送的数据后,解析报文向当前Servlet容器中的链接的Session中找到指定的用户再发送数据给ClientB,如图4所示。WebBrowser端用的是jsjac和JabberHTTPBind建立的连接,所有数据都要经过JabberHTTPBind解析/转换发送给Openfire服务器。
  
  图4 web客户端与openfire服务器的通信方式
  Web客户端的详细实现:
  1)客户端UI,包括聊天窗口,登陆、消息、日志等
  与openfire服务器连接地址设置,window["serverDomin"]指定其中一个openfire服务器的地址,否则客户端无法通讯。
  
  建立一个聊天窗口应用,并设置发送者和消息接收者,登陆到openfire服务器。退出openfire登陆,断开链接。建立一个新聊天窗口,并设置消息接收者的实现。
  
  
  $WebIM()方法是主函数,它可以完成聊天窗口的创建。$.WebIM.newWebIM方法是新创建一个新用户一个窗口,这个窗口代表了一个新的用户。
  
  2)本地聊天应用核心代码
  包括发送消息; 获取即将发送的内容;接收区域写消息; 判断是否是移动端会话信息;如果是就发送纯文本信息,否则就发送其他代码; 远程发送消息; 非移动端通信 可以发送html代码; 清空发送区域。
  
  3)远程聊天JavaScript核心代码,与jsjac库关联的
  构建jsjac的message对象
  
  安装(注册)Connection事件模型
  
  向chat接收信息区域写消息
  
  建立连接触发事件的方法
  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多