springMVC整合websocket实践

本文探讨了如何在Spring MVC框架中利用WebSocket技术实现客户端与服务器之间的实时通信,包括客户端如何验证WebSocket协议支持,建立连接,接收和发送消息,以及服务器端如何处理接收到的WebSocket消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

websocket 是html5新规范,现在主流浏览器(ie 10+)均支持。最近用了一下,总结下。

总体思路使用spring mvc做路由。dispatchservlet是支持 http与websocket协议的。只是在处理上用的handle不同。

client:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>WebSoket Demo</title>
<script type="text/javascript">
	//验证浏览器是否支持WebSocket协议
	if (!window.WebSocket) {
		alert("WebSocket not supported by this browser!");
	}
	var ws;
	function display() {
		//var valueLabel = document.getElementById("valueLabel"); 
		//valueLabel.innerHTML = ""; 
		ws = new WebSocket("ws://" + document.location.host + "/myHandler.do");
		//监听消息
		ws.onmessage = function(event) {
			log(event.data);
		};
		// 打开WebSocket 
		ws.onclose = function(event) {
			//WebSocket Status:: Socket Closed
		};
		// 打开WebSocket
		ws.onopen = function(event) {
			//WebSocket Status:: Socket Open
			//// 发送一个初始化消息
			ws.send("Hello, Server!");
		};
		ws.onerror = function(event) {
			//WebSocket Status:: Error was reported
		};
	}
	var log = function(s) {
		if (document.readyState !== "complete") {
			log.buffer.push(s);
		} else {
			document.getElementById("contentId").innerHTML += (s + "\n");
		}
	}
	function sendMsg() {
		var msg = document.getElementById("messageId");
		//alert(msg.value);
		ws.send(msg.value);
	}
</script>
</head>
<body onload="display();">
	<div id="valueLabel"></div>
	<textarea rows="20" cols="30" id="contentId"></textarea>
	<br />
	<input name="message" id="messageId" />
	<button id="sendButton" onClick="javascript:sendMsg()">Send</button>
</body>
</html>

server :

用于处理收到的websocket消息,

TextWebSocketHandler只处理文本消息

package nms.client.web;

import java.io.IOException;

import nms.server.alarm.status.AlarmRefreshStatus;
import nms.server.common.JsonHelper;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;

public class MyHandler extends TextWebSocketHandler {
	/**
	 * Logger for this class
	 */
	private static final Log LOGGER = LogFactory.getLog(MyHandler.class);

	@Override
	public void handleTextMessage(WebSocketSession session, TextMessage message) throws IOException {
//简单返回收到的消息
		session.sendMessage(message);
		
	}
}


配置路由,注册handle类。是否加.do看dispatchserverlet类拦截的消息名称后缀,如果有就加。我的是拦截.do。

package nms.client.web;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
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;

@Configuration
@EnableWebMvc
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

	@Override
	public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
		registry.addHandler(myHandler(), "/myHandler.do");
	}

	@Bean
	public WebSocketHandler myHandler() {
		return new MyHandler();
	}

}

运行是这样子的:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值