Web IM 远程及时聊天通信程序

这篇文章主要介绍用JavaScript和jQuery、HTML、CSS以及用第三方聊天JavaScript(jsjac)框架构建一个BS Web的聊天应用程序。此程序可以和所有连接到Openfire服务器的应用进行通信、发送消息。如果要运行本程序还需要一个聊天服务器Openfire,

创新互联是专业的乌兰察布网站建设公司,乌兰察布接单;提供成都网站制作、网站建设、外贸网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行乌兰察布网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

以及需要用到Http方式和Openfire通信的第三方库(JabberHTTPBind)。

JabberHTTPBind是jabber提供的XMPP协议通信的Http bind发送的形式,它可以完成WebBrowser和Openfire建立长连接通信。

主要通信流程如下图所示:

用户A通过JavaScript jsjac.js库发送一条消息到JabberHTTPBind这个Servlet容器,然后JabberHTTPBind的Servlet容器会向Openfire发送XMPP协议的XML报文。Openfire Server接收到报文后解析,然后发送给指定的用户B。JabberHTTPBind获取到Openfire Server发送的数据后,解析报文向当前Servlet容器中的链接的Session中找到指定的用户再发送数据给用户B。

WebBrowser端用的是jsjac和JabberHTTPBind建立的连接,所有数据都要经过JabberHTTPBind解析/转换发送给Openfire。

先上张图看看效果,呵呵~这里是用户hoojo和girl的聊天画面,双方在进行互聊……

可以发送表情、改变字体样式(对方界面也可以看到你的字体样式),同时右侧是显示/收缩详情的信息

收缩详情

聊天界面部分截图

用户登录、注册,sendTo表示你登录后向谁发送聊天消息、并且建立一个聊天窗口

登录成功后,你可以在日志控制台看到你的登陆状态、或是在firebug控制台中看到你的连接请求状态

登陆失败

只有connecting,就没有下文了

登陆成功后,你就可以给指定用户发送消息,且设置你想发送消息的新用户点击new Chat按钮创建新会话

如果你来了新消息,在浏览器的标题栏会有新消息提示

如果你当前聊天界面的窗口都是关闭状态,那么在右下角会有消息提示的闪动图标

#p#

导读

如果你对openfire还不是很了解或是不知道安装,建议你看看这2篇文章

http://www.cnblogs.com/hoojo/archive/2012/05/17/2506769.html

http://www.cnblogs.com/hoojo/archive/2012/05/13/2498151.html

因为这里还用到了JabberHTTPBind 以及在使用它或是运行示例的时候会遇到些问题,那么你可以看看这篇文章

http://www.cnblogs.com/hoojo/archive/2012/05/17/2506845.html

开发环境

System:Windows

JavaEE Server:Tomcat 5.0.28+/Tomcat 6

WebBrowser:IE6+、Firefox3.5+、Chrome 已经兼容浏览器

JavaSDK:JDK 1.6+

Openfire 3.7.1

IDE:eclipse 3.2、MyEclipse 6.5

开发依赖库

jdk1.4+

serializer.jar

xalan.jar

jhb-1.0.jar

log4j-1.2.16.jar

jhb-1.0.jar 这个就是JabberHTTPBind,我把编译的class打成jar包了

JavaScript lib

jquery.easydrag.js 窗口拖拽JavaScript lib

jquery-1.7.1.min.js jquery lib

jsjac.js 通信核心库

local.chat-2.0.js 本地会话窗口发送消息JavaScript库

remote.jsjac.chat-2.0.js 远程会话消息JavaScript库

send.message.editor-1.0.js 窗口编辑器JavaScript库

一、准备工作

jsjac JavaScript lib下载:https://github.com/sstrigler/JSJaC/

如果你不喜欢用jsjac JavaScript lib和Openfire通信,那么有一款jQuery的plugin可以供你使用,下载地址

jQuery-XMPP-plugin https://github.com/maxpowel/jQuery-XMPP-plugin

这里有所以能支持Openfire通信的第三方库,有兴趣的可以研究下 http://xmpp.org/xmpp-software/libraries/

jquery.easydrag 下载:http://fromvega.com/code/easydrag/jquery.easydrag.js

jquery 下载:http://code.jquery.com/jquery-1.7.1.min.js

JabberHTTPBind jhb.jar 下载:http://download.csdn.net/detail/ibm_hoojo/4489188

images 图片素材:http://download.csdn.net/detail/ibm_hoojo/4489439

