上一篇日志利用推送源周期性地向订阅了某一事件的所有网页端推送信息,但怎么实现向特定的某一个用户推送信息呢,想象一个网络聊天室,怎么向单独的一个好友私聊呢。问题的关键就是那个SessionID,Pushlet默认是用java.rmi.server.UID参数的随机字符串作为会话标志,这就造成我们没法跟一个特点的用户对应上,也就是说客户必须在joinListen的时候提供一个他的ID,就像登陆qq时,输入用户名一样。好了,这里就列出怎么修改相关代码,实现上述功能。
同样,首先用MyEclipse新建一个web工程,我这里命名为PushletTest2。不同的是,我们不引用pushlet.jar包了,因为我们要更改源码,在下载pushlet的时候里面就包含源代码了,最外层是nl包,加入我的工程的src里。好了,加进去之后会报错,将log4j.jar加入引用就好了。之后,同样别忘了把pushlet.properties和sources.properties加入WebRoot/WEN-INF下。工程结构如下:

aaarticlea/bmp;base64,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" alt="" />

FirPush.java是自己写的一个触发推送动作的类,它是一个servlet,请求该servlet就触发向特定的用户推送信息的动作(当然,怎么触发推送动作还有很多种形式)。
web.xml代码如下:

<span style="font-size: x-small;"><?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>pushlet</servlet-name>
<servlet-class>nl.justobjects.pushlet.servlet.Pushlet</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet>
<servlet-name>FirePush</servlet-name>
<servlet-class>com.mysrc.FirePush</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>pushlet</servlet-name>
<url-pattern>/pushlet.srv</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>FirePush</servlet-name>
<url-pattern>/FirePush</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app></span>

Ok,接下来就是要进行修改了,首先打开ajax-pushlet-client.js。PL对象,在它的最开始添加一个属性userId:'',,因为分析ajax-pushlet-client.js之后会发现,所有的请求都是get方式,也就是说是将请求参数添加到url里的,我们要做的是在进行join请求的时候将userId加到url上。找到PL的_doRequest,它是一个函数,所有的请求都是通过调用它发出的,找到var url = PL.pushletURL + '?p_event=' + anEvent;这一行,这儿就是在构造请求参数,在它的后面加入代码:

if (anEvent == 'join' || anEvent == 'join-listen') {    url = url + '&userId=' + PL.userId;
}

好了,ajax-pushlet-client.js的修改就完成了。
接下来是test.html:

<html>
<head>
<script type="text/javascript" src="ajax-pushlet-client.js"></script>
<script type="text/javascript">
PL.userId='piero';
PL._init();
PL.joinListen('myevent1');
function onData(event) {
alert(event.get("key1"));
}
</script>
</head>
<body>
This is pushlet test page....<br>
</body>
</html>

然后就是修改pushlet的java源代码,找到nl.justobjects.pushlet.core包下的SessionManager类,将它的createSession方法改成:

public Session createSession(Event anEvent) throws PushletException {
// Trivial
//return Session.create(createSessionId());
return Session.create(anEvent.getField("userId", "visitor"));
}

这儿就使得建立的session的id是发送过来的userId,而不是一个随机字符串。getField的第二个参数是当得不到请求参数userId的值的时候设定的默认值。
好了,所有的准备工作都完成了,接下来就是通过userId给特点的用户推送信息了。
FirePush.java代码如下:

package com.mysrc;  

import java.io.IOException;  

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import nl.justobjects.pushlet.core.Dispatcher;
import nl.justobjects.pushlet.core.Event;
import nl.justobjects.pushlet.core.SessionManager; public class FirePush extends HttpServlet { @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
myUnicast();
//myMulticast();
//myBroadcast();
}
private void myUnicast()
{
if(SessionManager.getInstance().hasSession("piero")){
Event event = Event.createDataEvent("myevent1");
event.setField("key1", "houhou_yesttttt....");
Dispatcher.getInstance().unicast(event,"piero"); //向ID为piero的用户推送 System.out.println("success....");
}
else {
System.out.println("piero do not login....%%%%%%%%%%%%");
}
}
private void myMulticast()
{
Event event = Event.createDataEvent("myevent1");
event.setField("key1", "houhou....");
Dispatcher.getInstance().multicast(event); //向所有和myevent1名称匹配的事件推送 System.out.println("wa success....");
}
private void myBroadcast()
{
Event event = Event.createDataEvent("myevent1"); //向所有的事件推送,不要求和这儿的myevent1名称匹配
event.setField("key1", "dig hole....");
Dispatcher.getInstance().broadcast(event); System.out.println("asw success....");
}
}

这儿主要利用了dispatcher的unicat/multicat/broadcast方法。
好了,值得一提的是在ajax-pushlet-client.js有publish方法,也就是上面提到的触发信息推送动作,其实完全可以在前端调用这个js的publish函数向订阅了某事件的所有网页推送信息。test2.html代码如下:

<html>
<head>
<script type="text/javascript" src="ajax-pushlet-client.js"></script>
<script type="text/javascript">
PL.userId='juvenh';
PL._init(); PL.joinListen('event223');
function onData(event) {
alert(event.get("eventVal"));
} function sendnews(){
//PL.publish("myevent1","key1=dlut&ba=ls");
p_publish('myevent1', 'key1', 'dlut', 'ba', 'ls');
}
</script>
</head> <body>
This is my JSP page. <br>
<input type = "button" value="发消息" onclick="sendnews()"/>
</body>
</html>

