基于spring实现websocket实时推送实例

网友投稿 262 2023-02-10


基于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版本保持一致

第二步:编写消息处理器

/**

* Project Name:springRabbitMQ

* File Name:MyMessageHandler.java

* Package Name:com.zsy.websocket

* Date:2018年1月31日上午11:10:03

* Copyright (c) 2018, zhaoshouyun All Rights Reserved.

*

*/

package com.zsy.websocket;

import java.io.IOException;

import java.util.Map;

import java.util.Set;

import java.util.concurrent.ConcurrentHashMap;

import org.apache.commons.lang3.StringUtils;

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;

/**

* ClassName: MyMessageHandler

* Function: 实现webscoket接口

* date: 2018年1月31日 上午11:10:03

* @author zhaoshouyun

* @version

* @since JDK 1.7

*/

public class MyMessageHandler implements WebSocketHandler {

//用户key

public static final String USER_KEY = "current_user";

/**

* userMap:存储用户连接webscoket信息

* @since JDK 1.7

*/

private final static Map userMap;

static {

userMap = new ConcurrentHashMap(30);

}

/**

* 关闭websocket时调用该方法

* @see org.springframework.web.socket.WebSocketHandler#afterConnectionClosed(org.springframework.web.socket.WebSocketSession, org.springframework.web.socket.CloseStatus)

*/

@Override

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

String userId = this.getUserId(session);

if(StringUtils.isNoneBlank(userId)){

userMap.remove(userId);

System.err.println("该" + userId +"用户已成功关闭");

}else{

System.err.println("关闭时,获取用户id为空");

}

}

/**

* 建立websocket连接时调用该方法

* @see org.http://springframework.web.socket.WebSocketHandler#afterConnectionEstablished(org.springframework.web.socket.WebSocketSession)

*/

@Override

public void afterConnectionEstablished(WebSocketSession session) throws Exception {

String userId = this.getUserId(session);

if(StringUtils.isNoneBlank(userId)){

userMap.put(userId, session);

session.sendMessage(new TextMessage("建立WebSocket连接成功!"));

}

}

/**

* 客户端调用websocket.send时候,会调用该方法,进行数据通信

* @see org.springframework.web.socket.WebSocketHandler#handleMessage(org.springframework.web.socket.WebSocketSession,http:// org.springframework.web.socket.WebSocketMessage)

*/

@Override

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

String msg = message.toString();

String userId = this.getUserId(session);

System.err.println("该"+userId+"用户发送的消息是:"+msg);

message = new TextMessage("服务端已经接收到消息,msg="+msg);

session.sendMessage(message);

}

/**

* 传输过程出现异常时,调用该方法

* @see org.springframework.web.socket.WebSocketHandler#handleTransportError(org.springframework.web.socket.WebSocketSession, java.lang.Throwable)

*/

@Override

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

WebSocketMessage message = new TextMessage("异常信息:"+e.getMessage());

session.sendMessage(message);

}

/**

*

* @see org.springframework.web.socket.WebSocketHandler#supportsPartialMessages()

*/

@Override

public boolean supportsPartialMessages() {

return false;

}

/**

* sendMessageToUser:发给指定用户

* @author zhaoshouyun

* @param userId

* @param contents

* @since JDK 1.7

*/

public void sendMessageToUser(String userId,String contents) {

WebSocketSession session = userMap.get(userId);

if(session !=null && session.isOpen()) {

try {

TextMessage message = new TextMessage(contents);

session.sendMessage(message);

} catch (IOException e) {

e.printStackTrace();

}

}

}

/**

* sendMessageToAllUsers:发给所有的用户

* @author zhaoshouyun

* @param contents

* @since JDK 1.7

*/

public void sendMessageToAllUsers(String contents) {

Set userIds = userMap.keySet();

for(String userId: userIds) {

this.sendMessageToUser(userId, contents);

}

}

/**

* getUserId:获取用户id

* @author zhaoshouyun

* @param session

* @return

* @since JDK 1.7

*/

private String getUserId(WebSocketSession session){

try {

String userId = (String)session.getAttributes().get(USER_KEY);

return userId;

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

}

第三步:编写websocket相关配置,当然可以在xml配置;我现在没有使用xml配置,使用代码配置,需要在xml里添加扫描包

/**

* Project Name:springRabbitMQ

* File Name:WebSocketConfig.java

* Package Name:com.zsy.websocket

* Date:2018年1月31日下午1:10:33

* Copyright (c) 2018, zhaoshouyun All Rights Reserved.

*

*/

/**

* Project Name:springRabbitMQ

* File Name:WebSocketConfig.java

* Package Name:com.zsy.websocket

* Date:2018年1月31日下午1:10:33

* Copyright (c) 2018, zhaoshouyun All Rights Reserved.

*

*/

package com.zsy.websocket;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.web.socket.WebSocketHandler;

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

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

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

/**

* ClassName: WebSocketConfig

* Function: TODO ADD FUNCTION.

* date: 2018年1月31日 下午1:10:33

* @author zhaoshouyun

* @version

* @since JDK 1.7

*/

@Configuration

@EnableWebSocket

public class WebSocketConfig implements WebSocketConfigurer {

/**

* 注册handle

* @see org.springframework.web.socket.config.annotation.WebSocketConfigurer#registerWebSocketHandlers(org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry)

*/

@Override

public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {

registry.addHandler(myHandler(), "/testHandler").addInterceptors(new WebSocketInterceptor());

registry.addHandler(myHandler(), "/socketjs/testHandler").addInterceptors(new WebSocketInterceptor()).withSockJS();

}

@Bean

public WebSocketHandler myHandler(){

return new MyMessageHandler();

}

}

第四步:编写websocket适配器

package com.zsy.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.support.HttpSessionHandshakeInterceptor;

/**

* ClassName: WebSocketInterceptor

* Function: TODO ADD FUNCTION.

* date: 2018年1月31日 上午11:42:34

* @author zhaoshouyun

* @version

* @since JDK 1.7

*/

public class WebSocketInterceptor extends HttpSessionHandshakeInterceptor {

/**

* TODO 简单描述该方法的实现功能(可选).

* @see org.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)

*/

@Overhttp://ride

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

Map attributes) throws Exception {

if(request instanceof ServletServerHttpRequest){

ServletServerHttpRequest serverHttpRequest = (ServletServerHttpRequest)request;

//获取参数

String userId = serverHttpRequest .getServletRequest().getParameter("userId");

attributes.put(MyMessageHandler.USER_KEY, userId);

}

return true;

}

}

第五步对应的js:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"

pageEncoding="ISO-8859-1"%>

第六步测试:

package com.zsy.test.controller;

import java.util.HashMap;

import java.util.Map;

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

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

import org.springframework.stereotype.Controller;

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

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

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

import com.zsy.websocket.MyMessageHandler;

/**

* ClassName: TestController

* Function: TODO ADD FUNCTION.

* date: 2017年12月14日 上午11:11:23

* @author zhaoshouyun

* @version

* @since JDK 1.7

*/

@Controller

public class TestController {

@Autowired

MyMessageHandler handler;

@RequestMapping("/get")

public String get(){

return "index";

}

@ResponseBody

@RequestMapping("/get1")

public String send(String name){

handler.sendMessageToUser("zhaoshouyun", "服务端发送的内容:"+name);

return "success";

}

}


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

上一篇:Java实现RSA算法的方法详解
下一篇:java中Properties文件加载和使用方法
相关文章

 发表评论

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