pushlet服务端推送

浏览器不同于其他客户端,很难建立其他客户端可以实现的socket通信,那么浏览器就只能使用轮询了,但是轮询又太太太耗费了,试想没20ms固定的发送一条http请求,对服务端来说确实是个负担,所幸,html5实现了一个websocket来解决这个问题,websocket使客户端和服务端中间建立一个通道,真正意义上的实现了及时通讯。但是。。。兼容性问题是谁也绕不过去的。IE10以下根本兼容不了。。。so,没办法了~  Comet 是一种新的 Web 应用架构。基于这种架构开发的应用中,服务器端会主动以异步的方式向客户端程序推送数据,而不需要客户端显式的发出请求。Comet 架构非常适合事件驱动的 Web 应用,以及对交互性和实时性要求较高的应用,如股票交易行情分析、聊天室和 Web 版在线游戏等。 Pushlet是一种comet实现(Pushlet 是开源的Comet 框架):在Servlet机制下,数据从服务器的Java对象直接推送(push)到客户端的页面,而无需任何Java applet或者插件的帮助。它使server端可以周期性地更新client的web页面,这与传统的request/response方式不同。Pushlet基于HTTP流,这种技术常常用在多媒体视频、通讯应用中,比如QuickTime。与装载HTTP页面之后马上关闭HTTP连接的做法相反,Pushlet采用HTTP流方式将新数据源源不断地推送到client,再此期间HTTP连接一直保持打开。

我就使用pushlet来实现:

页面:

<script type="text/javascript" src="ajax-pushlet-client.js"></script>
<script type="text/javascript"> 
           PL._init(); 
           PL.joinListen('/n'); 
           function onData(data) { 
             alert(data);
           } 
</script>

服务端:

/**
* 发送给所有监听该事件的客户端
* @param event 事件名称
* @param content 事件内容
*/
@Override
public void sendMsg(String event,String content) {
Event newEvent = Event.createDataEvent(event); 
       try {
newEvent.setField("content", URLEncoder.encode(content,"UTF-8"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();

       Dispatcher.getInstance().multicast(newEvent); 
      
}


/**
* 发送给特定的客户端
* @param accountID
* @param event 事件名称
* @param content 事件内容
*/
@Override
public void sendMsg(String accountID , String event,String content) {
String to=null;
Hashtable<String, String> table=EventCache.getSessionCache();
if(table.containsKey(accountID)){
to=table.get(accountID);
}
Event newEvent = Event.createDataEvent(event);
try {
newEvent.setField("content", URLEncoder.encode(content,"UTF-8"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(to==null){
System.out.println("没有当前用户登录。so。。。");
//Dispatcher.getInstance().multicast(newEvent); 
}else{
Dispatcher.getInstance().unicast(newEvent, to);
}
}


/**
* 发送给所有客户端
*/
@Override
public void sendMsg(String content) {
Event event = Event.createDataEvent("/comet"); // 向所有的事件推送,不要求和这儿的myevent1名称匹配 
       try {
event.setField("content", URLEncoder.encode(content,"UTF-8"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();

       Dispatcher.getInstance().broadcast(event); 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值