新聞中心
這篇文章主要介紹用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
- <%@ page language="java" pageEncoding="UTF-8" %>
- <%
- String path = request.getContextPath();
- String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
- %>
"> WebIM Chat - userName:
- password:
- register:
- sendTo:
- User:
- sendTo:
![]()
![]()
下面這段代碼尤為重要,它是設置你鏈接openfire的地址。這個地址一段錯誤你將無法進行通信!
$.WebIM方法是主函數(shù),用它可以覆蓋local.chat中的基本配置,它可以完成聊天窗口的創(chuàng)建。$.WebIM.newWebIM方法是新創(chuàng)建一個窗口,只是消息的接收者是一個新用戶。
- $.WebIM({
- sender: userName,
- receiver: receiver
- });
- $.WebIM.newWebIM({
- receiver: receiver
- });
remote.jsjac.chat.login(document.userForm);方法是用戶登錄到Openfire服務器
參數(shù)如下:
- httpbase: window.contextPath + "/JHB/", //請求后臺http-bind服務器url
- domain: window["serverDomin"], //"192.168.5.231", // 192.168.5.231 當前有效域名
- username: "", // 登錄用戶名
- pass: "", // 密碼
- timerval: 2000, // 設置請求超時
- resource: "WebIM", // 鏈接資源標識
- register: true // 是否注冊
remote.jsjac.chat.logout();是退出、斷開openfire的鏈接
#p#
2、本地聊天應用核心代碼 local.chat-2.0.js
- /***
- * jquery local chat
- * @version v2.0
- * @createDate -- 2012-5-28
- * @author hoojo
- * @email hoojo_@126.com
- * @blog http://hoojo.cnblogs.com & http://blog.csdn.net/IBM_hoojo
- * @requires jQuery v1.2.3 or later, send.message.editor-1.0.js
- * Copyright (c) 2012 M. hoo
- **/
- ;(function ($) {
- if (/1\.(0|1|2)\.(0|1|2)/.test($.fn.jquery) || /^1.1/.test($.fn.jquery)) {
- alert('WebIM requires jQuery v1.2.3 or later! You are using v' + $.fn.jquery);
- return;
- }
- var faceTimed, count = 0;
- var _opts = defaultOptions = {
- version: 2.0,
- chat: "#chat",
- chatEl: function () {
- var $chat = _opts.chat;
- if ((typeof _opts.chat) == "string") {
- $chat = $(_opts.chat);
- } else if ((typeof _opts.chat) == "object") {
- if (!$chat.get(0)) {
- $chat = $($chat);
- }
- }
- return $chat;
- },
- sendMessageIFrame: function (receiverId) {
- return $("iframe[name='sendMessage" + receiverId + "']").get(0).contentWindow;
- },
- receiveMessageDoc: function (receiverId) {
- receiverId = receiverId || "";
- var docs = [];
- $.each($("iframe[name^='receiveMessage" + receiverId + "']"), function () {
- docs.push($(this.contentWindow.document));
- });
- return docs;
- //return $($("iframe[name^='receiveMessage" + receiverId + "']").get(0).contentWindow.document);
- },
- sender: "", // 發(fā)送者
- receiver: "", // 接收者
- setTitle: function (chatEl) {
- var receiver = this.getReceiver(chatEl);
- chatEl.find(".title").html("和" + receiver + "聊天對話中");
- },
- getReceiver: function (chatEl) {
- var receiver = chatEl.attr("receiver");
- if (~receiver.indexOf("@")) {
- receiver = receiver.split("@")[0];
- }
- return receiver;
- },
- // 接收消息iframe樣式
- receiveStyle: [
- '',
- '',
- '',
- ''
- ].join(""),
- writeReceiveStyle: function (receiverId) {
- this.receiveMessageDoc(receiverId)[0].get(0).write(this.receiveStyle);
- },
- datetimeFormat: function (v) {
- if (~~v < 10) {
- return "0" + v;
- }
- return v;
- },
- getDatetime: function () {
- // 設置當前發(fā)送日前
- var date = new Date();
- var datetime = date.getFullYear() + "-" + date.getMonth() + "-" + date.getDate();
- datetime = " " + _opts.datetimeFormat(date.getHours())
- + ":" + _opts.datetimeFormat(date.getMinutes())
- + ":" + _opts.datetimeFormat(date.getSeconds());
- return datetime;
- },
- /***
- * 發(fā)送消息的格式模板
- * flag = true 表示當前user是自己,否則就是對方
- **/
- receiveMessageTpl: function (userName, styleTpl, content, flag) {
- var userCls = flag ? "me" : "you";
- if (styleTpl && flag) {
- content = [ "", content, "" ].join("");
- }
- return [
- '
', _opts.getDatetime(), ' ', userName, ':
',- '
', content, '
'- ].join("");
- },
- // 工具類按鈕觸發(fā)事件返回html模板
- sendMessageStyle: {
- cssStyle: {
- bold: "font-weight: bold;",
- underline: "text-decoration: underline;",
- italic: "font-style: oblique;"
- },
- setStyle: function (style, val) {
- if (val) {
- _opts.sendMessageStyle[style] = val;
- } else {
- var styleVal = _opts.sendMessageStyle[style];
- if (styleVal === undefined || !styleVal) {
- _opts.sendMessageStyle[style] = true;
- } else {
- _opts.sendMessageStyle[style] = false;
- }
- }
- },
- getStyleTpl: function () {
- var tpl = "";
- $.each(_opts.sendMessageStyle, function (style, item) {
- //alert(style + "#" + item + "#" + (typeof item));
- if (item === true) {
- tpl += _opts.sendMessageStyle.cssStyle[style];
- } else if ((typeof item) === "string") {
- //alert(style + "-------------" + sendMessageStyle[style]);
- tpl += style + ":" + item + ";";
- }
- });
- return tpl;
- }
- },
- // 向接收消息iframe區(qū)域?qū)懴?
- writeReceiveMessage: function (receiverId, userName, content, flag) {
- if (content) {
- // 發(fā)送消息的樣式
- var styleTpl = _opts.sendMessageStyle.getStyleTpl();
- var receiveMessageDoc = _opts.receiveMessageDoc(receiverId);
- $.each(receiveMessageDoc, function () {
- var $body = this.find("body");
- // 向接收信息區(qū)域?qū)懭氚l(fā)送的數(shù)據(jù)
- $body.append(_opts.receiveMessageTpl(userName, styleTpl, content, flag));
- // 滾動條滾到底部
- this.scrollTop(this.height());
- });
- }
- },
- // 發(fā)送消息
- sendHandler: function ($chatMain) {
- var doc = $chatMain.find("iframe[name^='sendMessage']").get(0).contentWindow.document;
- var content = doc.body.innerHTML;
- content = $.trim(content);
- content = content.replace(new RegExp("
", "gm"), "");- // 獲取即將發(fā)送的內(nèi)容
- if (content) {
- var sender = $chatMain.attr("sender");
- var receiverId = $chatMain.attr("id");
- // 接收區(qū)域?qū)懴?
- _opts.writeReceiveMessage(receiverId, sender, content, true);
- //############# XXX
- var receiver = $chatMain.find("#to").val();
- //var receiver = $chatMain.attr("receiver");
- // 判斷是否是手機端會話,如果是就發(fā)送純text,否則就發(fā)送html代碼
- var flag = _opts.isMobileClient(receiver);
- if (flag) {
- var text = $(doc.body).text();
- text = $.trim(text);
- if (text) {
- // 遠程發(fā)送消息
- remote.jsjac.chat.sendMessage(text, receiver);
- }
- } else { // 非手機端通信 可以發(fā)送html代碼
- var styleTpl = _opts.sendMessageStyle.getStyleTpl();
- content = [ "", content, "" ].join("");
- remote.jsjac.chat.sendMessage(content, receiver);
- }
- // 清空發(fā)送區(qū)域
- $(doc).find("body").html("");
- }
- },
- faceImagePath: "images/emotions/",
- faceElTpl: function (i) {
- return [
- "
![]()
- this.faceImagePath,
- (i - 1),
- "fixed.bmp' gif='",
- this.faceImagePath,
- (i - 1),
- ".gif'/>"
- ].join("");
網(wǎng)頁題目:Web IM 遠程及時聊天通信程序
網(wǎng)頁鏈接:http://m.5511xx.com/article/djgiggg.html


咨詢
建站咨詢
