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
- Phonegap+WebSocket 实现推送功能
- 【反ajax】webSocket实现实时推送功能
- 【反ajax】webSocket实现实时推送功能
- resin4.0.44+websocket 实现私信功能服务端消息推送
- 基于spring websocket实现广播及点对点推送功能
- 安卓用websocket实现推送
- swoole实现websocket推送
- swoole实现websocket推送
- Andriod Phonegap实现系统推送
- phonegap push-消息推送实现
- 在CentOS7 上安装mosquitto1.4.1服务器,实现MQTT信息推送功能并增加websocket功能
- 在CentOS7 上安装mosquitto1.4.1服务器,实现MQTT信息推送功能并增加websocket功能
- 在CentOS7 上安装mosquitto1.4.1服务器,实现MQTT信息推送功能并增加websocket功能
- websocket实现android消息推送
- websocket实现android消息推送
- Android WebSocket实现即时通讯/推送
- Spring WebSocket实现消息推送
- WebSocket实现android消息推送
- IOS开发---C语言-②交换a、b的值
- OC基础总结
- windows7 安装IE 11,开启仿真模式
- 线索链表遇到的一点小问题
- e盘根目录出现个Msdia80.dll怎么办?
- Phonegap+WebSocket 实现推送功能
- 深入浅出linux-什么是驱动(7)
- JAVA集合类——难得的总结
- POST与GET的区别
- 拖放事件
- 电话拦截
- 斯坦福 机器学习Andrew NG 第一讲 Linear regression with one variable
- C# MVC4.0(6)---请求中取出参数
- ConcurrentHashMap原理分析