首页>代码>java与pushlet实现bsim聊天>/bsIM/src/com/targsoft/engine/SystemChatEngine.java
// Copyright (c) 2000 Just Objects B.V. <just@justobjects.nl>
// Distributable under LGPL license. See terms of license at gnu.org.

package com.targsoft.engine;

import nl.justobjects.pushlet.client.PushletClient;
import nl.justobjects.pushlet.client.PushletClientListener;
import nl.justobjects.pushlet.core.Event;
import nl.justobjects.pushlet.core.Protocol;
import nl.justobjects.pushlet.util.PushletException;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Date;


public class SystemChatEngine extends Thread implements PushletClientListener, Protocol {
	private static SystemChatEngine  systemChatEngine = new SystemChatEngine("http://localhost/bsIM/pushlet.srv");

	private PushletClient pushletClient;
	private String aHosturl=null;
	private static final String SUBJECT = "/pushlet/ping,/user/login,/user/chat";
    private String meSessionID = null;

    //在线用户  里面装的就是在线用户队列 key= pushlet专有的 SessionID 此属性内部使用
    private Map<String,OnlineUser> onlinesUsedByinner = Collections.synchronizedMap(new HashMap(0));
    
    //在线用户  里面装的就是在线用户队列 key= accountID
    private Map<String,OnlineUser> onlines = Collections.synchronizedMap(new HashMap(0));
    

	private SystemChatEngine(String aHosturl) {
		this.aHosturl = aHosturl;
	}
	
	public void run() {
		// Create and start a Pushlet client; we receive callbacks
		// through onHeartbeat() and onData().
		try {

			pushletClient = new PushletClient(aHosturl);	
			pushletClient.setDebug(false);
			pushletClient.join();
			pushletClient.listen(this, Protocol.MODE_PULL,SUBJECT);


			
			p("pushletClient started");
			
		} catch (PushletException pe) {
			p("Error in setting up pushlet session pe=" + pe);
			return;
		}

		
	}

	/** Error occurred. */
	public void onError(String message) {
		p(message);
	}

	/** Abort event from server. */
	public void onAbort(Event theEvent) {
		p("onAbort received: " + theEvent);
	}

	/** Data event from server. */
	public void onData(Event theEvent) {
		// Calculate round trip delay
		
		if( theEvent.getSubject().equalsIgnoreCase("/user/login") ){
		
			if(!meSessionID.equalsIgnoreCase(theEvent.getField(Protocol.P_FROM))){
		        //如果是登陆的消息 并且不是自己发出的 并且 队列中没有这个id的节点
		        if ( onlinesUsedByinner.get(theEvent.getField(Protocol.P_FROM)) == null) {
		            
		        	OnlineUser curOnlineUser = new OnlineUser(theEvent.getField(Protocol.P_FROM), theEvent.getField("accountID") ,theEvent.getField("name")  );
		        	curOnlineUser.setAliveTS(Long.parseLong(theEvent.getField(Protocol.P_TIME)));
		
		        	//添加到在线数组中
		            onlinesUsedByinner.put(curOnlineUser.getId() ,curOnlineUser);
		            onlines.put(curOnlineUser.getAccountID(), curOnlineUser);
		            p(curOnlineUser.username + "["+ curOnlineUser.accountID+"]上线了!!");
					 
		
		        }
		        else
		        {
		        	OnlineUser curOnlineUser = onlinesUsedByinner.get(theEvent.getField(Protocol.P_FROM));
		        	
		                //如果是登陆的消息 并且不是自己发出的 并且 树中有这个id的节点  就更新他的在线时间戳
		        	curOnlineUser.setAliveTS(Long.parseLong(theEvent.getField(Protocol.P_TIME)));
		        	onlinesUsedByinner.put(curOnlineUser.getId() ,curOnlineUser);
		        	onlines.put(curOnlineUser.getAccountID(), curOnlineUser);
		             
		            
		        }	
	        
			}
		}
		
		
		
		if( theEvent.getSubject().equalsIgnoreCase("/user/chat") ){		
			if(!meSessionID.equalsIgnoreCase(theEvent.getField(Protocol.P_FROM))){
			     
				long then = Long.parseLong(theEvent.getField(Protocol.P_TIME));
				long delay = System.currentTimeMillis() - then;
				p("从"+onlinesUsedByinner.get(theEvent.getField(Protocol.P_FROM)).getUsername()+"["+onlinesUsedByinner.get(theEvent.getField(Protocol.P_FROM)).getAccountID()+"]来");
				p("onData:  #" + theEvent.getField("message") + " on " + (new Date()).toLocaleString() + " ms");
				
				
			}
		    

			
		}
		
		
		


	}

	/** Heartbeat event from server. */
	public void onHeartbeat(Event theEvent) {
		



		
		p("onHeartbeat received: " + theEvent);
		
		
		
	}

	/** Generic print. */
	public void p(String s) {
		System.out.println("[println:] " + s);
	}

