日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Web IM 遠程及時聊天通信程序

這篇文章主要介紹用JavaScript和jQuery、HTML、CSS以及用第三方聊天JavaScript(jsjac)框架構(gòu)建一個BS Web的聊天應用程序。此程序可以和所有連接到Openfire服務器的應用進行通信、發(fā)送消息。如果要運行本程序還需要一個聊天服務器Openfire,

創(chuàng)新互聯(lián)是專業(yè)的烏蘭察布網(wǎng)站建設公司,烏蘭察布接單;提供成都網(wǎng)站制作、網(wǎng)站建設、外貿(mào)網(wǎng)站建設,網(wǎng)頁設計,網(wǎng)站設計,建網(wǎng)站,PHP網(wǎng)站建設等專業(yè)做網(wǎng)站服務;采用PHP框架,可快速的進行烏蘭察布網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!

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

JabberHTTPBind是jabber提供的XMPP協(xié)議通信的Http bind發(fā)送的形式,它可以完成WebBrowser和Openfire建立長連接通信。

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

用戶A通過JavaScript jsjac.js庫發(fā)送一條消息到JabberHTTPBind這個Servlet容器,然后JabberHTTPBind的Servlet容器會向Openfire發(fā)送XMPP協(xié)議的XML報文。Openfire Server接收到報文后解析,然后發(fā)送給指定的用戶B。JabberHTTPBind獲取到Openfire Server發(fā)送的數(shù)據(jù)后,解析報文向當前Servlet容器中的鏈接的Session中找到指定的用戶再發(fā)送數(shù)據(jù)給用戶B。

WebBrowser端用的是jsjac和JabberHTTPBind建立的連接,所有數(shù)據(jù)都要經(jīng)過JabberHTTPBind解析/轉(zhuǎn)換發(fā)送給Openfire。

先上張圖看看效果,呵呵~這里是用戶hoojo和girl的聊天畫面,雙方在進行互聊……

可以發(fā)送表情、改變字體樣式(對方界面也可以看到你的字體樣式),同時右側(cè)是顯示/收縮詳情的信息

收縮詳情

聊天界面部分截圖

用戶登錄、注冊,sendTo表示你登錄后向誰發(fā)送聊天消息、并且建立一個聊天窗口

登錄成功后,你可以在日志控制臺看到你的登陸狀態(tài)、或是在firebug控制臺中看到你的連接請求狀態(tài)

登陸失敗

只有connecting,就沒有下文了

登陸成功后,你就可以給指定用戶發(fā)送消息,且設置你想發(fā)送消息的新用戶點擊new Chat按鈕創(chuàng)建新會話

如果你來了新消息,在瀏覽器的標題欄會有新消息提示

如果你當前聊天界面的窗口都是關(guān)閉狀態(tài),那么在右下角會有消息提示的閃動圖標

#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

開發(fā)環(huán)境

System:Windows

JavaEE Server:Tomcat 5.0.28+/Tomcat 6

WebBrowser:IE6+、Firefox3.5+、Chrome 已經(jīng)兼容瀏覽器

JavaSDK:JDK 1.6+

Openfire 3.7.1

IDE:eclipse 3.2、MyEclipse 6.5

開發(fā)依賴庫

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 本地會話窗口發(fā)送消息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

工程目錄結(jié)構(gòu)

#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.      
  23.      
  24.      
  25.      
  26.      
  27.      
  28.      
  29.      
  30.    
  31.     
  32.    
  33.      
  34.      
  35.         userName: 
  36.         password: 
  37.           
  38.         register:  
  39.         sendTo:  
  40.            
  41.      
  42.      
  43.      
  44.            User: 
  45.            sendTo:  
  46.               
  47.             
  48.     
 
  •      
  •     
  •  
  •     
  •  
  •      
  •      
  •          
  •          
  •     
  •  
  •    
  •  
  • 下面這段代碼尤為重要,它是設置你鏈接openfire的地址。這個地址一段錯誤你將無法進行通信!

     
     
     
     
    1.  

    $.WebIM方法是主函數(shù),用它可以覆蓋local.chat中的基本配置,它可以完成聊天窗口的創(chuàng)建。$.WebIM.newWebIM方法是新創(chuàng)建一個窗口,只是消息的接收者是一個新用戶。

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

    remote.jsjac.chat.login(document.userForm);方法是用戶登錄到Openfire服務器

    參數(shù)如下:

     
     
     
     
    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: "", // 發(fā)送者  
    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.             // 設置當前發(fā)送日前  
    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.          * 發(fā)送消息的格式模板                      
    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.         // 工具類按鈕觸發(fā)事件返回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區(qū)域?qū)懴? 
    140.         writeReceiveMessage: function (receiverId, userName, content, flag) {  
    141.             if (content) {  
    142.                 // 發(fā)送消息的樣式  
    143.                 var styleTpl = _opts.sendMessageStyle.getStyleTpl();  
    144.                 var receiveMessageDoc = _opts.receiveMessageDoc(receiverId);  
    145.                 $.each(receiveMessageDoc, function () {  
    146.                     var $body = this.find("body");  
    147.                     // 向接收信息區(qū)域?qū)懭氚l(fā)送的數(shù)據(jù)  
    148.                     $body.append(_opts.receiveMessageTpl(userName, styleTpl, content, flag));  
    149.                     // 滾動條滾到底部  
    150.                     this.scrollTop(this.height());  
    151.                 });  
    152.             }  
    153.         },  
    154.         // 發(fā)送消息  
    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.             // 獲取即將發(fā)送的內(nèi)容  
    162.             if (content) {  
    163.                 var sender = $chatMain.attr("sender");  
    164.                 var receiverId = $chatMain.attr("id");  
    165.                 // 接收區(qū)域?qū)懴? 
    166.                 _opts.writeReceiveMessage(receiverId, sender, content, true);  
    167.                   
    168.                 //############# XXX  
    169.                 var receiver = $chatMain.find("#to").val();  
    170.                 //var receiver = $chatMain.attr("receiver");  
    171.                 // 判斷是否是手機端會話,如果是就發(fā)送純text,否則就發(fā)送html代碼  
    172.                 var flag = _opts.isMobileClient(receiver);  
    173.                 if (flag) {  
    174.                     var text = $(doc.body).text();  
    175.                     text = $.trim(text);  
    176.                     if (text) {  
    177.                         // 遠程發(fā)送消息  
    178.                         remote.jsjac.chat.sendMessage(text, receiver);  
    179.                     }  
    180.                 } else { // 非手機端通信 可以發(fā)送html代碼  
    181.                     var styleTpl = _opts.sendMessageStyle.getStyleTpl();  
    182.                     content = [ "", content, "" ].join("");  
    183.                     remote.jsjac.chat.sendMessage(content, receiver);  
    184.                 }  
    185.                   
    186.                 // 清空發(fā)送區(qū)域  
    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. 網(wǎng)頁題目:Web IM 遠程及時聊天通信程序
      網(wǎng)頁鏈接:http://m.5511xx.com/article/djgiggg.html