`
lrcx_ky
  • 浏览: 9487 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

关于开源框架Pushlet中的定点推送消息和与浏览器参数交互详解

阅读更多
今天在这里讲解一下关于开源框架Pushlet中的定点推送消息和与浏览器参数交互
   通过上面的方法我就可以完成点对点的网页版本的聊天软件了,当然需要达到上面的要求我们这里需要对Pushlet的源码进行改进。
  首先,我这里就讲述Pushlet的入门配置,默认大家是了解Pushlet框架的。
1. 与浏览器参数交互
  需要定位一个客户端就必须要给这个客户设置一个唯一的key值,我这里就叫它为clientid,当然也有朋友会说,我使用Pushlet中每个Session的id来作为clientid,这样当然是可以的,但为了便于管理我们一般会生成自己的clientid来进行操作,我在这里要做的就是使用自己生成的clientid来替换Pushlet自己生成的Sesssion的id。
  在Pushlet初始化去监听一个事件的时候我们是没有办法传递参数的,这里我就需要改动一下ajax-pushlet-client.js中的代码,来满足我们的需求,添加参数数组的定义,并且修改_doRequest函数如下代码:
var PL = {
    NV_P_FORMAT: 'p_format=xml-strict',
    NV_P_MODE: 'p_mode=pull',
    pushletURL: null,
    webRoot: null,
    sessionId: null,
    parameters: new Array(new Array),// 对参数数组的定义
    STATE_ERROR: -2,
    STATE_ABORT: -1,
    STATE_NULL: 1,
    STATE_READY: 2,
    STATE_JOINED: 3,
    STATE_LISTENING: 3,
    state: 1,
    
    ......

    _doRequest: function(anEvent, aQuery) {
         ......
         
         if(PL.parameters.length > 0) {
             for (var i = 0; i < PL.parameters.length; i++) {
                 var para = PL.parameters[i];
                 url += "&" + para.name + "=" + para.value;
             }
         }
         
         ......    
    },

    加入代码后的_doRequest函数如下:
    _doRequest: function(anEvent, aQuery) {
         ......
         
         // Construct base URL for GET
         var url = PL.pushletURL + '?p_event=' + anEvent;
 
         // Optionally attach query string
         if (aQuery) {
             url = url + '&' + aQuery;
         }
 
         // Optionally attach session id
         if (PL.sessionId != null) {
             url = url + '&p_id=' + PL.sessionId;
             if (anEvent == 'p_leave') {
                 PL.sessionId = null;
             }
         }
         
         if(PL.parameters.length > 0) {
             for (var i = 0; i < PL.parameters.length; i++) {
                 var para = PL.parameters[i];
                 url += "&" + para.name + "=" + para.value;
             }
         }
         
         PL.debug('_doRequest', url);
         PL._getXML(url, PL._onResponse);
 
     },

    代码改好后就可以这样写我的Pushlet初始化代码了,传入我们所需要的clientid给服务器,代码如下:
var initPushlet = function() {
     PL._init();
     PL.parameters.push({"clientid":"servicekey", "value":"4214f0c0da6760a9e95e3c164998ac06"});
     PL.joinListen('/conversation');
 };

  那么,客户端把参数传过来了服务端要怎么接收它呢?这就就需要修改一下Pushlet的java源码,首先我们修改nl.justobjects.pushlet.core.SessionManager中的createSession方法,如下:
     /**
      * Create new Session (but add later).
      */
     public Session createSession(Event anEvent) throws PushletException {
         // Trivial
         return Session.create(anEvent);
     }

    再修改nl.justobjects.pushlet.core.Session中的create方法,如下:
     public static Session create(Event anEvent) throws PushletException {
         Session session;
         try {
             session = (Session) Config.getClass(SESSION_CLASS, "nl.justobjects.pushlet.core.Session").newInstance();
         } catch (Throwable t) {
             throw new PushletException("Cannot instantiate Session from config", t);
         }
 
         // get clientid
         session.id = anEvent.getField("clientid");
         session.controller = Controller.create(session);
         session.subscriber = Subscriber.create(session);
         session.event = anEvent;
         return session;
     }

  上面就完成了SessionId的转变。
  如果我们要完成一个点对点聊天的话客户端和服务器通信当然是必不可少,具体怎么向服务端发消息呢?在这里我使用里Pushlet的js中的p_publish()方法,示例代码如下:
p_publish('answer','msg',encodeURIComponent('你好吗?'),'clientid','ce8954e8557fa9db8c1b2d6774e471a6');

  上面方法第一个参数是:执行的操作命令command,后面是都是传给服务器的参数,是以一个参数名+参数值的形式。参数值如果存在中文的话需要使用encodeURIComponent()方法来进行编码再传输。
  在服务端我们要接收这一个客户端发过来的消息并进行处理,我需要怎么接收它呢?就需要在nl.justobjects.pushlet.core.Controller这个类中的doCommand()方法中进行处理了,找到这个方法中的eventType.equals(Protocol.E_PUBLISH)判断内,并加入自己的处理代码,代码如下:
     public void doCommand(Command aCommand) {
         try {
             ......
             } else if (eventType.equals(Protocol.E_PUBLISH)) {
                 // Publish event
                 doPublish(aCommand);
                 
                 // get command
                 System.out.println(aCommand.reqEvent.getField("p_subject"));
                 // get clientid
                 System.out.println(aCommand.reqEvent.getField("clientid"));
                 // get msg
                 System.out.println(new String(aCommand.reqEvent.getField("msg").getBytes("ISO8859-1"), "UTF-8"));
             } else if (eventType.equals(Protocol.E_LISTEN)) {
                 // Listen to pushed events
                 doListen(aCommand);
             }
 
             ......
         } catch (Throwable t) {
             warn("Exception in doCommand(): " + t);
             t.printStackTrace();
         }
     }

  aCommand.reqEvent.getField("p_subject"))就可以获得客户端传过来的command命令,aCommand.reqEvent.getField("参数名")来获取传过来参数。当然在正常的开发中,所用到的命令会很多,我们可以把每一个命令做成一个个子类去实现,完成不同的需求。至于怎么将消息发送给客户端,将在下面的定点推送消息中讲解。

2. 定点推送消息
  上面已经讲述了每个客户端都会存在一个clientid,这个clientid可以定位每一个客户端,那么既然我们需要向某一个客户端推送消息,那必然要知道这个客户端的clientid,这里我建议开发者自己写一个管理器用于管理连接上来的客户端,用于保存这些客户端的信息。如果需要开发聊天程序的话则需要写一个聊天会话管理器,用于管理一对对的聊天会话Session。
  言归正传,我们接着1内容中的最后说,当我们在doCommand()方法中获得了某一个客户端传过来的消息时,我们可能需要做的是将处理的结果返回给它,或将它的消息发给另外一个客户端,至于怎么做呢?我们直接看代码,还是上面的代码加入了些内容如下:
     public void doCommand(Command aCommand) {
         try {
             ......
             } else if (eventType.equals(Protocol.E_PUBLISH)) {
                 // Publish event
                 doPublish(aCommand);
                 
                 // get command
                 System.out.println(aCommand.reqEvent.getField("p_subject"));
                 // get clientid
                 System.out.println(aCommand.reqEvent.getField("clientid"));
                 // get msg
                 System.out.println(new String(aCommand.reqEvent.getField("msg").getBytes("ISO8859-1"), "UTF-8"));
                 
                 // 发送给其他客户端
                 Event event = Event.createDataEvent("/conversation"); // 监听的事件
                 event.setField("cmd", "say");
                 event.setField("code", 100);
                 event.setField("msg", new String(aCommand.reqEvent.getField("msg").getBytes("ISO8859-1"), "UTF-8"));
                 Dispatcher.getInstance().unicast(event, aCommand.reqEvent.getField("clientid"));// 指定的clientid
                 
                 // 回传给自己
                 event = Event.createDataEvent("/conversation"); // 监听的事件
                 event.setField("cmd", "answerResult");
                 event.setField("code", 100);
                 Dispatcher.getInstance().unicast(event, session.getId());// 当前sessionid即为clientid
                 
             } else if (eventType.equals(Protocol.E_LISTEN)) {
                 // Listen to pushed events
                 doListen(aCommand);
             }
 
             ......
         } catch (Throwable t) {
             warn("Exception in doCommand(): " + t);
             t.printStackTrace();
         }
     }

  上面代码就实现了将消息发给指定客户端,以及回传消息给自己。客户端要如何接收服务端传过来的消息,见如下代码:
function onData(event) {
     alert(event.get("cmd"));
     alert(event.get("code"));
     alert(event.get("msg"));
}

  页面上写上此js就可以接收到服务器传过来的内容,内容全都包含在event当中了。
总结:到此为止我们对Pushlet中的定点推送消息和与浏览器参数交互有了比较深入的学习,大家可以按照这个方案开发自己想要的东西了。

  另:还有我想说的就是,Pushlet这个框架是基于Servlet来做的,Servlet是需要在Tomcat这样的容器中运行的,这样一来它的客户端连接数必然受到限制。还有由于Pushlet的机制使得它并不是那么的实时。接下来我想说的是通过http长连接的方式来做。

分享到:
评论

相关推荐

    基于pushlet实现的jsp网站消息推送

    综上所述,基于Pushlet的JSP网站消息推送技术是解决实时数据交互问题的一种有效途径,尤其适合初学者学习和实践。通过理解Pushlet的工作机制和实施流程,开发者可以更好地理解和掌握Web推送技术,提升Web应用的实时...

    pushlet消息推送

    Pushlet Client则运行在用户浏览器或者应用程序中,用于接收服务器推送的数据,并进行相应的处理。Event Source可以是任何产生事件的数据源,如数据库、传感器或其他服务器。 Pushlet的工作流程大致如下: 1. ...

    开源框架Pushlet入门(转)

    Pushlet是一款开源的实时数据推送框架,它允许服务器端主动将数据推送到客户端,而无需客户端不断轮询请求。这种技术在现代Web应用中非常常见,如实时聊天、股票报价、在线游戏等场景。Pushlet的设计灵感来自于Java...

    一个基于pushlet推送的小例子

    【推送技术】 推送技术是Web开发中的一种高级机制,它允许服务器主动向...通过这个例子,开发者可以学习到如何构建和部署一个能够进行服务器端数据推送的Web应用,这对于需要实时交互的系统设计具有重要参考价值。

    pushlet实例(java服务端推送消息)

    实现多个客户端连接到web服务器,由服务端推送消息至客户端(或指定id的客户端),代码中没有用官网的jar文件,而是用的源码,做了一定的修改,实现了每个客户端都可以自定义id,然后服务端可以向指定id客户端推送消息...

    pushlet定时向前台推送消息

    在"pushlet定时向前台推送消息"的场景中,Pushlet被用来创建一个能够定时发送消息到前端的应用。这个应用可能包含以下几个关键组成部分: 1. **服务器端组件**:Pushlet服务器端通常会有一个或多个服务,它们负责...

    Pushlet后台往jsp前台推送消息实例

    在这个"Pushlet后台往jsp前台推送消息实例"中,我们将深入探讨Pushlet的工作原理以及如何在实际项目中运用。 Pushlet是Java开发的一个开源项目,它基于Apache的jakarta-cocoon项目,利用了Servlet和Continuation...

    pushlet java 消息实时推送

    在IT行业中,实时消息推送是一项重要的技术,尤其是在构建交互式Web应用、移动应用以及服务器到设备的通信场景中。Pushlet Java 消息实时推送是一个典型的技术实现,它允许服务端主动向客户端发送数据,无需客户端...

    Pushlet消息推送

    在"Pushlet消息推送"的实例中,我们主要探讨了三种推送方式: 1. **定时周期性推送**:服务器按照预设的时间间隔向客户端发送数据。这种机制通常用于更新周期性的信息,如天气预报、新闻更新等。通过设置定时任务,...

    服务器推送pushlet讲解

    分析这个文件可以帮助你更好地理解和使用Pushlet框架,例如,你可以找到服务器如何处理推送事件,客户端如何建立连接,以及如何调试和解决问题的线索。 总之,Pushlet作为Comet的一种实现,提供了高效且灵活的...

    pushlet实现服务器端向客户端推送消息总结

    Pushlet 是一种基于 Java 的实时通信框架,用于实现在服务器端向客户端主动推送消息的功能,而无需客户端不断轮询。这种技术在构建实时应用程序,如聊天室、实时股票更新或在线游戏等场景中非常有用。以下是关于 ...

    PushLet实例,服务器消息推送

    通过这个PushLet实例,开发者可以学习如何在Java环境中构建一个高效的消息推送系统,理解服务器端和客户端之间的交互机制,以及如何处理网络波动和错误恢复。同时,这也是一个很好的实践机会,提升对现代Web实时通信...

    服务器推送 pushlet

    通过研究和实践这些示例,开发者可以了解如何在自己的项目中实现服务器推送功能,提高应用程序的实时性和交互性。在实际开发中,需要注意网络连接的管理,优化资源消耗,同时考虑到不同浏览器和服务器环境的兼容性...

    pushlet框架做的小例子

    Pushlet框架,又称为Java Pushlet,是一种基于Java的实时推送技术框架,由Marc Fleury创建并开源。Pushlet的核心概念是实现服务器向客户端的主动推送数据,而不是传统的HTTP请求-响应模式,即客户端通过轮询方式获取...

    pushlet.jar 和示例工程

    "pushlet.jar 和示例工程"是一个专注于实现服务器端向客户端主动推送消息的框架,它在Web开发领域中扮演着重要角色。Pushlet框架的设计旨在克服传统的HTTP协议中客户端请求、服务器响应的被动通信模式,转而采用一种...

    java服务端推送实例-pushlet-及中文问题

    通过学习和实践这个Java服务端推送实例,你可以掌握Pushlet框架的使用,理解服务端推送的基本原理,以及如何解决在推送过程中遇到的中文编码问题。这将对你的Java Web开发技能有所提升,特别是在构建实时应用时,...

    pushlet2.0.4-demo-增加指定人推送

    《Pushlet 2.0.4 框架详解:新增指定用户推送功能》 Pushlet 2.0.4 是一个官方发布的消息推送框架,它为开发者提供了一种高效、可靠的实时通信机制,用于在服务器与客户端之间传递数据。在最新的版本 2.0.4 中,该...

    网页推送pushlet的demo

    在本Demo中,我们将深入探讨Pushlet的工作原理和如何实现一个基本的网页推送系统。 首先,我们需要理解什么是Comet技术。Comet是一种用于实现实时Web应用的技术策略,通过长时间打开HTTP连接(长轮询、HTTP流或HTTP...

    服务器推送——PushLet的应用<一>

    【服务器推送技术——PushLet应用详解&lt;一&gt;】 在当今的互联网应用中,实时性成为了不可或缺的需求,无论是即时通讯、在线游戏还是股票交易,都需要服务器能够主动向客户端推送信息,而不是传统的请求-响应模式。这...

    Pushlet点对点发送消息

    Pushlet是一种基于Java的实时通信框架,主要用于实现服务器向客户端推送数据,也就是所谓的“服务器推”技术。在传统的HTTP协议中,客户端需要不断发起请求来获取服务器的数据,而Pushlet则打破了这种模式,允许...

Global site tag (gtag.js) - Google Analytics