Phonegap+WebSocket 实现推送功能

有人问websocket和socket的区别

websocket是应用层协议,底层采用tcp协议,socket是一种实现tcpip协议的工具!也就是说你可以用socket编写支持websocket的应用

 websocket比tcp节省服务器资源和带宽吗  那么问题的答案就是  一个应用层协议和一个传输层协议  可以自己先去了解下区别

有关websocket的介绍,可以看下大神们的文章:http://www.360doc.com/content/12/0331/10/9519415_199538358.shtml

用websocket结合phonegap+ html5,服务端用Tomcat 实现了一个简单的手机推送功能

首先看服务端代码

// @ServerEndpoint注解,标示出这是一个WebSocket的Server端 , value属性表示访问这个server的url
@ServerEndpoint(value="/websocket/{user}")
public class WebSocketServerDemo {

//	private static Set peers = new HashSet();
	
//	因为会有多个线程访问HashSet ,而HashSet不是同步的,因此用Collections.synchronizedSet来使HashSet同步
	private static Set peers =  Collections.synchronizedSet(new HashSet());
	
	private Session session;

//	open方法的注解,当一个客户端连上来时触发,每个客户端会被分配一个session,这个session可不是httpsession.
//	open方法里有个参数user被加上了注解@PathParam(value = "user")String user,这个就是从url中获取user的方式
	@OnOpen
	public void open(Session session , @PathParam(value="user") String user)
	{
		this.session = session;
//		存储这个新session
		peers.add(session);
		
		System.out.println("WebSocketServerDemo open from sessionId:"+this.session.getId());
	}
	
//	收到客户端发送的消息时触发
	@OnMessage
	public void inMessage(String message)
	{
		System.out.println("WebSocketServerDemo inmessage from sessionId:"+this.session.getId()+
				    ":"+message);
		
	}
	
//	客户端断开时触发
	@OnClose
	public void end()
	{
//		从session集合中删除关闭连接的session
		peers.remove(this.session.getId());
		System.out.println("WebSocketServerDemo end from sessionId:"+this.session.getId());
	}


//	向所有客户端发送一条消息
	public static void broadcase(String msg)
	{
		
		System.out.println("WebSocketserverDemo broadcase ");
		
		JSONObject  json = new JSONObject();
		
		json.put("data", "这是我(服务器)向你们(客户端)推送的消息,不要惊讶");
		for(Session session : peers)
		{
		   if(session.isOpen())
		   {
				try {
	//				该方法用来向客户端推送消息
					json.put("id",session.getId());
					System.out.println(json.toString());
					session.getBasicRemote().sendText(json.toString());
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		   }
		  }
	}
}
在需要向所有连接的客户端发送通知时,调用 broadcase 即可

接下来是phoengap

var onDeviceReady = function()
    	{
    		
    		document.getElementById("devready").innerHTML="Device ready";
    		/* 开启websocket  */
    		startWebSocket();
    	};
    	
    	document.addEventListener("deviceready",onDeviceReady,false);

在 deviceready事件后,开始websocket连接,startWebSocket()代码如下

  /*websocket  */
        var localhost="192.168.1.138";
    	var ws = null;  
  		function startWebSocket() {  
        if ('WebSocket' in window) 
        {   
            console.log("support Websocket")
            ws = new WebSocket("ws://"+localhost+":8080/WebSocketDemo/websocket/{1}");  
        } 
        else if ('MozWebSocket' in window)  
        {
            console.log("support MozWebsocket")
            ws = new MozWebSocket("ws://"+localhost+":8080/WebSocketDemo/websocket/{2}");  
        }
        else  
        	{
            alert("not support");  
            console.log("not support websocket")
        	}
          
        // 收到消息
        ws.onmessage = function(evt) {  

        	// 从服务端传递过来的json字符串还包含了很多其他信息,其中data包含的是自己要传递的json数据
        	 console.log(evt.data);
        	// 将json字符串数据转换成json对象
        	 var obj = JSON.parse(evt.data);
        	 navigator.myplugin.demo(evt.data,"notification");  
        };  
          
        // 断开连接
        ws.onclose = function(evt) {  
            alert("close");  
        };  
          
        // 打开连接
        ws.onopen = function(evt) {  
            alert("open");  
        };  
   		 }  
      
      	// 向服务端发送消息
   	 	function sendMsg() {  
      	  ws.send(document.getElementById('writeMsg').value);  
   		 }  
       

其中 navigator.myplugin.demo()方法是phonegap插件扩展方法,具体代码如下

cordova.define("org.apache.cordova.myplugin", function(require, exports, module) { 

var exec = require('cordova/exec');



module.exports = {

 
    demo: function(message,action) {
        exec(function(winParam){
        	alert(winParam);
        }, function(){alert("error callback")}, "MyPlugin", action, [message]);
    },
};

});
接下来是java 端的处理代码,在execute()方法中获得js传递过来的json数据

public boolean execute(String action, JSONArray args,
			CallbackContext callbackContext) throws JSONException {
		// TODO Auto-generated method stub
		//System.out.println(action);
		Log.i(TAG,action);
		Log.i(TAG,args.toString());
		if("testAction".equals(action))
		{
			this.echo("testActiontSucccess",callbackContext);
			return true;
		}
		else if("notification".equals(action))
		{
			
//			获取Json 
		    String jsonstr = args.getString(0);
		    JSONObject jsonobj = new JSONObject(jsonstr);

		    String id = jsonobj.getString("id");
		    String data= jsonobj.getString("data");
		    createNotification(id,data);
			this.echo("notifiActionSuccess", callbackContext);
			return true;
		}
		return false;
	}
createNotification()即是在本地推送一个通知,代码如下

private void createNotification(String title, String content)
	{
//		创建推送对象
//		推送图标
		int icon=android.R.drawable.stat_notify_chat;
//		推送概要
		CharSequence tickerText ="通知";
//		图标,概要,事件
		Notification notification = new Notification(icon,tickerText,System.currentTimeMillis());

		
//		设置通知内容,上下文,通知标题,通知内容,点击通知后激活的intent
		Context context=cordova.getActivity().getApplicationContext(); 
		notification.setLatestEventInfo(context,title,content,null);

//		设置默认声音
		notification.defaults =Notification.DEFAULT_SOUND;
//		通知被点击后就取消
		notification.flags = Notification.FLAG_AUTO_CANCEL;
//		获得通知管理器
		NotificationManager manager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
//		推送,id,实体;
		manager.notify(100,notification);
		
	}





你可能感兴趣的:(phonegap,websocket)