pushlet 的官网上有很多例子,可以参见http://www.pushlets.com/pushlet/examples/pushlet.html ,其中有个webim的例子,这个其实是个聊天室的功能,如果改为点对点的聊天方式的话怎么做呢?
大体上有两种方式:
一 修改客户端js,拿到消息后判断接受者标示和当前用户是否一致,不一致则不显示。
二 是修改pushlet源码,仔细查看源码可以知道,在SessionManager.java 里面 createSession 方法,是以随机数生成session id的,一个随机数的session id显然无法满足精确查找的要求,我们需要改写这段代码,例如我就将session id改为登录用户的loginName,loginName以url的参数形式传递过来,将原来的方法改为:
/** * Create new Session (but add later). */ public Session createSession(Event anEvent) throws PushletException { // Trivial //return Session.create(createSessionId()); 原先的代码,生成随机数的session id return Session.create(anEvent.getField("uid")); }
再查看 Controller.java 中的doPublish方法
protected void doPublish(Command aCommand) { Event responseEvent = null; try { String subject = aCommand.reqEvent.getField(Protocol.P_SUBJECT); if (subject == null) { // Return error response responseEvent = new Event(E_NACK); responseEvent.setField(P_ID, session.getId()); responseEvent.setField(P_REASON, "no subject provided"); } else { aCommand.reqEvent.setField(P_FROM, session.getId()); aCommand.reqEvent.setField(P_EVENT, E_DATA); // Event may be targeted to specific user (p_to field) String to = aCommand.reqEvent.getField(P_TO); if (to != null) { Dispatcher.getInstance().unicast(aCommand.reqEvent, to); } else { // No to: multicast debug("doPublish() event=" + aCommand.reqEvent); Dispatcher.getInstance().multicast(aCommand.reqEvent); } // Acknowledge responseEvent = new Event(E_PUBLISH_ACK); } } catch (Throwable t) { responseEvent = new Event(E_NACK); responseEvent.setField(P_ID, session.getId()); responseEvent.setField(P_REASON, "unexpected error: " + t); warn("doPublish() error: " + t); t.printStackTrace(); } finally { // Always set response event in command aCommand.setResponseEvent(responseEvent); } }
其中的
String to = aCommand.reqEvent.getField(P_TO); if (to != null) { Dispatcher.getInstance().unicast(aCommand.reqEvent, to); }
表明只要在发送消息的时候指定要发送的人(session id)就会单独发送给那个人,而不会以广播形式发送。
这样只需修改pushlet的 session id的生成方式,在发送消息是指定接收者的session id 即可实现消息的定点发送。