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 即可实现消息的定点发送。