	/** Main program. */
	public static void main(String args[])
	{
	
		
		systemChatEngine.start();
		


	  
	  
	}

	public void onRefresh(Event theEvent) {
		long then = Long.parseLong(theEvent.getField(Protocol.P_TIME));
		long delay = System.currentTimeMillis() - then;
		//p("onRefresh:  #" + theEvent + " in " + delay + " ms");
		
		
		
	}

	public void onRefresh_ack(Event theEvent) {
		
		long curEventP_time = Long.parseLong(theEvent.getField(Protocol.P_TIME));
		
		
		Set<String> keySet = new HashSet(onlinesUsedByinner.keySet());
		
	    for(String  curkey :  keySet){
            //当前时间戳-上次更新的时间戳 如果间隔较大 说明没更新  掉了
            if((curEventP_time- onlinesUsedByinner.get(curkey).getAliveTS())>30){
            	OnlineUser curOnlineUser = onlinesUsedByinner.get(curkey);
                p(curOnlineUser.username + "["+ curOnlineUser.accountID+"]离开了!!");
			    
                onlinesUsedByinner.remove(curkey);//从在线用户移除
                onlines.remove(curOnlineUser.accountID);//从在线用户移除
            }
        }
		
		
        keySet = onlinesUsedByinner.keySet();
		
/*	    for(String  curkey :  keySet){
	    	 p("现在有在线用户:"+onlines.get(curkey).username + "["+ onlines.get(curkey).accountID+"]!!");
	    	 
        }	*/	
		
		
		
		
	

		
		long then = Long.parseLong(theEvent.getField(Protocol.P_TIME));
		long delay = System.currentTimeMillis() - then;
		//p("onRefresh_ack:  #" + theEvent + " in " + delay + " ms");
		
		
		
		
		
		
		Map attributemap = new HashMap();
		try {
			attributemap.put("name", java.net.URLEncoder.encode("system系统","UTF-8"));
			attributemap.put("accountID", java.net.URLEncoder.encode("system","UTF-8"));
		} catch (UnsupportedEncodingException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		try {
			pushletClient.publish("/user/login", attributemap);
		} catch (PushletException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		
		
		
	}
	
	
	protected class OnlineUser {
		private String id = null;
		private String username = null;
		private String accountID = null;
		private long aliveTS = 0;
		
		
		
		public OnlineUser(String id ,String accountID, String username){
			this.id = id;
			this.accountID = accountID;
			this.username = username;
			
		}
		
		/**
		 * @return the id
		 */
		public String getId() {
			return id;
		}
		
		/**
		 * @return the accountID
		 */
		public String getAccountID() {
			return accountID;
		}
		
		/**
		 * @return the username
		 */
		public String getUsername() {
			return username;
		}

		/**
		 * @return the aliveTS
		 */
		public long getAliveTS() {
			return aliveTS;
		}
		/**
		 * @param aliveTS the aliveTS to set
		 */
		public void setAliveTS(long aliveTS) {
			this.aliveTS = aliveTS;
		}



		
		
		
		
	}


	public void onJoinListenAck(Event theEvent) {
		// TODO Auto-generated method stub
		//p("onJoinListenAck received: " + theEvent);
		
		meSessionID = theEvent.getField(Protocol.P_ID);
		
		
		

		
	}

	public void onListenAck(Event theEvent) {
		// TODO Auto-generated method stub
		//p("onListenAck received: " + theEvent);
		meSessionID = theEvent.getField(Protocol.P_ID);

	}

	/**
	 * @return the pushletClient
	 */
	public static  PushletClient getPushletClient() {
		
		while(  systemChatEngine.pushletClient==null){
			
			
		}
	
		return systemChatEngine.pushletClient;
	}

	/**
	 * 在线用户  里面装的就是在线用户队列 key= accountID
	 * @return the onlines
	 */
	public static Map<String, OnlineUser> getOnlines() {
		return systemChatEngine.onlines;
	}
	

}


最近下载更多
羁鸟念旧林  LV1 2021年6月14日
黄河之水天上来  LV2 2019年7月7日
2252536772  LV21 2019年6月21日
zCOFFEE  LV3 2019年3月31日
博博123  LV3 2017年8月1日
覃学谦  LV2 2017年7月5日
liuhaitie  LV14 2017年3月22日
guveis  LV2 2016年11月19日
ljcy122  LV1 2016年10月3日
lalalalala  LV13 2016年6月21日
最近浏览更多
cksndh  LV4 2023年8月16日
yybb7435100  LV2 2023年8月7日
 LV1 2021年11月24日
13798956075  LV1 2021年10月8日
羁鸟念旧林  LV1 2021年6月14日
年轻的人  LV1 2021年6月12日
1005948011  LV7 2021年6月1日
xser3366  LV5 2021年4月13日
2251937068  LV5 2021年3月17日
eawdas  LV5 2020年12月27日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友