SpringMVC整合websocket实现消息推送及触发功能

网友投稿 458 2023-02-10


SpringMVC整合websocket实现消息推送及触发功能

本文为大家分享了SpringMVC整合websocket实现消息推送,供大家参考,具体内容如下

1.创建websocket握手协议的后台

(1)HandShake的实现类

/**

*Project Name: price

*File Name: HandShake.java

*Package Name: com.yun.websocket

*Date: 2016年9月3日 下午4:44:27

*Copyright (c) 2016,578888218@qq.com All Rights Reserved.

*/

package com.yun.websocket;

import java.util.Map;

import org.springframework.http.server.ServerHttpRequest;

import org.springframework.http.server.ServerHttpResponse;

import org.springframework.http.server.ServletServerHttpRequest;

import org.springframework.web.socket.WebSocketHandler;

import org.springframework.web.socket.server.HandshakeInterceptor;

/**

*Title: HandShake

*Description:

*@Company: 青岛励图高科

*@author: 刘云生

*@version: v1.0

*@since: JDK 1.7.0_80

*@Date: 2016年9月3日 下午4:44:27

*/

public class HandShake implements HandshakeInterceptor{

@Override

public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,

Map attributes) throws Exception {

// TODO Auto-generated method stub

String jspCode = ((ServletServerHttpRequest) request).getServletRequest().getParameter("jspCode");

// 标记用户

//String userId = (String) session.getAttribute("userId");

if(jspCode!=null){

attributes.put("jspCode", jspCode);

}else{

return false;

}

return true;

}

@Override

public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,

Exception exception) {

// TODO Auto-generated method stub

}

}

(2)MyWebSocketConfig的实现类

/**

*Project Name: price

*File Name: MyWebSocketConfig.java

*Package Name: com.yun.websocket

*Date: 2016年9月3日 下午4:52:29

*Copyright (c) 2016,578888218@qq.com All Rights Reserved.

*/

package com.yun.websocket;

import javax.annotation.Resource;

import org.springframework.stereotype.Component;

import org.springframework.web.servlet.config.annotation.EnableWebMvc;

import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import org.springframework.web.socket.config.annotation.EnableWebSocket;

import org.springframework.web.socket.config.annotation.WebSocketConfigurer;

import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;

/**

*Title: MyWebSocketConfig

*Description:

*@Company: 青岛励图高科

*@author: 刘云生

*@version: v1.0

*@since: JDK 1.7.0_80

*@Date: 2016年9月3日 下午4:52:29

*/

@Component

@EnableWebMvc

@EnableWebSocket

public class MyWebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer{

@Resource

MyWebSocketHandler handler;

@Override

public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {

// TODO Auto-generated method stub

registry.addHandler(handler, "/wsMy").addInterceptors(new HandShake());

registry.addHandler(handler, "/wsMy/sockjs").addInterceptors(new HandShake()).withSockJS();

}

}

(3)MyWebSocketHandler的实现类

/**

*Project Name: price

*File Name: MyWebSocketHandler.java

*Package Name: com.yun.websocket

*Date: 2016年9月3日 下午4:55:12

*Copyright (c) 2016,578888218@qq.com All Rights Reserved.

*/

package com.yun.websocket;

import java.io.IOException;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import java.util.Map.Entry;

import org.springframework.stereotype.Component;

import org.springframework.web.socket.CloseStatus;

import org.springframework.web.socket.TextMessage;

import org.springframework.web.socket.WebSocketHandler;

import org.springframework.web.socket.WebSocketMessage;

import org.springframework.web.socket.WebSocketSession;

import com.google.gson.GsonBuilder;

/**

*Title: MyWebSocketHandler

*Description:

*@Company: 青岛励图高科

*@author: 刘云生

*@version: v1.0

*@since: JDK 1.7.0_80

*@Date: 2016年9月3日 下午4:55:12

*/

@Component