上面代码中的PL.publish和p_publish完全等效,查看p_publish的代码,其实也是构造请求url。这儿的publish方法只能向订阅某一事件的所有网页推送消息,也即等同于multicast方法,无法向某一个特定的用户推送,解决方法还是向上面那样修改pushlet的java源代码,在nl.justobjects.pushlet.core包下的Controller.java中的protected void doPublish(Command aCommand);函数,看一下就会发现,这儿就是调用了dispacher的multicast函数,这儿改成unicast,前提是上面的js的publish里提供了userId。

Pushlet实现后台信息推送(二)的更多相关文章

  1. Pushlet实现后台信息推送(一)

    Pushlet是使用较多的后台向前台推送信息的工具.前台订阅某个感兴趣的事件joinListen,触发后台的Pushlet的servlet,为该请求会话建立session,默认这个sessionID是 ...

  2. iOS刚进入后台接受推送、打开推送调转到相应的界面

    刚进入后台的时候消息处理时候我用了本地推送!可以看我前边写的博客,怎么处理刚进入后台接收推送的案例,链接 /** 注释:打开推送的三种方式:-peter 1.apns的时候,结束进程退出后台:启动的时 ...

  3. 使用SignalR ASP.NET Core来简单实现一个后台实时推送数据给Echarts展示图表的功能

    什么是 SignalR ASP.NET Core ASP.NET Core SignalR 是一种开放源代码库,可简化将实时 web 功能添加到应用程序的功能. 实时 web 功能使服务器端代码可以立 ...

  4. 李洪强iOS之集成极光推送二iOS 证书 设置指南

    李洪强iOS之集成极光推送二iOS 证书 设置指南 创建应用程序ID 登陆 iOS Dev Center 选择进入iOS Provisioning Portal. 在 iOS Provisioning ...

  5. EasyPusher手机直播推送是如何实现后台直播推送的

    本文由EasyDarwin开源团队成员John提供:http://blog.csdn.net/jyt0551/article/details/52276062 EasyPusher Android是使 ...

  6. PHP Web实时消息后台服务器推送技术---GoEasy

    越来越多的项目需要用到实时消息的推送与接收,怎样用php实现最方便呢?我这里推荐大家使用GoEasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送! 浏览器兼容性:GoEasy推送 ...

  7. Ruby Web实时消息后台服务器推送技术---GoEasy

    越来越多的项目需要用到实时消息的推送与接收,怎样用Ruby实现最方便呢?我这里推荐大家使用GoEasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送! 浏览器兼容性:GoEasy推 ...

  8. Android消息推送(二)--基于MQTT协议实现的推送功能

    国内的Android设备,不能稳定的使用Google GCM(Google Cloud Messageing)消息推送服务. 1. 国内的Android设备,基本上从操作系统底层开始就去掉了Googl ...

  9. JAVA Web实时消息后台服务器推送技术---GoEasy

    ---恢复内容开始--- 越来越多的项目需要用到实时消息的推送与接收,我这里推荐大家使用GoEasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送! 浏览器兼容性:GoEasy推送 ...

随机推荐

  1. 《算法》第四章部分程序 part 7

    ▶ 书中第四章部分程序,包括在加上自己补充的代码,图中找欧拉环 ● 无向图中寻找欧拉环 package package01; import edu.princeton.cs.algs4.StdOut; ...

  2. 从一个异常探索spring autowired 的原理

    从一个异常探索autowired 的原理. 首先环境是这样的: public class Boss { @Autowired private Car car; } //@Component 加上这个注 ...

  3. Mybatis学习3——动态代理

    动态代理只需要接口和mapper映射文件不需要实现类 动态代理规范 1.namespace必须是接口的全路径 2.接口的方法必须与sql的id一致 3.接口的入参与parameterType类型一致 ...

  4. redisUtils

    package com.icil.elsa.subscribe.milestone.common.utils; import java.io.Serializable; import java.uti ...

  5. python linux 下开发环境搭建

    1.1: 在虚拟环境目录下安装 ipython  => pip install ipython 1.2: 简单的使用 => ipthyon => print("heollo ...

  6. oracle的备份与恢复

    转自:https://blog.csdn.net/kepa520/article/details/78958029 dba的职责: 1.安装和升级oracle数据库 2.建库.表空间.表.视图.索引. ...

  7. PHP 字符串两边填充补零

    str_pad顾名思义这个函数是针对字符串来说的这个可以对指定的字符串填补任何其它的字符串 例如:str_pad(带填补的字符串,填补后的长度,填补字符串,填补位置) 其中填补后的长度必须是个正整数, ...

  8. AS2在FLASH中调用EXE文件方法详细说明 已测试可行

    熟悉FLASH功能的朋友都知道fscommand在FLASH中是一个经常用来控制窗口全屏或退出的命令,同时它也是FLASH调用外部可执行程序的一种方法,使用fscommand命令格式如下: fscom ...

  9. Leetcode 题解 Trapping Rain Water

    题目链接:https://leetcode.com/problems/trapping-rain-water/description/ 思路: 1.先找到最左侧第一个高度不为0的柱子i. 2.从i+1 ...

  10. layer.js 学习笔记

    了解到一个很好用的弹框插件,名字叫layer.js 前几天要在网页中改写alert函数,自己写了一个模态框,虽然效果出来了,但是点击关闭后,无法返回当前页面.请教大神时,说有一个叫layer.js的东 ...