龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > Javascript编程 >

用AJAX+J2EE实现一个网上会议室系统(1)(2)

时间:2013-03-06 14:58来源:未知 作者:admin 点击:
分享到:
另外还需要一个表示当前发言人的Talker类,表示当前的发言人,发言开始时间,发言预计结束时间等。 在服务器端的设计中,会议室信息服务器应该能以

另外还需要一个表示当前发言人的Talker类,表示当前的发言人,发言开始时间,发言预计结束时间等。

在服务器端的设计中,会议室信息服务器应该能以多线程的方式运行,即启动一个会议就新开一个线程,每个会议线程维护自己的会议状态,如参会人、发言人,保存会议历史发言信息以及清空内存中的数据等操作。

四、客户端设计

会议室客户端包括两个部分,一个部分是会议室的管理界面,主要包会议室的“添删改查”及“启动”或“关闭”会议服务的操作。这部分我们直接使用EasyJWeb Tools中的添删改查业务引擎AbstractCrudAction可以快速实现。界面也比较简单,直接使用EasyJWeb Tools代码生成工具引擎生成即可。会议室管理的客户端是传统的Java Web技术,因此没有什么要考虑的。

客户端的第二个部分也即会议系统的主要部分,该部分主要有两个界面,第一个页面是会议室进入的选择页面。也即把已经启动的会议室列出来,用户选择一个会议室进入,这个页面也是使用传统的Java Web技术。第二个页面是进入会议室后的主界面,这个界面是整个会议系统的主要界面,所有参与会议的操作都在这里运行的。这个界面需要不断的与服务器端交互传输数据,传输的内容包括用户的发言、其它人给用户的发言、会议室的状态等。有的传输信息需要即时响应(如用户发言),有的信息可以设置成定时响应(如会议室状态)。

Java Web程序中与服务器端交互数据主要有两种方式,一种是直接刷新页面,另外一种是使用Socket直接跟Web服务器端口通讯。由于Socket编程相对复杂,我们选择第一种直接刷新页面的方式,这种方式又可以分为几种,包括传统的Form提交,传统的自动刷新网页取得数据以及使用ActiveXObject对象(如xmlhttp)直接与服务器交互数据,也即AJAX方式。由于使用AJAX方式用户感觉不到页面在刷新,表现起来好于手动或自动刷新页面的方式,因此我们决定选择AJAX方式实现客户端与服务器端进行数据交互。

用户发言的时候,直接使用xmlhttp对象Post数据到服务器。为了能不断接收到别人的发言信息,需要定时不断的从服务器端读取数据,因此,需要在客户端启动一个定时器,每隔一定的时候自动使用xmlhttp对象到服务器端下载别人的发言信息,并显示到会议室信息主界面中。另外还要定时刷新参会的人数、会议室当前发言人、会议室的公告等会议状态信息,这也可以通过从客户端启动一个定时器,通过xmlhttp对象与服务器交互得到。

另外还有一些操作,锁定会议室、踢人、指定发言人的发言时间、给会议室加密码等功能,也通过xmlhttp的方式与服务器传输命令实现。

五、核心代码说明

1、服务器端核心代码

在EasyJF开源团队的会议系统中,由于是以EasyJF官网的论坛系统、后台管理等是集成一起的。服务器ChatService与ChatRoom共同合并到了一个ChatService.java类中,实现会议室管理及会议服务功能。ChatService类的部分主要代码如下:

package com.easyjf.chat.business;
public class ChatService implements Runnable {
 private static final Map service=new HashMap();//会议室服务,系统中的当前会议室存放到该表集合中
 private static final int maxServices=10;//可以同时开的最大会议室数
 private static final SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");
 private final List msgs;//聊天信息Chat
 private final List users;//在线用户,ChatUser
 private final List talkers;//排队发言人数Talker
 private final List manager;//会议室管理员
 private Talker currentTalker;//当前发言人
 private String cid;//会议室id
 private String title;//会议室主题
 private String intro;//会议室简介
 private String owner;//会议室创建人
 private int maxUser;//最大在线人数
 private int interval;//最大刷新时间间隔
 private String vrtype;//访问权限
 private String vrvalue;//访问值
 private String announce;
 private String password;//房间进入密码
 private int status;//会议室状态
 private String filePath;
 //private Thread thread;
 private boolean isStop=false;
 public ChatService()
 {
this.msgs=new ArrayList();
this.users=new ArrayList();
this.talkers=new ArrayList();
this.manager=new ArrayList();
this.maxUser=1000;//最大1000人同时
this.interval=1000*60*5;//5分钟以前的信息
 }
 /**
 * 停止所有会议室
 *
 */
 public static void clear()
 {
if(!service.isEmpty())
{
 Iterator it=service.values().iterator();
 while(it.hasNext())
 {
ChatService chat=(ChatService)it.next();
chat.stop();
 }
}
service.clear();
 }
 /**
 * 创建一个会议室
 * @param name 会议室ID
 * @return
 */
 public static ChatService create(String name)
 {
ChatService ret=null;
 if(service.containsKey(name))
 {
ChatService s=(ChatService)service.get(name);
s.stop();
service.remove(name);
 }
 if(service.size() {
ret=new ChatService();
service.put(name,ret);
 }
 return ret;
 }
 /**
 * 停止某个会议室
 * @param name 会议室ID
 * @return
 */
 public static boolean close(String name)
 {
ChatService chatRoom=ChatService.get(name);
if(chatRoom!=null)
{
 chatRoom.stop();
 service.remove(name);
}
 return true;
 }
 /**
 * 获得一个会议室信息
 * @param name 会议室ID
 * @return
 */
 public static ChatService get(String name)
 {
if(service.containsKey(name))return (ChatService)service.get(name);
else return null;
 }
 public void run() {
// TODO Auto-generated method stub
//this.thread=Thread.currentThread();
while(!isStop)
{
 //System.out.println("开始监控一个会议室!"+this.title);
 this.flash();
 try{
Thread.sleep(5000);
 }
 catch(Exception e)
 {
 e.printStackTrace();
}
 }
 //System.out.println("结束!");
}
 public void stop()
 { 
 this.flashAll();
 isStop=true;
 }
 //会议室中有人发言
 public boolean talk(Chat chat)
 {
boolean ret=false;
if(canTalk(chat.getSender()))
{
 this.msgs.add(chat);
 ret=true;
}
return ret;
 }
 public boolean exit(ChatUser user)
 {
talk(geneSystemMsg(user.getUserName()+"退出了会议室!"));
return this.users.remove(user);
 }
}
//刷新信息,保存会议信息
public void flash()
{
 flashChatMsg();
 flashChatUser();
}
}

精彩图集

赞助商链接