public class MyWebSocketHandler implements WebSocketHandler{

public static final Map userSocketSessionMap;

static {

userSocketSessionMap = new HashMap();

}

@Override

public void afterConnectionEstablished(WebSocketSession session) throws Exception {

// TODO Auto-generated method stub

String jspCode = (String) session.getHandshakeAttributes().get("jspCode");

if (userSocketSessionMap.get(jspCode) == null) {

userSocketSessionMap.put(jspCode, session);

}

for(int i=0;i<10;i++){

//broadcast(new TextMessage(new GsonBuilder().create().toJson("\"number\":\""+i+"\"")));

session.sendMessage(new TextMessage(new GsonBuilder().create().toJson("\"number\":\""+i+"\"")));

}

}

@Override

public void handleMessage(WebSocketSession session, WebSocketMessage> message) throws Exception {

// TODO Auto-generated method stub

//Message msg=new Gson().fromJson(message.getPayload().toString(),Message.class);

//msg.setDate(new Date());

// sendMessageToUser(msg.getTo(), new TextMessage(new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create().toJson(msg)));

session.sendMessage(message);

}

@Override

public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {

// TODO Auto-generated method stub

if (session.isOpen()) {

session.close();

}

Iterator> it = userSocketSessionMap

.entrySet().iterator();

// 移除Socket会话

while (it.hasNext()) {

Entry enCjPgptry = it.next();

if (entry.getValue().getId().equals(session.getId())) {

userSocketSessionMap.remove(entry.getKey());

System.out.println("Socket会话已经移除:用户ID" + entry.getKey());

break;

}

}

}

@Override

public void afterConnectionClosed(WebSocketSession session, CloseStatus cCjPgploseStatus) throws Exception {

// TODO Auto-generated method stub

System.out.println("Websocket:" + session.getId() + "已经关闭");

Iterator> it = userSocketSessionMap

.entrySet().iterator();

// 移除Socket会话

while (it.hasNext()) {

Entry entry = it.next();

if (entry.getValue().getId().equals(session.getId())) {

userSocketSessionMap.remove(entry.getKey());

System.out.println("Socket会话已经移除:用户ID" + entry.getKey());

break;

}

}

}

@Override

public boolean supportsPartialMessages() {

// TODO Auto-generated method stub

return false;

}

/**

* 群发

* @Title: broadcast

* @Description: TODO

* @param: @param message

* @param: @throws IOException

* @return: void

* @author: 刘云生

* @Date: 2016年9月10日 下午4:23:30

* @throws

*/

public void broadcast(final TextMessage message) throws IOException {

Iterator> it = userSocketSessioCjPgpnMap

.entrySet().iterator();

// 多线程群发

while (it.hasNext()) {

final Entry entry = it.next();

if (entry.getValue().isOpen()) {

new Thread(new Runnable() {

public void run() {

try {

if (entry.getValue().isOpen()) {

entry.getValue().sendMessage(message);

}

} catch (IOException e) {

e.printStackTrace();

}

}

}).start();

}

}

}

/**

* 给所有在线用户的实时工程检测页面发送消息

*

* @param message

* @throws IOException

*/

public void sendMessageToJsp(final TextMessage message,String type) throws IOException {

Iterator> it = userSocketSessionMap

.entrySet().iterator();

// 多线程群发

while (it.hasNext()) {

final Entry entry = it.next();

if (entry.getValue().isOpen() && entry.getKey().contains(type)) {

new Thread(new Runnable() {

public void run() {

try {

if (entry.getValue().isOpen()) {

entry.getValue().sendMessage(message);

}

} catch (IOException e) {

e.printStackTrace();

}

}

}).start();

}

}

}

}

2.创建websocket握手处理的前台

3.通过Controller调用进行websocket的后台推送

/**

*Project Name: price

*File Name: GarlicPriceController.java

*Package Name: com.yun.price.garlic.controller

*Date: 2016年6月23日 下午3:23:46

*Copyright (c) 2016,578888218@qq.com All Rights Reserved.

*/

package com.yun.price.garlic.controller;

import java.io.IOException;

import java.util.Date;

import java.util.List;

import javax.annotation.Resource;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.ResponseBody;

import org.springframework.web.context.request.RequestContextHolder;

import org.springframework.web.context.request.ServletRequestAttributes;

import org.springframework.web.servlet.ModelAndView;

import org.springframework.web.socket.TextMessage;

import com.google.gson.GsonBuilder;

import com.yun.common.entity.DataGrid;

import com.yun.price.garlic.dao.entity.GarlicPrice;

import com.yun.price.garlic.model.GarlicPriceModel;

import com.yun.price.garlic.service.GarlicPriceService;

import com.yun.websocket.MyWebSocketHandler;

/**

* Title: GarlicPriceController

* Description:

*

* @Company: 青岛励图高科

* @author: 刘云生

* @version: v1.0

* @since: JDK 1.7.0_80

* @Date: 2016年6月23日 下午3:23:46

*/

@Controller

public class GarlicPriceController {

@Resource

MyWebSocketHandler myWebSocketHandler;

@RequestMapping(value = "GarlicPriceController/testWebSocket", method ={RequestMethod.POST,RequestMethod.GET}, produces = "application/json; charset=utf-8")

@ResponseBody

public String testWebSocket() throws IOException{

myWebSocketHandler.sendMessageToJsp(new TextMessage(new GsonBuilder().create().toJson("\"number\":\""+"GarlicPriceController/testWebSocket"+"\"")), "AAA");

return "1";

}

}

4.所用到的jar包

org.springframework

spring-websocket

4.0.1.RELEASE

5.运行的环境

至少tomcat8.0以上版本,否则可能报错


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:vue页面加载闪烁问题的解决方法
下一篇:Java新手环境搭建 Tomcat安装配置教程
相关文章

 发表评论

暂时没有评论,来抢沙发吧~