pushlet实现服务器端向客户端推送信息

使用Pushlet来实现服务器端向客户端推送信息

1.   实现方式:

有两种实现方式:

1.         通过配置文件来实现定时的从服务器端向客户端推送信息

2.         通过API主动向另外一端推送信息

以下分别给予介绍。

2.   特别注意

在开始测试之前,有三点非常重要,需要实现讲明,否则程序将会无法正常运行:

2.1.     JSP页面上的设定

JSP页面上必须添加以下代码以确保Pushlet能够正确的获得后台服务的地址:


<base href="<%=request.getContextPath()%>">

2.2.     Pushlet的JS文件的Bug修改

需要修改被引用的JS文件ajax-pushlet-client.js的内容,找到


PL.pushletURL = PL._getWebRoot() + ‘pushlet.srv‘;

将其修改为


PL.pushletURL = ‘pushlet.srv‘;

修改的原因是Pushlet进行地址解析的方法在某些应用中会解析错误,导致请求的路径是nullpushlet.srv?,最终导致无法正确的请求到服务器的信息。

2.3.     中文问题

一般情况下,如果不做特殊处理,中文问题将会导致Pushlet的客户端停止响应,解决办法是,在使用Pushlet的客户端代码发送消息之前,将其进行转码,代码为


encodeURIComponent( msg)

3.   正式开始

以上准备工作完毕,就可以正式的开发测试样例了。

3.1.     定时的从后台向前台push信息

(1)       在eclipse中创建一个动态的web工程

(2)       配置及库文件文件:从http://www.pushlets.com/ 下载最新的pushlet的开发包,将其中的以下文件按照描述进行设定


序号


文件名


源位置


目标位置


备注


1.          


pushlet.jar


{pushlet-2.0.4}\lib


项目类路径


如果使用的是applet的话,还需要将pushletclient.jar设置到项目的类路径中去


2.          


log4j.properties

pushlet.properties

sources.properties


{pushlet-2.0.4}\webapps\pushlet\WEB-INF\classes


项目的src根路径


注意稍后需要修改sources.properties,其他两个文件的内容不需要修改


3.          


ajax-pushlet-client.js


{pushlet-2.0.4}\webapps\pushlet\lib


项目的webroot\lib


需要按照之前的描述修改其中的内容

(3)       修改web.xml,将pushlet的自启动servlet添加进去


<servlet>

<servlet-name>pushlet</servlet-name>

<servlet-class>nl.justobjects.pushlet.servlet.Pushlet</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>pushlet</servlet-name>

<url-pattern>/pushlet.srv</url-pattern>

</servlet-mapping>

(4)       创建服务器端代码,特别注意类和内部静态类的名字


package com.guoguo;

import java.io.Serializable;

import java.io.UnsupportedEncodingException;

import sun.rmi.runtime.Log;

import nl.justobjects.pushlet.core.Event;

import nl.justobjects.pushlet.core.EventPullSource;

