- 浏览: 157784 次
- 来自: 上海
文章分类
最新评论
-
wahahachuang5:
web实时推送技术使用越来越广泛,但是自己开发又太麻烦了,我觉 ...
使用 HTML5 WebSocket 构建实时 Web 应用 -
wb1991wb:
zjarcher 写道你这种方法,Dog是否还是Animate ...
JS继承机制的实现 -
zjarcher:
你这种方法,Dog是否还是Animate?如何判断?
JS继承机制的实现 -
liuxin0577:
rest已经写好了,用正常的项目也可以访问到返回值,但是放到这 ...
【叨、校长】PhoneGap+jQuery Mobile+Rest 访问远程数据 -
urboat29:
怎么没了下不了,求发邮箱1419335455@qq.com
【叨、校长】TetrisGrid:基于ExtJs Grid实现的一个俄罗斯方块
本实例基于pushlet官方实例。通俗易懂、老少皆宜! --叨、校长
下面给出核心代码、代码都有注释、希望可以给大家带来帮助!
Pushlet原理:
Pushlet基于HTTP流,这种技术常常用在多媒体视频、通讯应用中,比如QuickTime。与装载HTTP页面之后马上关闭HTTP连接的做法相反,Pushlet采用HTTP流方式将新变动的数据主动地推送到client(客户端),再此期间HTTP连接一直保持打开
客户端代码:
function initChatRoom(themes){ var SUB_LOGIN="/Chat/Login"; //登录 var SUB_MESSAGE="/Chat/Message"; //发送消息 var SUB_LEAVE="/Chat/Leave"; //离开 // 表情数组 var array=[ ["am","aq","aw","ax","biz","bs","bz","cd","cf"], ["db","dk","dy","fad","fd","fw","hh","hq","hx"], ["je","jk","jy","ka","kf","kkl","kl","kq","kt"], ["ku","lh","ll","lq","luo","mr","ng","no","ok"], ["ot","pp","pq","ps","qd","qi","qq","qt","tw"] ] var win=initLoginWin(); win.show(); Ext.getCmp("user_name_txtfield").focus(); /** * 登录界面 * @return {} */ function initLoginWin(){ var win=new Ext.Window({ title:"请登录...", width:204, height:120, layout:"form", labelWidth:40, labelAlign:"right", defaultType:"textfield", items:[{ fieldLabel:"昵称", id:"user_name_txtfield", listeners:{ specialkey : function(field, e) { if (e.getKey() == Ext.EventObject.ENTER) { var user=win.getComponent(0).getValue(); var user_name=encodeURIComponent(encodeURIComponent(user)); if(user_name.length!=0){ win.close(); var chat=createChatRoom(user); chat.show(); var msg_panel=chat.getComponent(0); var tree=chat.getComponent(2); initPushLet(user_name,msg_panel,tree); }else{ Ext.Msg.alert("提示","请输入用户名..."); return } } } } },{ fieldLabel:"口令" }], buttonAlgin:"right", buttons:[{ text:"登录", handler:function(){ var user=win.getComponent(0).getValue(); var user_name=encodeURIComponent(encodeURIComponent(user)); if(user_name.length!=0){ win.close(); var chat=createChatRoom(user); chat.show(); var msg_panel=chat.getComponent(0); var tree=chat.getComponent(2); initPushLet(user_name,msg_panel,tree); }else{ Ext.Msg.alert("提示","请输入用户名..."); return } } },{ text:"取消", handler:function(){ win.close(); } }] }) return win; } /** * 聊天面板 * @param {} user_name 用户名 * @return {} */ function createChatRoom(user_name){ var msgPanel=createCenterPanel(); var onlinePanel=createEastPanel(); var inputPanel=createSouthPanel(); var win=new Ext.Window({ title:"校长聊天室", width:592, height:511, layout:"border", tools:[{ id:"minimize", handler:function(){ win.setPagePosition(0,document.body.clientHeight-26); win.setSize(160,0); win.getTool("restore").setVisible(true); win.getTool("minimize").setVisible(false); } },{ id:"maximize", handler:function(){ // var w=document.body.clientWidth-40; // var h=document.body.clientHeight-40; // win.maximize(); win.setPagePosition(5,5); win.setSize(document.body.clientWidth-10,document.body.clientHeight-10); win.getTool("restore").setVisible(true); win.getTool("minimize").setVisible(true); win.getTool("maximize").setVisible(false); } },{ id:"restore", hidden:true, handler:function(){ //win.restore(); win.setPagePosition((document.body.clientWidth-592)/2,(document.body.clientHeight-511)/2); win.setSize(592,511); win.getTool("restore").setVisible(false); win.getTool("maximize").setVisible(true); win.getTool("minimize").setVisible(true); } },{ id:"down", handler:function(e){ var menu = new Ext.menu.Menu([{ text:"火红烈焰", iconCls:"theme_red", handler:function(){ document.getElementsByTagName("link")[1].href="ext3.2/resources/css/"+themes[0]; } },{ text:"绿色心情", iconCls:"theme_olive", handler:function(){ document.getElementsByTagName("link")[1].href="ext3.2/resources/css/"+themes[1]; } },{ text:"午夜迷情", iconCls:"theme_dark", handler:function(){ document.getElementsByTagName("link")[1].href="ext3.2/resources/css/"+themes[2]; } },{ text:"白色恋人", iconCls:"theme_gray", handler:function(){ document.getElementsByTagName("link")[1].href="ext3.2/resources/css/"+themes[3]; } },{ text:"紫色魅影", iconCls:"theme_purple", handler:function(){ document.getElementsByTagName("link")[1].href="ext3.2/resources/css/"+themes[4]; } },{ text:"咖啡物语", iconCls:"theme_coffee", handler:function(){ document.getElementsByTagName("link")[1].href="ext3.2/resources/css/"+themes[5]; } }]) menu.showAt(e.getPoint()); } }], items:[msgPanel,inputPanel,onlinePanel], listeners:{ close:function(){ var win=initLoginWin(); win.show(); //用户退出、发送离开主题 PL.publish(SUB_LEAVE,"username="+name+"&userid="+PL.sessionId+"&lflag=1"); //PL.leave(); } } }).show(); function createCenterPanel(){ var panel=new Ext.Panel({ region:"center", id:"message_panel", bodyStyle:"margin:0 10px 10px 0;", autoScroll:true }) return panel; }; function createEastPanel(){ var panel=new Ext.tree.TreePanel({ title:"在线用户", region:"east", width:140, bodyStyle:"margin:0 0 10px 10px;", root:new Ext.tree.TreeNode({ text:"在线用户" }), rootVisible: false }) return panel; }; function createSouthPanel(){ var panel=new Ext.Panel({ region:"south", height:147, layout:"fit", tbar:[{ iconCls:"icon_font", text:"", handler:function(){ var html=createFaceGrid(user_name); var win=new Ext.Window({ width:250, height:160, id:"face_win", html:html }).show(); } },'-',{ iconCls:"icon_face", xtype:"button", handler:function(e){ //alert(sadsad); var html=createFaceGrid(user_name); var t=Number(e.el.getXY()[0]-135); var l=Number(e.el.getXY()[1]+20); $("#details").css({ "top" :t, "left" :l }).fadeIn("fast"); $("#details").html(html); } }], items:[{ xtype: 'textarea', id:"my_message", enableKeyEvents:true, listeners:{ keypress: function(f,e) { if (e.getKey() == e.ENTER) { var msg_text=Ext.getCmp("my_message").getValue(); var msg=encodeURIComponent(encodeURIComponent(msg_text)); PL.publish(SUB_MESSAGE,"username="+encodeURIComponent(encodeURIComponent(user_name))+"&userid="+PL.sessionId+"&msg="+msg); sendMsg(user_name,msg_text,msgPanel); Ext.getCmp("my_message").setValue(""); Ext.getCmp("my_message").focus(); } } } }], buttons:[{ text:"发送", handler:function(){ var msg_text=Ext.getCmp("my_message").getValue(); var msg=encodeURIComponent(encodeURIComponent(msg_text)); //发送小心的主题、注意转码 PL.publish(SUB_MESSAGE,"username="+encodeURIComponent(encodeURIComponent(user_name))+"&userid="+PL.sessionId+"&msg="+msg); sendMsg(user_name,msg_text,msgPanel); Ext.getCmp("my_message").setValue(""); } },{ text:"重置" }] }) return panel; }; return win; }; /** * 初始化Pushlet 不断的发送请求、保持链接 * @param {} name * @param {} panel * @param {} tree */ function initPushLet(name,panel,tree){ var subListener=SUB_LOGIN+","+SUB_MESSAGE+","+SUB_LEAVE; PL.joinListen(subListener); PL.publish(SUB_LOGIN,"username="+name+"&userid="+PL.sessionId); /** * 每隔三秒连接一次 * @param {} event */ PL.onEvent = function(event){ if(event){ if(event.get('userid')!=PL.sessionId){ //如果获取到登录主题、则发送登录消息到每个连接 if(event.getSubject()==SUB_LOGIN){ if(event.get("username")){ var flag=true; var nodes=tree.getRootNode().childNodes; if(tree.getNodeById(event.get('userid'))){ }else{ var node=new Ext.tree.TreeNode({ text:decodeURIComponent(event.get('username')), id:event.get('userid'), iconCls:"node_icon", leaf:true }) tree.getRootNode().appendChild(node); var html = "<div style='margin : 15px;color:#999;'>"+decodeURIComponent(event.get('username'))+"   进入了聊天室!</div>"; panel.body.insertHtml("afterBegin",html); } } } //如果获取到发送消息主题、则发送登录消息到每个消息框、自己不发送 if(event.getSubject()==SUB_MESSAGE){ var msg = event.get('msg'); if(msg){ var datetime = event.get('datetime') || new Date().format('Y-m-d H:i:s'); var name = event.get('username'); reciveMsg(name,msg,panel); } } //用户离开 if(event.getSubject()==SUB_LEAVE){ if(event.get('lflag')){ var name = event.get('username'); var id=event.get('userid'); var html = "<div style='margin : 15px;color:#999;'>"+decodeURIComponent(name)+"   离开了聊天室!</div>"; tree.getNodeById(id).remove(true); panel.body.insertHtml("afterBegin",html); } } } } } window.onRefreshAck=function(event){ if(event.getSubject()!=SUB_LOGIN){ PL.publish(SUB_LOGIN,"username="+name+"&userid="+PL.sessionId); } } } //表情面板 function createFaceGrid(name){ var html="<table>"; for(var i=0;i<array.length;i++){ html+="<tr>"; for(var j=0;j<9;j++){ var img="images/face/"+array[i][j]+".gif"; html+="<td id='"+array[i][j]+"&"+name+"' onclick='chooseFace(this);'><img src="+img+"></td>"; } html+="</tr>"; } html+="</table>"; return html; } } //选择表情 function chooseFace(_this){ var face=_this.id.split("&")[0]; var user_name=_this.id.split("&")[1]; var html="<img src='images/face/"+face+".gif'/>"; var msg=html; var msg_txt=encodeURIComponent(encodeURIComponent(html)); PL.publish("/Chat/Message","username="+encodeURIComponent(encodeURIComponent(user_name))+"&userid="+PL.sessionId+"&msg="+msg); sendMsg(user_name,msg,Ext.getCmp("message_panel")); $("#details").hide(); } //发送消息 function sendMsg(name,msg,panel){ var html="<div style='margin : 15px;'>"+name+"("+new Date().format('Y-m-d H:i:s')+")<br>"+msg+"<div>"; panel.body.insertHtml("afterBegin",html); } //接收消息 function reciveMsg(name,msg,panel){ var html="<div style='margin : 15px;'>"+decodeURIComponent(name)+"("+new Date().format('Y-m-d H:i:s')+")<br>"+decodeURIComponent(msg)+"<div>"; panel.body.insertHtml("afterBegin",html); }
后台服务代码
public class ChatService extends EventPullSource{ //这是发送消息的后台服务、每3秒推送一次 public final String SUBJECT="/Chat/Message"; protected long getSleepTime() { return 3000; } protected Event pullEvent() { Event event = Event.createDataEvent(SUBJECT); return event; } }
评论
9 楼
shisin
2013-05-21
不好意思,我現在解決了pushlet 已有啟動
但是登錄後線上用戶沒有正常顯示,我看了一下js代碼
大概是PL.onEvent = function(event){ 這一段沒有被啟動
是不是 ChatService 後台服務這隻程式要去作一些設定對應?? 謝謝!
但是登錄後線上用戶沒有正常顯示,我看了一下js代碼
大概是PL.onEvent = function(event){ 這一段沒有被啟動
是不是 ChatService 後台服務這隻程式要去作一些設定對應?? 謝謝!
8 楼
shisin
2013-05-21
校長您好,感謝您的範例!
我下載您的範例試了一下,一開始pushlet 有init起來
可是輸入username之後登錄 pushlet 就死掉了
不知是那裡有問題... 可否提供完整的範例檔呢? 謝謝!
我下載您的範例試了一下,一開始pushlet 有init起來
可是輸入username之後登錄 pushlet 就死掉了
不知是那裡有問題... 可否提供完整的範例檔呢? 謝謝!
7 楼
wb1991wb
2013-04-16
xiaowoxiaoniu 写道
跪 求源码啊楼主,549885893@qq.com,万分感谢啊
源码都已经贴出来了呀!老大!js文件是前端UI的代码、java文件是后台服务器的代码!引入相应的jar包,js库就行了呀!
6 楼
xiaowoxiaoniu
2013-04-16
跪 求源码啊楼主,549885893@qq.com,万分感谢啊
5 楼
xiaowoxiaoniu
2013-04-16
跪 求源码啊楼主,549885893@qq.com,万分感谢啊
4 楼
xinle0320
2013-04-09
楼主源码给我一份,867869502@qq.com,谢谢
3 楼
wzwahl36
2012-11-20
wb1991wb 写道
wzwahl36 写道
楼主,能将完整代码发的看看吗?最近也看看pushlet~
wzwahl36@qq.com
感谢
wzwahl36@qq.com
感谢
仁兄、这个代码已经很完整了!UI是一个完整的,你要引入相应的pushlet库!
嗯,我看了官方的例子,就基本搞懂了~
http://redstones.sinaapp.com/
2 楼
wb1991wb
2012-11-19
wzwahl36 写道
楼主,能将完整代码发的看看吗?最近也看看pushlet~
wzwahl36@qq.com
感谢
wzwahl36@qq.com
感谢
仁兄、这个代码已经很完整了!UI是一个完整的,你要引入相应的pushlet库!
1 楼
wzwahl36
2012-11-14
楼主,能将完整代码发的看看吗?最近也看看pushlet~
wzwahl36@qq.com
感谢
wzwahl36@qq.com
感谢
发表评论
-
【叨、校长】TetrisGrid:基于ExtJs Grid实现的一个俄罗斯方块
2013-01-12 00:25 2925TetrisGrid--Master、Dao 在线演 ... -
【叨、校长】CopyGrid v1.1,基于ExtJs的可复制Excel数据的GridPanel
2012-12-29 21:53 1392CopyGrid v1.1; 基于Extjs 3.x版 ... -
【叨、校长】ITEye首发CopyGrid,基于ExtJs的可复制Excel数据的GridPanel
2012-12-23 22:58 1373基于Extjs 3.x版本编写的一个可直接复制、粘贴Excel ... -
【叨、校长】ExtJS Portal插件,基于Cookie添加保存位置状态功能
2012-12-23 14:52 1420该插件基于ExtJs 3.X版本的第三方UX Portal插件 ... -
【叨、校长】Extjs 动态表头GridPanel
2012-11-06 09:59 1236var columnArray=["2012-01& ... -
【叨、校长】DIV大小随窗口改变、Ext Panel放大功能的实现
2012-09-09 20:39 1812<html> <head> ... -
【叨、校长】Ext 下拉树插件_ComboTree_xz
2012-08-10 21:42 1774本插件继承于ComboBox!通俗易懂、老少皆宜、不论男女!- ... -
【叨、校长】Ext Window显示在最外层的方法
2012-08-08 16:01 1196方法:new top.Ext.Window({}); 就 ... -
【叨、校长】Extjs 双表头Grid
2012-07-26 19:53 2246本教程改自官方实例!通俗易懂、老少皆宜!---叨、校长 直接 ... -
【叨、校长】Extjs通过Ajax请求后台Struts2返回一个json对象
2012-06-17 10:40 2467首先:新建一个java web项目,添加struts2的支持, ... -
DWR+EXTJS 加载GRID数据
2012-06-07 22:29 10641、使用插件 DWRProxy.js 2、JS代 ... -
java开发中的时间类型
2012-04-01 11:23 10961、java时间类型的转换 * 时间类型格式化: Date ... -
Ext 动态改变button的图标
2011-10-24 16:54 1368使用iconCls配置项配置默认图标 使用getCmp(“要 ... -
Extjs 正则表达式
2011-10-18 13:02 1386name : 'employee.empNo', r ... -
QueryRunner的基本使用
2011-10-14 16:02 5554对web项目配置好Spring的支持,配置完成applicat ... -
Myeclipse快捷键和提示功能
2011-10-13 09:21 11981、提示键配置一般默认 ... -
Myeclipse安装spket插件(下载插件包安装)
2011-10-11 09:06 1736<script type="text/ja ...
相关推荐
【标题】"Ext demopushlet + Extjs 聊天室v0.9 (含源码)" 是一个基于Web的实时聊天应用示例,它整合了Pushlet技术和ExtJS库,提供了完整的源代码供开发者学习和参考。Pushlet是一种推送技术,用于实现实时数据从...
Pushlet和ExtJS分别是两个关键的技术组件,它们共同作用于创建一个简易的聊天组应用。 Pushlet,全称为Java Pushlet,是由GigaSpaces公司开发的一个开源项目,它是一个基于HTTP长轮询(Long Polling)技术的服务器...
【标题】:“Pushlet+ExtJS实现的聊天组”是一个基于特定技术栈构建的在线实时通信系统,旨在提供一种简洁的多人交流环境。Pushlet是一个轻量级的服务器端组件,用于实现实时数据推送,而ExtJS则是一个强大的前端...
基于Web的ExtJs即时聊天系统,可以任意添加好友,类似于Web版本的QQ
在本项目中,“Extjs实现的聊天室”利用了ExtJS的组件化特性和WebSocket技术,构建了一个实时的在线聊天平台。 WebSocket是一种在客户端和服务器之间建立长连接的协议,允许双方进行全双工通信,即数据可以在任意...
基于EXTJS的可视化Web页面设计工具的研究与开发基于EXTJS的可视化Web页面设计工具的研究与开发基于EXTJS的可视化Web页面设计工具的研究与开发基于EXTJS的可视化Web页面设计工具的研究与开发
EXTJS 是一个强大的JavaScript 框架,专用于构建富客户端Web应用程序。它提供了一整套组件化的用户界面元素和丰富的交互功能。基于EXTJS 的在线EXCEL编辑器,是利用EXTJS的强大功能来实现对Excel文件的在线创建、...
本项目是一个基于JSP技术开发的WEB版QQ聊天程序,其用户界面采用了EXTJS框架,提供了美观且交互友好的体验。EXTJS是一个强大的JavaScript库,专为构建富客户端应用程序而设计,它提供了丰富的组件库,可以方便地创建...
在这个项目中,“基于Tomcat8+Java7+ExtJS的WebSocket聊天室实现”利用了这些技术来创建一个实时交互的聊天应用。 1. **WebSocket简介** WebSocket为Web应用提供了低延迟、双向通信的能力,使得服务器能够主动向...
WMC2.0-Client.zip是一个基于Extjs4.2的开发框架,其实是个只有大框架的,并没有其他功能,您可能会骂我标题党“通用权限管理系统,通用后台模板”,呵呵,其实不是这样的。 整个WMC系统分为WMC2.0-Server服务端...
ExtJs 是一个强大的JavaScript库,专门用于构建富客户端Web应用程序。它提供了丰富的用户界面组件,如数据网格、表格、图表、窗体等,使得开发者能够创建功能丰富的、交互性强的前端应用。本压缩包文件中收集了基于...
ExtJS是一个强大的JavaScript库,专用于构建桌面级的Web应用程序,特别是企业级的后台管理系统。它提供了丰富的组件库,包括数据网格、表单、图表和其他用户界面元素,使得开发者可以创建出交互性强、功能完善的前端...
综上所述,"基于ExtJS改造的edo"项目是一个使用了ExtJS框架来增强和重构原有"edo"系统的Web应用。它可能涉及到前端界面的全面升级,通过丰富的组件库提供更佳的用户体验,并且通过`index.html`、`demo.html`等文件...
一个基于ExtJs3实现,简洁完整的后台管理系统入门实例。
这个项目是一个基于EXTJS 6.6的Web应用实例,提供了完整的登录页面和首页布局,包括左侧菜单和列表展示。以下是关于EXTJS 6.6框架以及该项目的关键知识点: 1. **EXTJS 6.6框架**:EXTJS 是由Sencha公司开发的一个...
### 基于ExtJS和SSH的Web应用架构的研究与实现 #### 一、引言 随着互联网技术的发展,Web应用已经成为企业和个人进行信息交流的重要工具。为了满足日益增长的功能需求和用户体验要求,开发人员不断探索更高效、更...
总之,这个基于ExtJS的酒店管理系统源码提供了一个实际的应用示例,对于学习和实践Web应用开发,特别是ExtJS框架的运用,具有很高的参考价值。通过深入研究和理解源码,开发者不仅可以提升技术能力,也能为自己的...