pushlet 学习二

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值