public class HelloWorldPushlet implements Serializable {

private static final long serialVersionUID = -8940934044114406724L;

public static class HWPushlet extends EventPullSource {

Log log = Log.getLog(HWPushlet.class.getName(),

HWPushlet.class.getName(), true);

@Override

protected long getSleepTime() {

return 1000;//每一秒钟自动执行一次

}

@Override

protected Event pullEvent() {

//注意,一下是设定消息的主题/guoguo/helloworld,号称主题是可以继承的

//但是笔者的测试是失败的,也许方法不对,呵呵

Event event = Event.createDataEvent("/guoguo/helloworld");

String data= "hello,world 郭强 "+System.currentTimeMillis();

try {

data=new String(data.getBytes("UTF-8"),"ISO-8859-1");

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

event.setField("hw",data);

return event;

}

}

}

(5)       注册服务器端代码为事件源,在sources.properties文件中,添加以下行


source7=com.guoguo.HelloWorldPushlet$HWPushlet

以上方式适用于有内部类的情况,如果没有内部类的话,使用以下的方式进行注册(这时外部类必须继承父类EventPullSource)


source7=com.guoguo.HelloWorldPushlet

(6)       页面(可以参考页面内注释信息)


<%@ page language="java" contentType="text/html; charset=ISO-8859-1"

pageEncoding="ISO-8859-1"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

<title>Pushlet Test</title>

<meta http-equiv="pragma" content="no-cache">

<meta http-equiv="cache-control" content="no-cache">

<base href="<%=request.getContextPath()%>">

</head>

<body>

<script type="text/javascript" src="lib/ajax-pushlet-client.js"></script>

<div id="guoguo"></div>

<script type="text/javascript">

//初始化pushlet客户端

PL._init();

//设定运行时显示调试信息,不需要时,直接删掉即可

PL.setDebug(true);

//设定监听主题:/guoguo/helloworld,与服务器端的主题完全一致

PL.joinListen(‘/guoguo/helloworld‘);

//接收到事件后,显示服务器信息

function onData(event) {

guoguo.innerText=(event.get("hw"));

}

</script>

<p1>Pushlet Test</p1>

</body>

</html>

(7)       启动服务器,即可看到页面上的信息每秒钟一次,进行定时的更新

3.2.     主动控制发送消息

3.2.1.   有刷新的提交信息(服务器端主动发送消息)

(1)       创建一个servlet,并且注册到web.xml中

Servlet代码


package com.guoguo;

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 ChatServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

public ChatServlet() {

super();

}

protected void service(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

// myUnicast();

myMulticast();

// myBroadcast();

request.getRequestDispatcher("chat.jsp").forward(request, response);

}

private void myUnicast() {

Event event = Event.createDataEvent("/guoguo/myevent1");

event.setField("key1", "Unicast msg");

Dispatcher.getInstance().unicast(event, "piero"); // 向ID为piero的用户推送

System.out.println("success....");

}

private void myMulticast() {

Event event = Event.createDataEvent("/guoguo/myevent1");

//Event event = Event.createDataEvent("/guoguo");

event.setField("key1", "Multicast msg");

Dispatcher.getInstance().multicast(event); // 向所有和myevent1名称匹配的事件推送

System.out.println("wa success....");

}

private void myBroadcast() {

Event event = Event.createDataEvent("/guoguo/myevent1"); // 向所有的事件推送,不要求和这儿的myevent1名称匹配

event.setField("key1", "Broadcast msg");

Dispatcher.getInstance().broadcast(event);

System.out.println("asw success....");

}

}

Web.xml


<servlet>

<display-name>ChatServlet</display-name>

<servlet-name>ChatServlet</servlet-name>

<servlet-class>com.guoguo.ChatServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>ChatServlet</servlet-name>

<url-pattern>/ChatServlet</url-pattern>

</servlet-mapping>

(2)       页面端代码

发送端


<base href="<%=request.getContextPath()%>">

<form action="<%=request.getContextPath()%>/ChatServlet">

<input type="submit">

</form>

接收端


<base href="<%=request.getContextPath()%>">

<script type="text/javascript" src="lib/ajax-pushlet-client.js"></script>

<div id="guoguo"></div>

<script type="text/javascript">

PL._init();

PL.joinListen(‘/guoguo/myevent1‘);

function onData(event) {

guoguo.innerText = (event.get("key1"));

}

</script>

启动服务器,从发送端提交信息,内容会在接收端显示出来

3.2.2.   无刷新的提交信息(从客户端发送消息)

发送端


<base href="<%=request.getContextPath()%>">

<script type="text/javascript" src="lib/ajax-pushlet-client.js"></script>

<script type="text/javascript">

PL._init();

function sendnews(msg) {

p_publish(‘/guoguo/myevent1‘, ‘key1‘,encodeURIComponent(msg),’key2’,’msg2’);

}

</script>

<input type="text" name="mymsg">

<input type = "button" value="发消息" onclick="sendnews(mymsg.value)"/>

接收端


<base href="<%=request.getContextPath()%>">

<script type="text/javascript" src="lib/ajax-pushlet-client.js"></script>

<div id="guoguo"></div>

<script type="text/javascript">

PL._init();

PL.joinListen(‘/guoguo/myevent1‘);

function onData(event) {

guoguo.innerText = (event.get("key1"));

}

</script>

启动服务器,从发送端提交信息,内容会在接收端显示出来

注意:Pushlet目前仅对IE支持良好,经过笔者的测试,FireFox,Chrome均无法实现无刷新的客户端信息提交。

摘自--http://blog.sina.com.cn/s/blog_58b9cb3a01014l71.html

时间: 2024-10-12 22:57:26

pushlet实现服务器端向客户端推送信息的相关文章

java 使用 comet4j 主动向客户端推送信息 简单例子