工程目录结构

#p#

二、核心代码演示

1、主界面(登陆、消息提示、日志、建立新聊天窗口)代码 index.jsp

 
 
 
 
  1. <%@ page language="java" pageEncoding="UTF-8" %> 
  2. <%  
  3. String path = request.getContextPath();  
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  5. %> 
  6.    
  7.  
  8.  
  9.    
  10.     "> 
  11.       
  12.     WebIM Chat 
  13.      
  14.      
  15.           
  16.      
  17.      
  18.      
  19.      
  20.      
  21.      
  22.         window.contextPath = "<%=path%>";  
  23.         window["serverDomin"] = "192.168.8.22";  
  24.      
  25.      
  26.      
  27.      
  28.      
  29.      
  30.      
  31.      
  32.      
  33.         $(function () {  
  34.               
  35.             $("#login").click(function () {  
  36.                 var userName = $(":text[name='userName']").val();  
  37.                 var receiver = $("*[name='to']").val();  
  38.                 // 建立一个聊天窗口应用,并设置发送者和消息接收者  
  39.                 $.WebIM({  
  40.                     sender: userName,  
  41.                     receiver: receiver  
  42.                 });  
  43.                 // 登陆到openfire服务器  
  44.                  remote.jsjac.chat.login(document.userForm);  
  45.                  $("label").text(userName);  
  46.                  $("form").hide();  
  47.                  $("#newConn").show();  
  48.             });  
  49.               
  50.             $("#logout").click(function () {  
  51.                  // 退出openfire登陆,断开链接  
  52.                  remote.jsjac.chat.logout();  
  53.                  $("form").show();  
  54.                  $("#newConn").hide();  
  55.                  $("#chat").hide(800);  
  56.             });  
  57.               
  58.             $("#newSession").click(function () {  
  59.                 var receiver = $("#sendTo").val();  
  60.                 // 建立一个新聊天窗口,并设置消息接收者(发送给谁?)  
  61.                 $.WebIM.newWebIM({  
  62.                     receiver: receiver  
  63.                 });  
  64.             });  
  65.         });  
  66.      
  67.    
  68.     
  69.    
  70.      
  71.      
  72.         userName: 
  73.         password: 
  74.           
  75.         register:  
  76.         sendTo:  
  77.            
  78.      
  79.      
  80.      
  81.            User: 
  82.            sendTo:  
  83.               
  84.             
  85.     
 
  •      
  •     
  •  
  •     
  •  
  •      
  •      
  •          
  •          
  •      
  •    
  •  
  • 下面这段代码尤为重要,它是设置你链接openfire的地址。这个地址一段错误你将无法进行通信!

     
     
     
     
    1.  
    2.     window.contextPath = "<%=path%>";  
    3.     window["serverDomin"] = "192.168.8.22";  
    4.  

    $.WebIM方法是主函数,用它可以覆盖local.chat中的基本配置,它可以完成聊天窗口的创建。$.WebIM.newWebIM方法是新创建一个窗口,只是消息的接收者是一个新用户。

     
     
     
     
    1. $.WebIM({  
    2.     sender: userName,  
    3.     receiver: receiver  
    4. });  
    5.    
    6. $.WebIM.newWebIM({  
    7.     receiver: receiver  
    8. }); 

    remote.jsjac.chat.login(document.userForm);方法是用户登录到Openfire服务器

    参数如下:

     
     
     
     
    1. httpbase: window.contextPath + "/JHB/", //请求后台http-bind服务器url  
    2. domain: window["serverDomin"], //"192.168.5.231", // 192.168.5.231 当前有效域名  
    3. username: "", // 登录用户名  
    4. pass: "", // 密码  
    5. timerval: 2000, // 设置请求超时  
    6. resource: "WebIM", // 链接资源标识  
    7. register: true // 是否注册 

    remote.jsjac.chat.logout();是退出、断开openfire的链接

    #p#

    2、本地聊天应用核心代码 local.chat-2.0.js

     
     
     
     
    1. /***  
    2.  * jquery local chat  
    3.  * @version v2.0   
    4.  * @createDate -- 2012-5-28  
    5.  * @author hoojo  
    6.  * @email hoojo_@126.com  
    7.  * @blog http://hoojo.cnblogs.com & http://blog.csdn.net/IBM_hoojo  
    8.  * @requires jQuery v1.2.3 or later, send.message.editor-1.0.js  
    9.  * Copyright (c) 2012 M. hoo  
    10.  **/ 
    11.    
    12. ;(function ($) {  
    13.    
    14.     if (/1\.(0|1|2)\.(0|1|2)/.test($.fn.jquery) || /^1.1/.test($.fn.jquery)) {  
    15.         alert('WebIM requires jQuery v1.2.3 or later!  You are using v' + $.fn.jquery);  
    16.         return;  
    17.     }  
    18.       
    19.     var faceTimed, count = 0;  
    20.       
    21.     var _opts = defaultOptions = {  
    22.         version: 2.0,  
    23.         chat: "#chat",  
    24.         chatEl: function () {  
    25.             var $chat = _opts.chat;  
    26.             if ((typeof _opts.chat) == "string") {  
    27.                 $chat = $(_opts.chat);  
    28.             } else if ((typeof _opts.chat) == "object") {  
    29.                 if (!$chat.get(0)) {  
    30.                     $chat = $($chat);  
    31.                 }  
    32.             }   
    33.             return $chat;  
    34.         },  
    35.         sendMessageIFrame: function (receiverId) {  
    36.             return $("iframe[name='sendMessage" + receiverId + "']").get(0).contentWindow;  
    37.         },  
    38.         receiveMessageDoc: function (receiverId) {  
    39.             receiverId = receiverId || "";  
    40.             var docs = [];  
    41.             $.each($("iframe[name^='receiveMessage" + receiverId + "']"), function () {  
    42.                 docs.push($(this.contentWindow.document));  
    43.             });  
    44.             return docs;  
    45.             //return $($("iframe[name^='receiveMessage" + receiverId + "']").get(0).contentWindow.document);  
    46.         },  
    47.         sender: "", // 发送者  
    48.         receiver: "", // 接收者  
    49.         setTitle: function (chatEl) {  
    50.             var receiver = this.getReceiver(chatEl);  
    51.             chatEl.find(".title").html("和" + receiver + "聊天对话中");  
    52.         },  
    53.         getReceiver: function (chatEl) {  
    54.             var receiver = chatEl.attr("receiver");  
    55.             if (~receiver.indexOf("@")) {  
    56.                 receiver = receiver.split("@")[0];  
    57.             }  
    58.             return receiver;  
    59.         },  
    60.           
    61.         // 接收消息iframe样式  
    62.         receiveStyle: [  
    63.             '',  
    64.                 '',  
    65.                 'body{border:0;margin:0;padding:3px;height:98%;cursor:text;background-color:white;font-size:12px;font-family:Courier,serif,monospace;}',  
    66.                 '.msg{margin-left: 1em;}p{margin:0;padding:0;}.me{color: blue;}.you{color:green;}',  
    67.                 '',  
    68.                 '',  
    69.             '' 
    70.         ].join(""),  
    71.         writeReceiveStyle: function (receiverId) {  
    72.             this.receiveMessageDoc(receiverId)[0].get(0).write(this.receiveStyle);  
    73.         },  
    74.           
    75.         datetimeFormat: function (v) {  
    76.             if (~~v < 10) {  
    77.                 return "0" + v;  
    78.             }  
    79.             return v;  
    80.         },  
    81.         getDatetime: function () {  
    82.             // 设置当前发送日前  
    83.             var date = new Date();  
    84.             var datetime = date.getFullYear() + "-" + date.getMonth() + "-" + date.getDate();  
    85.             datetime = " " + _opts.datetimeFormat(date.getHours())   
    86.                         + ":" + _opts.datetimeFormat(date.getMinutes())   
    87.                         + ":" + _opts.datetimeFormat(date.getSeconds());  
    88.             return datetime;  
    89.         },  
    90.           
    91.         /***  
    92.          * 发送消息的格式模板                      
    93.          * flag = true 表示当前user是自己,否则就是对方  
    94.          **/   
    95.         receiveMessageTpl: function (userName, styleTpl, content, flag) {  
    96.             var userCls = flag ? "me" : "you";  
    97.             if (styleTpl && flag) {  
    98.                 content = [ "", content, "" ].join("");  
    99.             }  
    100.             return [  
    101.                 '', _opts.getDatetime(), '  ', userName, ':

      ',  
    102.                 '', content, '

    103.             ].join("");  
    104.         },  
    105.           
    106.         // 工具类按钮触发事件返回html模板  
    107.         sendMessageStyle: {  
    108.              cssStyle: {  
    109.                  bold: "font-weight: bold;",  
    110.                  underline: "text-decoration: underline;",  
    111.                  italic: "font-style: oblique;" 
    112.              },  
    113.              setStyle: function (style, val) {  
    114.                  if (val) {  
    115.                      _opts.sendMessageStyle[style] = val;  
    116.                  } else {  
    117.                      var styleVal = _opts.sendMessageStyle[style];  
    118.                      if (styleVal === undefined || !styleVal) {  
    119.                          _opts.sendMessageStyle[style] = true;  
    120.                      } else {  
    121.                          _opts.sendMessageStyle[style] = false;  
    122.                      }  
    123.                  }  
    124.              },  
    125.              getStyleTpl: function () {  
    126.                  var tpl = "";  
    127.                  $.each(_opts.sendMessageStyle, function (style, item) {  
    128.                      //alert(style + "#" + item + "#" + (typeof item));  
    129.                      if (item === true) {  
    130.                          tpl += _opts.sendMessageStyle.cssStyle[style];  
    131.                      } else if ((typeof item) === "string") {  
    132.                          //alert(style + "-------------" + sendMessageStyle[style]);  
    133.                          tpl += style + ":" + item + ";";  
    134.                      }  
    135.                  });  
    136.                  return tpl;  
    137.              }  
    138.         },  
    139.         // 向接收消息iframe区域写消息  
    140.         writeReceiveMessage: function (receiverId, userName, content, flag) {  
    141.             if (content) {  
    142.                 // 发送消息的样式  
    143.                 var styleTpl = _opts.sendMessageStyle.getStyleTpl();  
    144.                 var receiveMessageDoc = _opts.receiveMessageDoc(receiverId);  
    145.                 $.each(receiveMessageDoc, function () {  
    146.                     var $body = this.find("body");  
    147.                     // 向接收信息区域写入发送的数据  
    148.                     $body.append(_opts.receiveMessageTpl(userName, styleTpl, content, flag));  
    149.                     // 滚动条滚到底部  
    150.                     this.scrollTop(this.height());  
    151.                 });  
    152.             }  
    153.         },  
    154.         // 发送消息  
    155.         sendHandler: function ($chatMain) {  
    156.             var doc = $chatMain.find("iframe[name^='sendMessage']").get(0).contentWindow.document;  
    157.               
    158.             var content = doc.body.innerHTML;  
    159.             content = $.trim(content);  
    160.             content = content.replace(new RegExp("
      ", "gm"), "");  
    161.             // 获取即将发送的内容  
    162.             if (content) {  
    163.                 var sender = $chatMain.attr("sender");  
    164.                 var receiverId = $chatMain.attr("id");  
    165.                 // 接收区域写消息  
    166.                 _opts.writeReceiveMessage(receiverId, sender, content, true);  
    167.                   
    168.                 //############# XXX  
    169.                 var receiver = $chatMain.find("#to").val();  
    170.                 //var receiver = $chatMain.attr("receiver");  
    171.                 // 判断是否是手机端会话,如果是就发送纯text,否则就发送html代码  
    172.                 var flag = _opts.isMobileClient(receiver);  
    173.                 if (flag) {  
    174.                     var text = $(doc.body).text();  
    175.                     text = $.trim(text);  
    176.                     if (text) {  
    177.                         // 远程发送消息  
    178.                         remote.jsjac.chat.sendMessage(text, receiver);  
    179.                     }  
    180.                 } else { // 非手机端通信 可以发送html代码  
    181.                     var styleTpl = _opts.sendMessageStyle.getStyleTpl();  
    182.                     content = [ "", content, "" ].join("");  
    183.                     remote.jsjac.chat.sendMessage(content, receiver);  
    184.                 }  
    185.                   
    186.                 // 清空发送区域  
    187.                 $(doc).find("body").html("");  
    188.             }  
    189.         },   
    190.           
    191.         faceImagePath: "images/emotions/",  
    192.         faceElTpl: function (i) {  
    193.             return [  
    194.                 "
    195.                 this.faceImagePath,  
    196.                 (i - 1),  
    197.                 "fixed.bmp' gif='",  
    198.                 this.faceImagePath,  
    199.                 (i - 1),  
    200.                 ".gif'/>" 
    201.             ].join("");  
    202. 名称栏目:Web IM 远程及时聊天通信程序
      分享路径:http://www.gawzjz.com/qtweb/news3/204953.html

      网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

      广告

      声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联