这篇文章主要介绍用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
- <%@ 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方法是主函数,用它可以覆盖local.chat中的基本配置,它可以完成聊天窗口的创建。$.WebIM.newWebIM方法是新创建一个窗口,只是消息的接收者是一个新用户。
- $.WebIM({
 - sender: userName,
 - receiver: receiver
 - });
 - $.WebIM.newWebIM({
 - receiver: receiver
 - });
 
remote.jsjac.chat.login(document.userForm);方法是用户登录到Openfire服务器
参数如下:
- 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: "", // 发送者
 - 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 () {
 - // 设置当前发送日前
 - 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;
 - },
 - /***
 - * 发送消息的格式模板
 - * 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("");
 - },
 - // 工具类按钮触发事件返回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区域写消息
 - writeReceiveMessage: function (receiverId, userName, content, flag) {
 - if (content) {
 - // 发送消息的样式
 - var styleTpl = _opts.sendMessageStyle.getStyleTpl();
 - var receiveMessageDoc = _opts.receiveMessageDoc(receiverId);
 - $.each(receiveMessageDoc, function () {
 - var $body = this.find("body");
 - // 向接收信息区域写入发送的数据
 - $body.append(_opts.receiveMessageTpl(userName, styleTpl, content, flag));
 - // 滚动条滚到底部
 - this.scrollTop(this.height());
 - });
 - }
 - },
 - // 发送消息
 - 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"), "");- // 获取即将发送的内容
 - if (content) {
 - var sender = $chatMain.attr("sender");
 - var receiverId = $chatMain.attr("id");
 - // 接收区域写消息
 - _opts.writeReceiveMessage(receiverId, sender, content, true);
 - //############# XXX
 - var receiver = $chatMain.find("#to").val();
 - //var receiver = $chatMain.attr("receiver");
 - // 判断是否是手机端会话,如果是就发送纯text,否则就发送html代码
 - var flag = _opts.isMobileClient(receiver);
 - if (flag) {
 - var text = $(doc.body).text();
 - text = $.trim(text);
 - if (text) {
 - // 远程发送消息
 - remote.jsjac.chat.sendMessage(text, receiver);
 - }
 - } else { // 非手机端通信 可以发送html代码
 - var styleTpl = _opts.sendMessageStyle.getStyleTpl();
 - content = [ "", content, "" ].join("");
 - remote.jsjac.chat.sendMessage(content, receiver);
 - }
 - // 清空发送区域
 - $(doc).find("body").html("");
 - }
 - },
 - faceImagePath: "images/emotions/",
 - faceElTpl: function (i) {
 - return [
 - "
 ![]()
- this.faceImagePath,
 - (i - 1),
 - "fixed.bmp' gif='",
 - this.faceImagePath,
 - (i - 1),
 - ".gif'/>"
 - ].join("");
 当前文章:Web IM 远程及时聊天通信程序 
当前地址:http://www.wtcwzsj.com/article/djgiggg.html
Copyright © 2009-2022 www.wtcwzsj.com 青羊区广皓图文设计工作室(个体工商户) 版权所有 蜀ICP备19037934号