[背景] 今天,一个前端的师弟问我怎样做实时聊天窗口,我毫不犹豫地说:在前台定时访问服务端呀!师弟默默地百度了一番,最后告诉我,有一种技术是后服务端动推送信息给客户端的,这种技术的名字叫comet,我惊呆了,因为完全没听过,赶紧上网搜集资料,耗了一个晚上写了个简单的例子,实现主动向客户端发送信息.说是说主动,其实还是要客户端先献出它的“第一次”,即只要它有先请求你一下,以后你们熟了,你想主动约它就约它! 关于comet技术介绍及其实现原理,可以参考网站 http://www.ibm.com/de

11.Arduino基础入门— 8.Arduino通过MQTT客户端推送信息

两个库的引用, 其中,PubSubClient可以在Arduino IDE的库管理器中找到: #include <WiFi.h> 本来是#include <ESP8266WiFi.h> 改成Wifi.h即可. #include <WiFi.h> #include <PubSubClient.h> //设置设备ID const String deviceID = "tempDevice1"; // 设置wifi连接用户密码 const ch

Android高效率编码-第三方SDK详解系列(三)——JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送

Android高效率编码-第三方SDK详解系列(三)--JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送 很久没有更新第三方SDK这个系列了,所以更新一下这几天工作中使用到的推送,写这个系列真的很要命,你要去把他们的API文档大致的翻阅一遍,而且各种功能都实现一遍,解决各种bug各种坑,不得不说,极光推送真坑,大家使用还是要慎重,我们看一下极光推送的官网 https://www.jpush.cn/common/ 推送比较使用,很多软件有需要,所以在这个点拿出来多讲讲,我们本节

rsync添加多模块,客户端推送出错!

rsync -avz /data/ rsync_backup[email protected]::nfsbackup/ sending incremental file list ERROR: module is read only rsync error: syntax or usage error (code 1) at main.c(866) [receiver=3.0.6] rsync: read error: Connection reset by peer (104) rsync e

java集成jpush实现客户端推送

代码地址如下:http://www.demodashi.com/demo/13700.html 前言 java 集成jpush 实现客户端推送 一.准备工作 开发环境: jdk1.6 Eclipse Luna Service Release 1 (4.4.1) 运行环境: eclipse 二.jpush 推送说明 jpush推送是国内的服务厂商提供的一站式push服务(同时支持iOS.android),后面也加入了即时通讯的能力供app使用.致力于打造简单.可靠.价格有竞争力的服务(简单功能全免

atitit.极光消息推送服务器端开发实现推送&#160;&#160;jpush&#160;v3.&#160;总结o7p

atitit.极光消息推送服务器端开发实现推送  jpush v3. 总结o7p 1. 推送所设计到底功能1 1.1. 内容压缩1 1.2. 多引擎1 2. reg  ,设置appkey and pwdkey1 3. 下载server  sdk   v31 4. push推送样例1 5. Code3 1. 推送所设计到底功能 1.1. 内容压缩 1.2. 多引擎 2. reg  ,设置appkey and pwdkey 3. 下载server  sdk   v3 https://github.c

调用APP标准消息接口推送信息http协议

调用协议:Http协议 调用方式:CRM中新分派线索(实时)或者线索未及时更新(定时,每天执行一次)时,调用APP标准消息接口推送信息,成功后返回标记已通知过. 接口调用方法如下: { "apikey":"xxxsadfsd", "identifier":"com.xx.xx",//向移动应用平台申请 "receiverType":"NAME", "receiverValue&

SCCM 2016 向客户端推送Endpoint Protection

说道EndPoint Protect大家也许比较陌生,简单来说,它是微软提供的一套免费的企业级杀毒软件. 大家可能在日常的企业中,可能会用到企业级的瑞星,ESET,卡巴斯基,趋势的OfficeScan等等企业级的管理杀毒软件, 他们方便管理,功能齐全,但是企业级的价格昂贵,且很多软件是按照客户端数量来收费. 说说我们今天介绍的 EndPoint Protection, 他就比较符合咱们中国人的购买需求,什么? 那就是免费,便宜!! 价格才是王道! 就像是Hyper-V上的安装免费的Windows

WebSocket 实现服务端给客户端推送消息

目录 代码发布 应用场景 ajax 操作 队列 递归 如何实现服务端主动给客户端推送消息的效果 长轮询(兼容性好) websocker(主流浏览器都支持) 代码验证(了解) 代码发布 服务端主动给客户端推送消息 截至目前为止,我们所写的 web 项目基本都是基于 HTTP 协议的 HTTP 协议有四大特性:无链接 基于 HTTP 协议实现服务端主动给客户端推送消息好像有点麻烦--- 我们都经历过,浏览器打开一个网站不动,网站过一会儿自动弹出消息 再比如网页版本的微信和 qq,我们所有人创建一个群