ssm 整合websocket

前段时间写了个一对一实时聊天,且将数据保存到数据库,所以需将websocket与ssm整合,方便使用注解。

1、pom.xml中添加需要的jar文件

		<dependency>
			<groupId>javax.websocket</groupId>
			<artifactId>javax.websocket-api</artifactId>
			<version>1.0</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-websocket</artifactId>
			<version>4.1.4.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-messaging</artifactId>
			<version>4.0.5.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>com.google.code.gson</groupId>
			<artifactId>gson</artifactId>
			<version>2.3.1</version>
		</dependency>

2、创建拦截器类

public class MyHandShakeInterceptor implements HandshakeInterceptor {

	public boolean beforeHandshake(ServerHttpRequest serverHttpRequest,
			ServerHttpResponse serverHttpResponse,
			WebSocketHandler webSocketHandler, Map<String, Object> map)
			throws Exception {
		if (serverHttpRequest instanceof ServletServerHttpRequest) {
			ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) serverHttpRequest;
			HttpSession session = servletRequest.getServletRequest()
					.getSession(false);
			// 获取登录时保存到session中的用户信息
			UserInfo userInfo = (UserInfo) session.getAttribute("userInfo");
			if (userInfo != null) {
				map.put("userId", userInfo.getId());//为服务器创建WebSocketSession做准备
			} else {
				return false;
			}
		}
		return true;
	}

	public void afterHandshake(ServerHttpRequest serverHttpRequest,
			ServerHttpResponse serverHttpResponse,
			WebSocketHandler webSocketHandler, Exception e) {

	}
}

3、创建WebSocketMap工具类

public class WebSocketMapService {
	public static final ConcurrentMap<Integer, WebSocketSession> webSocketSessionMap;
	static {
		webSocketSessionMap = new ConcurrentHashMap<Integer, WebSocketSession>();
	}

	public static void put(Integer key, WebSocketSession myWebSocket) {
		webSocketSessionMap.put(key, myWebSocket);
	}

	public static WebSocketSession get(Integer key) {
		return webSocketSessionMap.get(key);
	}

	public static void remove(Integer key) {
		webSocketSessionMap.remove(key);
	}

	public static Collection<WebSocketSession> getValues() {
		return webSocketSessionMap.values();
	}

	public static Set<Entry<Integer, WebSocketSession>> entrySet() {
		return webSocketSessionMap.entrySet();
	}
}

4、创建websocket处理类

@Component
public class MyWebSocketHandler implements WebSocketHandler {

	@Autowired
	private MessageInfoService messageInfoService;

	//握手实现连接后
	public void afterConnectionEstablished(WebSocketSession webSocketSession)
			throws Exception {
		int userId = (Integer) webSocketSession.getAttributes().get("userId");
		if (WebSocketMapService.get(userId) == null) {
			WebSocketMapService.put(userId, webSocketSession);
		}
	}

	//发送信息前的处理
	public void handleMessage(WebSocketSession webSocketSession,
			WebSocketMessage<?> webSocketMessage) throws Exception {

		if (webSocketMessage.getPayloadLength() == 0)
			return;
		//获取Socket通道中的数据
		JSONObject object = JSONObject
				.parseObject(webSocketMessage.getPayload().toString());
		MessageInfo messageInfo = new MessageInfo();
		//...
		//将信息保存至数据库
		messageInfoService.insertMessage(messageInfo);
		// 给自己发送消息
		sendMessageToUser(messageInfo.getSenduserid(),
				new TextMessage(
						new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss")
								.create().toJson(messageInfo)));
		// 给对方发送消息
		sendMessageToUser(messageInfo.getReuserid(),
				new TextMessage(
						new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss")
								.create().toJson(messageInfo)));
	}

	public void handleTransportError(WebSocketSession webSocketSession,
			Throwable throwable) throws Exception {

	}

	public void afterConnectionClosed(WebSocketSession webSocketSession,
			CloseStatus closeStatus) throws Exception {
		//断开连接即将此用户对应的WebSocketSession移除,以便再次连接时添加新的WebSocketSession
		Iterator<Map.Entry<Integer, WebSocketSession>> iterator = WebSocketMapService
				.entrySet().iterator();
		while (iterator.hasNext()) {
			Map.Entry<Integer, WebSocketSession> entry = iterator.next();
			if (entry.getValue().getAttributes()
					.get("userId") == webSocketSession.getAttributes()
							.get("userId")) {
				WebSocketMapService.remove((Integer) webSocketSession
						.getAttributes().get("userId"));
			}
		}
	}

	public boolean supportsPartialMessages() {
		return false;
	}

	//发送信息的实现
	public void sendMessageToUser(Integer userId, TextMessage message)
			throws IOException {
		WebSocketSession session = WebSocketMapService.get(userId);
		if (session != null && session.isOpen()) {
			session.sendMessage(message);
		}
	}
}

5、创建配置类 (也可使用配置文件)

@Component
@EnableWebSocket
public class MyWebSocketConfig extends WebMvcConfigurerAdapter
		implements WebSocketConfigurer {

	@Autowired
	MyWebSocketHandler handler;

	public void registerWebSocketHandlers(
			WebSocketHandlerRegistry webSocketHandlerRegistry) {

		//添加websocket处理器,添加握手拦截器
		webSocketHandlerRegistry.addHandler(handler, "/ws")
				.addInterceptors(new MyHandShakeInterceptor());

		//添加websocket处理器,添加握手拦截器
		webSocketHandlerRegistry.addHandler(handler, "/ws/sockjs")
				.addInterceptors(new MyHandShakeInterceptor()).withSockJS();
	}
}

6、添加前端(客户端)连接(主要代码)

<script src="../../assets/js/plugins/sockjs/sockjs.js"></script>
        var wsServer = null;
		var ws = null;
		wsServer = "ws://ip:端口/项目名/ws";
		ws = new WebSocket(wsServer); //创建WebSocket对象
		ws.onopen = function(evt) {
			layer.msg("已经建立连接", {
				offset : 0
			});
		};
		ws.onmessage = function(evt) {
			var message = JSON.parse(evt.data);//将数据解析成JSON形式
			showMess(message);//展示消息
		};
		ws.onerror = function(evt) {
			layer.msg("产生异常", {
				offset : 0
			});
		};
		ws.onclose = function(evt) {
			layer.msg("已经关闭连接", {
				offset : 0
			});
		};
...
//发送消息
var data = {};//新建data对象,并规定属性名与相应的值
ws.send(JSON.stringify(data));//将对象封装成JSON后发送至服务器










  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值