Phonegap+WebSocket 实现推送功能

来源:互联网 发布:笔记本触摸屏关闭软件 编辑:程序博客网 时间:2024/06/05 08:20

有人问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<Session> peers = new HashSet<Session>();//因为会有多个线程访问HashSet ,而HashSet不是同步的,因此用Collections.synchronizedSet来使HashSet同步private static Set<Session> peers =  Collections.synchronizedSet(new HashSet<Session>());private Session session;//open方法的注解,当一个客户端连上来时触发,每个客户端会被分配一个session,这个session可不是httpsession.//open方法里有个参数user被加上了注解@PathParam(value = "user")String user,这个就是从url中获取user的方式@OnOpenpublic void open(Session session , @PathParam(value="user") String user){this.session = session;//存储这个新sessionpeers.add(session);System.out.println("WebSocketServerDemo open from sessionId:"+this.session.getId());}//收到客户端发送的消息时触发@OnMessagepublic void inMessage(String message){System.out.println("WebSocketServerDemo inmessage from sessionId:"+this.session.getId()+    ":"+message);}//客户端断开时触发@OnClosepublic void end(){//从session集合中删除关闭连接的sessionpeers.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 blocke.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());//设置通知内容,上下文,通知标题,通知内容,点击通知后激活的intentContext 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);}





0 0
原创粉丝点击