有人问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);
/*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);
}
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);
}