`
xiaoyu966
  • 浏览: 258211 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Ext 在线实时聊天系统的开发(1)

阅读更多
最近在做毕业设计,是用Ext,ibatis,spring,struts2,和comet来做一个实时的聊天系统,这个应用其实用这个多技术,尤其是Spring和struts2,ibatis,有点大炮打苍蝇的感觉,但是这是实习公司要求的,所以也就这么做了。
刚开始入手这个系统的时候,最大的难点就是关于长连接,也就是服务器推技术的应用,当时感觉无从下手,找了pushlet的example,但是感觉实现起来有点困难。
最终决定采用dwr反转来实现长连接。
现在这个应用还在制作当中,我会定期更新,把主要的代码都放上来,供大家参考!

下面这个是主界面的设计

Ext.onReady(function() {
Ext.QuickTips.init();
Ext.BLANK_IMAGE_URL = 'ext/s.gif';
// ---------------------------------------------好友列表树
var Tree = Ext.tree;
// 定义(可以异步加载)根节点
var root = new Tree.AsyncTreeNode({
id : '0',
text : '目录根节点'
});
// 开始构建树面板
var treePanel = new Tree.TreePanel({
id : 'im-tree',
root : root,
loader : new Tree.TreeLoader({
// 从数据库加载树形结构数据
dataUrl : '/graduationPrj/treePro.action'
}),
deferredRender : false,
region : 'west',
title : '在线用户',
border : false,
rootVisible : false,
lines : false,
autoScroll : true,
enableDD : false,
animate : false,
split : true,
width : 200,
minSize : 175,
maxSize : 400,
collapsible : false,
selModel : new Ext.tree.MultiSelectionModel(),
margins : '0 0 0 5'
});

/**
* @method expandAll
* @private
* @description 展开所有节点
*/
var expandAll = function() {
treePanel.root.expand(true, false);
}

/**
* @method updateUserList
* @private
* @description 定时更新在线用户列表,刷新时间为10分钟
*/
var updateUserList = function() {
treePanel.root.reload();
treePanel.root.expand(true, false);
setTimeout(updateUserList, 1000 * 10);
}

/**
* @method treeDoubleClick
* @private
* @description 添加‘双击事件’处理 当双击节点时,弹出聊天对话框
*/
var treeDoubleClick = function(node, e) {
if (node.isLeaf()) {
addOrOpenTab(node.text);
}
}
treePanel.on('dblclick', treeDoubleClick);


/**
* @method treeDoubleClick
* @private
* @description 判断tab有没有存在,如果不存在添加新tab
*/
var addOrOpenTab = function(nodeText) {
var n = tabs.getComponent(nodeText);
if (!n) {
n = tabs.add({
'id' : nodeText,
'title' : nodeText,
layout : 'border',
closable : true,
items : [new Ext.Panel({
region : 'center',
title : '聊天记录  ',
autoScroll : true,
html : '<div id=' + nodeText + 'div></div>',
tools : [{
id : 'refresh',
qtip : '注意:如果长时间没有收到对方回应,试一下',
// hidden:true,
handler : function(event, toolEl, panel) {
// refresh logic
}
}]
})]
});
}
tabs.setActiveTab(n);
}


// ---------------------------------------------公共聊天室
var logPanel = new Ext.Panel({
region : 'center',
title : '聊天记录  ',
id : 'history_panel',
autoScroll : true,
html : '<div id=publicChat></div>',
tools : [{
id : 'refresh',
qtip : '注意:如果长时间没有收到对方回应,试一下',
// hidden:true,
handler : function(event, toolEl, panel) {
// refresh logic
}
}]
});
/**
* @method treeDoubleClick
* @private
* @description 公用的输入文本框
*/
var chatPanel = new Ext.Panel({
region : 'south',
title : '聊天啦',
layout : 'fit',
// split:true,
autoScroll : true,
height : 250,
// minSize: 200,
// maxSize: 500,
collapsible : true,

margins : '0 0 0 0',
items : {
xtype : 'form',
baseCls : 'x-plain',
autoHeight : true,
autoWidth : true,
bodyStyle : 'padding:10 10px 0;',
defaults : {
anchor : '98%'
},
items : [{
xtype : 'htmleditor',
height : 150,
id : 'htmleditor',
hideLabel : true
}]
},
bbar : [{
text : '发送请输入Ctrl-Enter',
handler : function() {
var t = tabs.getActiveTab().getId();
if (t == 'allChat') {
sendPublicMsg();
} else {
sendPrivateMsg();
}
}
}

, '-', {
text : '清除',
handler : function() {
Ext.getCmp("htmleditor").reset();
}
}]
});

var allChatPanel = new Ext.Panel({
id : 'allChat',
title : '公共聊天室',
layout : 'border',
items : [logPanel]
});

/**
* 构建标签面板,出现在主显示页面,用于显示信息
*/
var tabs = new Ext.TabPanel({
region : 'center',
deferredRender : false,
id : 'tabs',
resizeTabs : true,
minTabWidth : 115,
tabWidth : 135,
height : 100,
autoScroll : true,
enableTabScroll : true,
plugins : new Ext.ux.TabCloseMenu(),
items : [allChatPanel]
});
tabs.setActiveTab(allChatPanel);

var sendPublicMsg = function() {
var content_value = Ext.getCmp("htmleditor").getValue();
var t = tabs.getActiveTab().getId();
if (content_value.trim() == '') {
Ext.Msg.alert("消息提示", "您没有输入消息文本内容!");
Ext.getCmp("htmleditor").focus();
return;
}

var receivers_values = [];
var tree = Ext.getCmp('im-tree');
var receivers = tree.getSelectionModel().getSelectedNodes();
for (i = 0; i < receivers.length; ++i) {

receivers_values.push(receivers[i].attributes.sessionId);

}
if (receivers_values.length == 0) {
Ext.Msg.alert("消息提示", '您没有选择接收者!');
tree.focus();
return;
}
// alert(receivers_values.length);
if (receivers_values.length > 1) {
Ext.Msg.alert("消息提示", '只能选择一个接收者!');
tree.focus();
return;
}
document.getElementById('publicChat').innerHTML = t + '中的aaadasdasdasd';
}

var sendPrivateMsg = function() {
var content_value = Ext.getCmp("htmleditor").getValue();
var t = tabs.getActiveTab().getId();
if (content_value.trim() == '') {
Ext.Msg.alert("消息提示", "您没有输入消息文本内容!");
Ext.getCmp("htmleditor").focus();
return;
}

document.getElementById(t + 'div').innerHTML = t + '中的aaadasdasdasd';
document.getElementById("publicChat").innerHTML = t + '中的aaadasdasdasd';
}

/**
* @method treeDoubleClick
* @private
* @description 主界面,添加各个元素
*/

var viewport = new Ext.Viewport({
layout : 'border',
items : [treePanel, {
region : 'center',
layout : 'border',
autoScroll : true,
items : [tabs, chatPanel]
}

]
});
expandAll();
updateUserList();
});

// -------------------------------------------------------------------
分享到:
评论
12 楼 xiaoyu966 2009-07-30  
deng131 写道
fuwei1688 写道
不是说还有吗?后面的咋还不发呀!!

期待你的详细介绍


http://www.iteye.com/topic/375509#984089

4月份我就把源码公开了,自己去下载看看吧,我注释写的很详细了
11 楼 xiaoyu966 2009-07-30  
lich0079 写道
我写了一个用pushlet写的web IM, pushlet官网上面列子很少,介绍文档也不多,但pushlet本身其实是个很小型的框架,源码就几十个类,而且好像开发人员就一个人
我的那个web IM在我博客上,可以当列子看下,源码都在js,html里面,我都没写java代码的


谢谢呵呵,我4月份就完成了。已经写完了
10 楼 xiaoyu966 2009-07-30  
xiaoyu966 写道
fuwei1688 写道
不是说还有吗?后面的咋还不发呀!!

http://www.iteye.com/topic/375509#984089

好几个月前我就把源码公开了,你自己没看我文章而已。自己去下载

9 楼 xiaoyu966 2009-07-30  
fuwei1688 写道
不是说还有吗?后面的咋还不发呀!!

http://www.iteye.com/topic/375509#984089

好几个月前我就把源码公开了,你自己没看我文章而已。自己去下载
8 楼 lich0079 2009-07-30  
我写了一个用pushlet写的web IM, pushlet官网上面列子很少,介绍文档也不多,但pushlet本身其实是个很小型的框架,源码就几十个类,而且好像开发人员就一个人
我的那个web IM在我博客上,可以当列子看下,源码都在js,html里面,我都没写java代码的
7 楼 deng131 2009-07-30  
fuwei1688 写道
不是说还有吗?后面的咋还不发呀!!

期待你的详细介绍
6 楼 fuwei1688 2009-07-29  
不是说还有吗?后面的咋还不发呀!!
5 楼 lonaluo 2009-07-15  
发一份完整的吧wanglei@skywin.com.cn
4 楼 xiaoyu966 2009-04-27  
presses 写道
最好先搞清楚“实时”的概念。

麻烦你看看上面的回复,而且你没看到上面标一个(1)么?这个我打算慢慢更新的,最近工作很紧张,没时间来写。现在发的只是一个最最基本的原型。下一步我会把dwr反转实现的长连接群聊发上来的
3 楼 presses 2009-04-27  
最好先搞清楚“实时”的概念。
2 楼 xiaoyu966 2009-04-27  
freespace 写道
看了下,没有发现你采用dwr的长联接技术,未发现setActiveReverseAjax函数。如果采用长连接,不需要采用setTimeout进行用户更新,直接从服务器推用户列表到web层就可以了。


这个只是原型搭建,后面的会慢慢加上的,setActiveReverseAjax这个函数我给放到初始化的一个js里面了。最近公司的事情很多,没空闲时间发后续的。
等有时间了我会一步一步把东西都加上
1 楼 freespace 2009-04-26  
看了下,没有发现你采用dwr的长联接技术,未发现setActiveReverseAjax函数。如果采用长连接,不需要采用setTimeout进行用户更新,直接从服务器推用户列表到web层就可以了。

相关推荐

    JSP+EXT超强仿QQ聊天系统 WebQQ

    【JSP+EXT超强仿QQ聊天系统 WebQQ】是一个基于Java技术栈的Web应用程序,旨在模仿QQ聊天系统的功能。这个项目结合了JSP(JavaServer Pages)和EXT库,为用户提供了一个直观、富交互性的界面。JSP是Java平台上的动态...

    基于Tomcat7、Java、Ext、WebSocket的聊天室

    这个项目是基于Tomcat7、Java、Ext和WebSocket构建的一个聊天室,旨在提供一个交互式的在线交流平台。下面将详细阐述这些技术及其在聊天室中的应用。 **Tomcat7**: Tomcat7是Apache软件基金会的Jakarta项目下的一...

    Jabber Messenger(Ext Jame)聊天插件.zip

    Jabber Messenger,又名Ext JS聊天插件,是一款基于Ext JS框架开发的即时通讯解决方案。这个zip文件可能包含了用于构建一个实时通信平台所需的所有组件和资源,特别适合那些希望在网页应用中集成聊天功能的开发者。...

    EXT+JSP教学管理小系统(集成WebQQ)源码整理

    EXT+JSP教学管理小系统是一款基于Java技术开发的教学管理系统,它集成了WebQQ功能,为师生提供了一种便捷的在线沟通方式。该系统的核心知识点包括EXT库的应用、JSP技术、Servlet处理、数据库交互以及WebQQ接口的整合...

    Ext开发视频教程---ppt

    1. 展示了使用Ext开发的OA系统、信息管理系统、地图系统和其他系统的截图。 **十一、学习Ext开发** 1. 学习Ext开发需要掌握的基础知识包括JavaScript面向对象、HTML、DOM、CSS、JSON和Ajax等。 通过这个视频教程,...

    这是一个用Extjs写的前端在线聊天模块,基于DWR实现!

    ExtJS 是一个强大的JavaScript库,专门用于构建富客户端的Web应用程序。它提供了丰富的组件库,包括数据绑定,布局管理,以及...这样的设计结合了现代Web开发的多个关键元素,提供了一个高效、互动的在线聊天解决方案。

    Ext Demo, Ext学习入门

    5. **样式和布局**:使用 CSS 或 ExtJs 内置的样式系统来美化聊天界面,确保信息展示清晰且布局合理。 通过学习和分析这个 ChatRoom 示例,开发者可以深入理解 ExtJs 如何创建动态交互的界面,以及如何与后端框架...

    Ext简介及应用案例 ppt

    除此之外,还有许多基于Ext开发的实际应用,如WebIM系统,它支持在线用户间的即时交流、聊天记录保存和多人会议室等功能。另外,开源人vifir.com的后台管理系统,包括新闻发布、论坛、博客和专业数据库等模块,也...

    ext js 培训资料

    1. **WebIM系统**:基于EXT JS的即时通讯系统,支持在线交流、聊天记录存储、多人会议等功能。 2. **后台管理系统**:如vifir.com,使用EXT JS构建了新闻发布、论坛、博客和专业数据库等多个系统。 3. **蓝源OA系统*...

    一个基于EXT+JSP教学管理小系统(集成WebQQ)源码例子

    【EXT+JSP教学管理小系统】是一种使用EXT框架与JSP技术开发的教学管理系统实例,它结合了WebQQ功能,提供了高效、用户友好的界面,便于教育机构进行课程管理、学生信息管理以及在线交流。EXT是一个强大的JavaScript ...

    基于tomcat8+java7+extjs 的webscoket 聊天室实现

    在这个项目中,“基于Tomcat8+Java7+ExtJS的WebSocket聊天室实现”利用了这些技术来创建一个实时交互的聊天应用。 1. **WebSocket简介** WebSocket为Web应用提供了低延迟、双向通信的能力,使得服务器能够主动向...

    websocket聊天室,学习websocket的好例子。

    描述中的“Tomcat7 Ext4”是指使用Apache Tomcat 7作为应用服务器,并且可能使用了某种扩展(可能是EXT4文件系统或者某个特定的扩展库)来支持WebSocket。Tomcat是一个流行的开源Java Servlet容器,它允许开发者部署...

    webQQ(ext+asp.net)

    这个项目对于初学者来说是一个很好的学习资源,可以让他们了解如何将这些技术整合在一起,实现一个实际的在线聊天应用。 **Ext JS**: Ext JS是一个开源的JavaScript库,用于构建富互联网应用程序(RIA)。它提供了...

    extjs网页聊天 仿qq

    通过以上分析,我们可以看出,"extjs网页聊天 仿qq"项目不仅涵盖了ExtJS前端开发的技能,还涉及到数据库设计和管理、实时通信技术以及用户体验等多个方面。在实践中,开发者需要综合运用这些技术,创建出功能完备、...

    ext 实现的webQQ 源码、应用、含数据库

    1. **EXT组件的使用**:WebQQ应用可能大量使用EXT提供的组件,例如对话框(Dialog)、面板(Panel)、表格(Grid)等,这些组件使得开发者可以快速搭建功能丰富的界面。 2. **数据绑定**:EXT支持双向数据绑定,这...

    Ext SIP Phone 源代码

    在Ext SIP Phone中,getUserMedia用于获取用户的音频和视频输入,RTCPeerConnection则负责建立和维护两端之间的实时通信连接,RTCDataChannel可实现文本聊天功能。 2. **SIP协议的应用**:SIP在Ext SIP Phone中主要...

    Extjs实现的聊天室

    ExtJS是一种基于JavaScript的前端框架,用于构建交互式的、数据驱动的Web应用程序。它提供了丰富的组件库,使得开发者可以方便...在实际开发中,这样的组合可以应用于各种实时协作工具、在线客服系统或多人游戏等场景。

Global site tag (gtag.js) - Google Analytics