基于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{
WebSocketMessagemessage=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){
SetuserIds=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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。