这篇文章主要介绍用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.gawzjz.com/qtweb/news3/204953.html网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联