Java Websocket实例【服务端与客户端实现全双工通讯】
现很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发
出HTTPrequest,然后由服务器返回最新的数据给客服端的浏览器。这种传统的HTTPrequest的模式带来很明显的缺点–浏
览器需要不断的向服务器发出请求,然而HTTPrequest的header是非常长的,里面包含的数据可能只是一个很小的值,这样会占
用很多的带宽。WebSocket提供了一个受欢迎的技术,以替代我们过去几年一直在用的Ajax技术。
一、什么是WebSocketAPI?
WebSocketAPI是下一代客户端-服务器的异步通信方法。该通信取代了单个的TCP套接字,使用ws或wss协议,可用于任意的
客户端和服务器程序。WebSocket目前由W3C进行标准化。WebSocket已经受到Firefox4、Chrome4、Opera10.70以及Safari5等
浏览器的支持。
WebSocketAPI最伟大之处在于服务器和客户端可以在给定的时间范围内的任意时刻,相互推送信息。WebSocket并不限于以
Ajax(或XHR)方式通信,因为Ajax技术需要客户端发起请求,而WebSocket服务器和客户端可以彼此相互推送信息;XHR受到域
的限制,而WebSocket允许跨域通信。
Ajax技术很聪明的一点是没有设计要使用的方式。WebSocket为指定目标创建,用于双向推送消息。
那么我就开始我在项目中对websocket的使用,首先使用的是J2EE7的架包。
架包加完之后,只需要再添加2个类就可以实现使用的功能了。
首先添加一个Java类,WebsocketController.java
packagecom.lwl.activemq.controller.websocket;
importjava.util.Map;
importjava.util.concurrent.ConcurrentHashMap;
importjavax.websocket.*;
importjavax.websocket.server.PathParam;
importjavax.websocket.server.ServerEndpoint;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
/**
*功能说明:websocket处理类,使用J2EE7的标准
*@authorAdministrator
*@create-8-11下午4:08:35
*@version1.0
*/
@ServerEndpoint("/websocket/{myWebsocket}")
publicclassWebsocketController{
privatestaticfinalLoggerlogger=LoggerFactory.getLogger(WebsocketController.class);
publicstaticMapclients=newConcurrentHashMap();
/**
*打开连接时触发
*@parammyWebsocket
*@paramsession
*/
@OnOpen
publicvoidonOpen(@PathParam("myWebsocket")StringmyWebsocket,Sessionsession){
logger.info("WebsocketStartConnecting:"+myWebsocket);
System.out.println("进入:"+myWebsocket);
clients.put(myWebsocket,session);
}
/**
*收到客户端消息时触发
*@parammyWebsocket
*@parammessage
*@return
*/
@OnMessage
publicStringonMessage(@PathParam("myWebsocket")StringmyWebsocket,Stringmessage){
return"Gotyourmessage("+message+").Thanks!";
}
/**
*异常时触发
*@parammyWebsocket
*@paramthrowable
*/
@OnError
publicvoidonError(@PathParam("myWebsocket")StringmyWebsocket,Throwablethrowable){
logger.info("WebsocketConnectionException:"+myWebsocket);
logger.info(throwable.getMessage(),throwable);
clients.remove(myWebsocket);
}
/**
*关闭连接时触发
*@parammyWebsocket
*/
@OnClose
publicvoidonClose(@PathParam("myWebsocket")StringmyWebsocket){
logger.info("WebsocketCloseConnection:"+myWebsocket);
clients.remove(myWebsocket);
}
/**
*将数据传回客户端
*异步的方式
*@parammyWebsocket
*@parammessage
*/
publicstaticvoidbroadcast(StringmyWebsocket,Stringmessage){
if(clients.containsKey(myWebsocket)){
clients.get(myWebsocket).getAsyncRemote().sendText(message);
}else{
thrownewNullPointerException("["+myWebsocket+"]Connectiondoesnotexist");
}
}
}
然后添加相应的接受页面index.html:
HTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""/TR/html4/loose.dtd">
//测试controller是否可以进入
//ajaxDo("/activemq-client/index",null);
//functionajaxDo(url,data){
//$.ajax({
//url:url,
//type:"post",
//dataType:"json",
//data:data,
//success:function(result){
//if(result.success){
//alert(result.data);
//}else{
//alert(result.msg);
//}
//}
//});
//}
//---------------------------------webSocket----------------------------------------------
initSocket("user");
initSocket("news");
initSocket("client");
functioninitSocket(myWebsocket){
varwebSocket=null;
window.οnbefοreunlοad=function(){
//离开页面时的其他操作
};
if(!window.WebSocket){
console("您的浏览器不支持websocket!");
returnfalse;
}
vartarget='ws://'+window.location.host+"/activemq-client/websocket/"+myWebsocket;
if('WebSocket'inwindow){
webSocket=newWebSocket(target);
}elseif('MozWebSocket'inwindow){
webSocket=newMozWebSocket(target);
}else{
alert('WebSocketisnotsupportedbythisbrowser.');
return;
}
//收到服务端消息
webSocket.onmessage=function(msg){
alert(msg.data);
//关闭连接
webSocket.onclose();
console.log(msg);
};
//异常
webSocket.οnerrοr=function(event){
console.log(event);
};
//建立连接
webSocket.onopen=function(event){
console.log(event);
};
//断线
webSocket.onclose=function(){
console.log("websocket断开连接");
};
}
好了,websocket已经实现了,现在最重要的是我们要在哪儿监听哪些变动,在推送给前端的问题了,这里我监听了MQ消息队
列中的某个Queen,如果获取到消息就推送给前端展示,稍后我会把MQ的消息队列也写给大家看,做个参考。(当然你也可以
监听属于你自己的对象,主要是调用WebsocketController.broadcast("client", jsonStr);第一个参数和前端的参数一
致,第二个参数是你想推送给前端的内容)。
packagecom.lwl.activemq.listener;
importjavax.jms.JMSException;
importjavax.jms.Message;
importjavax.jms.MessageListener;
importjavax.jms.TextMessage;
importorg.apache.log4j.Logger;
importorg.ponent;
importcom.alibaba.fastjson.JSON;
importcom.lwl.activemq.domain.Client;
importcom.lwl.activemq.controller.websocket.WebsocketController;
@Component("clientPushListener")
publicclassClientPushListenerimplementsMessageListener{
protectedstaticfinalLoggerlogger=Logger.getLogger(ClientPushListener.class);
@Override
publicvoidonMessage(Messagemessage){
logger.info("[ClientPushListener.onMessage]:beginonMessage.");
TextMessagetextMessage=(TextMessage)message;
try{
StringjsonStr=textMessage.getText();
logger.info("[ClientPushListener.onMessage]:receivemessageis,"+jsonStr);
if(jsonStr!=null){
Clientinfo=JSON.parseObject(jsonStr,Client.class);
System.out.println("==============================接受到的客户信息开始====================================");
System.out.println(info.toString());
System.out.println("==============================接受到的客户信息结束====================================");
WebsocketController.broadcast("client",jsonStr);
}
}catch(JMSExceptione){
logger.error("[ClientPushListener.onMessage]:receivemessageoccuredanexception",e);
}
logger.info("[ClientPushListener.onMessage]:endonMessage.");
}
}
转自:
/article/p-ubrvjrnv-bad.html
如果觉得《java socket 全双工客户端_Java Websocket实例【服务端与客户端实现全双工通讯】》对你有帮助,请点赞、收藏,并留下你的观点哦!