server plush技术,DWR反转技术,即时聊天,服务器推技术

学习了dwr后,结合相关资料,自己写了个简单的“推”即时聊天的demo,用dwr反转实现的,期间也遇到过各种问题,通过查阅资料,终于一一解决,贴出代码,供大家分享。

一、这个是jsp页面,所有人共享这一个页面进行聊天

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
<script type="text/javascript" src="/chart/dwr/interface/ChartManager.js"></script>
<script type="text/javascript" src="/chart/dwr/engine.js"></script>
<script type="text/javascript" src="/chart/dwr/util.js"></script>
<script type="text/javascript" src="jquery-1.4.2.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$('#register').click(function(){
if($('#username').val()==null || $('#username').val()==""){alert("请输入注册用户名!");return;}
ChartManager.updateUserList($('#username').val(),true,function(data){
if(data!=null && data!="")$('#userid').val(data);
})
});
$('#send').click(function(){
var senduser=dwr.util.getValue("username");//获取发送者姓名
var reviceuser=dwr.util.getValue("revices");//获取接收者ID
var message=dwr.util.getValue("message");//获取发送的消息内容
ChartManager.sendMessage(senduser,reviceuser,message);//dwr调用方法发送
});
});
function init(){

//页面初始化时,设置反转
dwr.engine.setActiveReverseAjax(true);
ChartManager.updateUserList(null,false);//添加当前在线人列表
}
</script>
</head>
<body>
<table>
<tr><td colspan="2"><input type="hidden" id="userid" name="userid"/></td></tr>
<tr><td colspan="2">注册用户:<input type="text" name="username" id="username"><button id="register">注册</button></td></tr>
<tr><td>接受者:<select id="revices" name="revices"></select></td>
<td><input type="text" id="message" name="message"/><button id="send">发送</button></td></tr>
<tr><td colspan="2">在线列表:<ul id="ulist"></ul></td></tr>
<tr><td colspan="2"><div style="display:none" id="showMessage"><span id="sender" style="color:bule"></span>说:<span id="msg" style="color:green"></span></div></td></tr>
</table>
<script type="text/javascript">window.οnlοad=init;</script>
</body>
</html>

二、是聊天后天消息处理及加人

package com.chart.daoimpl;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import org.directwebremoting.ScriptSession;
import org.directwebremoting.ServerContext;
import org.directwebremoting.ServerContextFactory;
import org.directwebremoting.WebContextFactory;
import org.directwebremoting.proxy.dwr.Util;

import com.chart.entity.UserEntity;

public class ChartDaoImpl {
private static List<UserEntity> list=new ArrayList<UserEntity>();//保存所有用户列表

/**
* 获取当前用户列表和添加用户
* flg为true,添加新用户;false 返回当前列表
*/
@SuppressWarnings("unchecked")
public String updateUserList(String uname,boolean flg,HttpServletRequest request){
UserEntity user=null;
if(flg){
//把用户sessionID当用户ID保存
user=new UserEntity(request.getSession().getId(),uname);
list.add(user);
this.SessionIdbulidsPage(user.getUserId());
}
//获取页面上下文
ServletContext context=request.getSession().getServletContext();
ServerContext serContext=ServerContextFactory.get(context);
//获取页面所有session脚本
Collection allSession=serContext.getScriptSessionsByPage("/chart/index.jsp");
// System.out.println(allSession.size());
Util util=new Util(allSession);
//移除页面在线列表 //ulist为页面列表ID属性
util.removeAllOptions("ulist");
//添加列表
util.addOptions("ulist", list, "uname");//uname为实体类用户姓名属性,ulist为页面列表id
//移除接收者
util.removeAllOptions("revices");
//添加接收者
//userId为实体类用户ID属性,uname为实体类用户姓名属性,revices为页面下拉框id
util.addOptions("revices", list, "userId", "uname");
if(!flg){return null;}
return user.getUserId();
}

//把用户ID与页面脚本绑定,一个用户ID绑定一个页面session
private void SessionIdbulidsPage(String uid){
WebContextFactory.get().getScriptSession().setAttribute("userid", uid);
}
/**
* 根据用户ID获取绑定的页面session脚本
* @param userid
* @param request
* @return
*/
@SuppressWarnings("unchecked")
public ScriptSession getScriptSession(String userid,HttpServletRequest request){
ScriptSession scriptSession=null;
Collection<ScriptSession> coll=new HashSet<ScriptSession>();
//添加该页面的所有session脚本
coll.addAll(ServerContextFactory.get(request.getSession().getServletContext()).getScriptSessionsByPage("/chart/index.jsp"));
for(ScriptSession session:coll){
String userId=(String)session.getAttribute("userid");
if(userId!=null && userId.equals(userid)){
scriptSession=session;
}
}
return scriptSession;
}
/**
* 发送消息 这里是一对一的聊天。如果要实现群发,那么直接获取页面所有session脚本进行循环群发
*/
public void sendMessage(String sendUser,String revicesUser,String msg,HttpServletRequest request){
//返回接受者已有的页面脚本session,获取页面内容
ScriptSession ss=this.getScriptSession(revicesUser, request);
Util util=new Util(ss);//把接收到的内容显示到当前用户对话界面
util.setStyle("showMessage", "display", "");
util.setValue("sender", sendUser);
util.setValue("msg", msg);
}
}

三、web.xml配置

<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>
org.directwebremoting.servlet.DwrServlet
</servlet-class>
<init-param>

<!--调试模式设置true,发布时候要设置成false-->
<param-name>debug</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<description>加入dwr跨域策略(跨域调用)</description>
<param-name>crossDomainSessionSecurity</param-name>
<param-value>false</param-value><!-- false 表示允许跨域访问;true表示禁止跨域访问 -->
</init-param>
<init-param>
<description>服务器推技术(反转Ajax)激活轮询和Comet功能</description>
<param-name>activeReverseAjaxEnabled</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<description>开启DWR反转功能(开启“推”技术)</description>
<param-name>pollAndCometEnabled</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<description>告诉DWR当程序开始时初始化ReverseAjaxTracker</description>
<param-name>initApplicationScopeCreatorsAtStartup</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<description>激活页面javascript调用回调函数</description>
<param-name>allowScriptTagRemoting</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>maxWaitAfterWrite</param-name>
<param-value>100</param-value>
</init-param>

<!-- 调用优先级,值越小越先调用-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>

四、dwr.xml配置,这个文件必须是我们自己新建的

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://www.getahead.ltd.uk/dwr/dwr20.dtd">

注意:这里的头文件,如果你使用的dwr.jar版本不一样,这里是需要改的,dwr反转是在dwr2.0及更高版本才有的。
<dwr>
<allow>
<create javascript="ChartManager" creator="new">
<param name="class" value="com.chart.daoimpl.ChartDaoImpl"></param>
</create>
<convert match="com.chart.entity.UserEntity" converter="bean"></convert>
</allow>
</dwr>

备注:Dwr反转技术不适合做大型的聊天,它很占用服务器资源,建立的是长连接,如果别人写歌HttpClient循环访问该服务器,服务器很容易就挂掉。。 类似的推技术还有很多 比如plushlets,socket也可做推
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值