基于spring实现websocket实时推送实例
基于spring框架来写的,websocket实时推送例子,具体内容如下
第一步:自己搭建一个springmvc项目,很简单,网上百度都有;pom文件添加以下:
org.springframework spring-websocket 4.2.4.RELEASE org.springframework spring-messaging 4.2.4.RELEASE
我的spring版本是4.2.4的,所以websocket也是4.2.4的;websocket最好和spring版本保持一致
第二步:编写消息处理器
/** *ProjectName:springRabbitMQ *FileName:MyMessageHandler.java *PackageName:com.zsy.websocket *Date:2018年1月31日上午11:10:03 *Copyright(c)2018,zhaoshouyunAllRightsReserved. * */ packagecom.zsy.websocket; importjava.io.IOException; importjava.util.Map; importjava.util.Set; importjava.util.concurrent.ConcurrentHashMap; importorg.apache.commons.lang3.StringUtils; importorg.springframework.web.socket.CloseStatus; importorg.springframework.web.socket.TextMessage; importorg.springframework.web.socket.WebSocketHandler; importorg.springframework.web.socket.WebSocketMessage; importorg.springframework.web.socket.WebSocketSession; /** *ClassName:MyMessageHandler *Function:实现webscoket接口 *date:2018年1月31日上午11:10:03 *@authorzhaoshouyun *@version *@sinceJDK1.7 */ publicclassMyMessageHandlerimplementsWebSocketHandler{ //用户key publicstaticfinalStringUSER_KEY="current_user"; /** *userMap:存储用户连接webscoket信息 *@sinceJDK1.7 */ privatefinalstaticMapuserMap; static{ userMap=newConcurrentHashMap (30); } /** *关闭websocket时调用该方法 *@seeorg.springframework.web.socket.WebSocketHandler#afterConnectionClosed(org.springframework.web.socket.WebSocketSession,org.springframework.web.socket.CloseStatus) */ @Override publicvoidafterConnectionClosed(WebSocketSessionsession,CloseStatusstatus)throwsException{ StringuserId=this.getUserId(session); if(StringUtils.isNoneBlank(userId)){ userMap.remove(userId); System.err.println("该"+userId+"用户已成功关闭"); }else{ System.err.println("关闭时,获取用户id为空"); } } /** *建立websocket连接时调用该方法 *@seeorg.springframework.web.socket.WebSocketHandler#afterConnectionEstablished(org.springframework.web.socket.WebSocketSession) */ @Override publicvoidafterConnectionEstablished(WebSocketSessionsession)throwsException{ StringuserId=this.getUserId(session); if(StringUtils.isNoneBlank(userId)){ userMap.put(userId,session); session.sendMessage(newTextMessage("建立WebSocket连接成功!")); } } /** *客户端调用websocket.send时候,会调用该方法,进行数据通信 *@seeorg.springframework.web.socket.WebSocketHandler#handleMessage(org.springframework.web.socket.WebSocketSession,org.springframework.web.socket.WebSocketMessage) */ @Override publicvoidhandleMessage(WebSocketSessionsession,WebSocketMessage>message)throwsException{ Stringmsg=message.toString(); StringuserId=this.getUserId(session); System.err.println("该"+userId+"用户发送的消息是:"+msg); message=newTextMessage("服务端已经接收到消息,msg="+msg); session.sendMessage(message); } /** *传输过程出现异常时,调用该方法 *@seeorg.springframework.web.socket.WebSocketHandler#handleTransportError(org.springframework.web.socket.WebSocketSession,java.lang.Throwable) */ @Override publicvoidhandleTransportError(WebSocketSessionsession,Throwablee)throwsException{ WebSocketMessage message=newTextMessage("异常信息:"+e.getMessage()); session.sendMessage(message); } /** * *@seeorg.springframework.web.socket.WebSocketHandler#supportsPartialMessages() */ @Override publicbooleansupportsPartialMessages(){ returnfalse; } /** *sendMessageToUser:发给指定用户 *@authorzhaoshouyun *@paramuserId *@paramcontents *@sinceJDK1.7 */ publicvoidsendMessageToUser(StringuserId,Stringcontents){ WebSocketSessionsession=userMap.get(userId); if(session!=null&&session.isOpen()){ try{ TextMessagemessage=newTextMessage(contents); session.sendMessage(message); }catch(IOExceptione){ e.printStackTrace(); } } } /** *sendMessageToAllUsers:发给所有的用户 *@authorzhaoshouyun *@paramcontents *@sinceJDK1.7 */ publicvoidsendMessageToAllUsers(Stringcontents){ Set userIds=userMap.keySet(); for(StringuserId:userIds){ this.sendMessageToUser(userId,contents); } } /** *getUserId:获取用户id *@authorzhaoshouyun *@paramsession *@return *@sinceJDK1.7 */ privateStringgetUserId(WebSocketSessionsession){ try{ StringuserId=(String)session.getAttributes().get(USER_KEY); returnuserId; }catch(Exceptione){ e.printStackTrace(); } returnnull; } }
第三步:编写websocket相关配置,当然可以在xml配置;我现在没有使用xml配置,使用代码配置,需要在xml里添加扫描包
/** *ProjectName:springRabbitMQ *FileName:WebSocketConfig.java *PackageName:com.zsy.websocket *Date:2018年1月31日下午1:10:33 *Copyright(c)2018,zhaoshouyunAllRightsReserved. * */ /** *ProjectName:springRabbitMQ *FileName:WebSocketConfig.java *PackageName:com.zsy.websocket *Date:2018年1月31日下午1:10:33 *Copyright(c)2018,zhaoshouyunAllRightsReserved. * */ packagecom.zsy.websocket; importorg.springframework.context.annotation.Bean; importorg.springframework.context.annotation.Configuration; importorg.springframework.web.socket.WebSocketHandler; importorg.springframework.web.socket.config.annotation.EnableWebSocket; importorg.springframework.web.socket.config.annotation.WebSocketConfigurer; importorg.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; /** *ClassName:WebSocketConfig *Function:TODOADDFUNCTION. *date:2018年1月31日下午1:10:33 *@authorzhaoshouyun *@version *@sinceJDK1.7 */ @Configuration @EnableWebSocket publicclassWebSocketConfigimplementsWebSocketConfigurer{ /** *注册handle *@seeorg.springframework.web.socket.config.annotation.WebSocketConfigurer#registerWebSocketHandlers(org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry) */ @Override publicvoidregisterWebSocketHandlers(WebSocketHandlerRegistryregistry){ registry.addHandler(myHandler(),"/testHandler").addInterceptors(newWebSocketInterceptor()); registry.addHandler(myHandler(),"/socketJs/testHandler").addInterceptors(newWebSocketInterceptor()).withSockJS(); } @Bean publicWebSocketHandlermyHandler(){ returnnewMyMessageHandler(); } }
第四步:编写websocket适配器
packagecom.zsy.websocket; importjava.util.Map; importorg.springframework.http.server.ServerHttpRequest; importorg.springframework.http.server.ServerHttpResponse; importorg.springframework.http.server.ServletServerHttpRequest; importorg.springframework.web.socket.WebSocketHandler; importorg.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor; /** *ClassName:WebSocketInterceptor *Function:TODOADDFUNCTION. *date:2018年1月31日上午11:42:34 *@authorzhaoshouyun *@version *@sinceJDK1.7 */ publicclassWebSocketInterceptorextendsHttpSessionHandshakeInterceptor{ /** *TODO简单描述该方法的实现功能(可选). *@seeorg.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor#beforeHandshake(org.springframework.http.server.ServerHttpRequest,org.springframework.http.server.ServerHttpResponse,org.springframework.web.socket.WebSocketHandler,java.util.Map) */ @Override publicbooleanbeforeHandshake(ServerHttpRequestrequest,ServerHttpResponseresponse,WebSocketHandlerwsHandler, Mapattributes)throwsException{ if(requestinstanceofServletServerHttpRequest){ ServletServerHttpRequestserverHttpRequest=(ServletServerHttpRequest)request; //获取参数 StringuserId=serverHttpRequest.getServletRequest().getParameter("userId"); attributes.put(MyMessageHandler.USER_KEY,userId); } returntrue; } }
第五步对应的js:
<%@pagelanguage="java"contentType="text/html;charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>Inserttitlehere varwebsocket; //首先判断是否支持WebSocket if('WebSocket'inwindow){ websocket=newWebSocket("ws://localhost:8085/springTest/testHandler?userId=zhaoshouyun"); }elseif('MozWebSocket'inwindow){ websocket=newMozWebSocket("ws://localhost:8085/springTest/testHandler?userId=zhaoshouyun"); }else{ websocket=newSockJS("http://localhost:8085/springTest/socketJs/testHandler?userId=zhaoshouyun"); } //打开连接时 websocket.onopen=function(evnt){ console.log("websocket.onopen"); }; //收到消息时 websocket.onmessage=function(evnt){ alert(evnt.data); }; websocket.onerror=function(evnt){ console.log("websocket.onerror"); }; websocket.onclose=function(evnt){ console.log("websocket.onclose"); }; functionsay(){ //客户端主动发消息 websocket.send(document.getElementById('msg').value); }
第六步测试:
packagecom.zsy.test.controller; importjava.util.HashMap; importjava.util.Map; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.beans.factory.annotation.Value; importorg.springframework.stereotype.Controller; importorg.springframework.web.bind.annotation.RequestBody; importorg.springframework.web.bind.annotation.RequestMapping; importorg.springframework.web.bind.annotation.ResponseBody; importcom.zsy.websocket.MyMessageHandler; /** *ClassName:TestController *Function:TODOADDFUNCTION. *date:2017年12月14日上午11:11:23 *@authorzhaoshouyun *@version *@sinceJDK1.7 */ @Controller publicclassTestController{ @Autowired MyMessageHandlerhandler; @RequestMapping("/get") publicStringget(){ return"index"; } @ResponseBody @RequestMapping("/get1") publicStringsend(Stringname){ handler.sendMessageToUser("zhaoshouyun","服务端发送的内容:"+name); return"success"; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。