这几天项目中需要整合websocket来支持业务,从网上看了好多资料。但是都很杂乱,我尝试了好多回,走了很多弯路,跳了很多坑~~~~~~。通过两天的调试终于成功!!!现在把调试步骤和容易出现的问题都列出来,让和我这样的新手有点帮助。开始上代码.........
【备注:spring的版本4.0+ ,tomcat :7.50 + , jdk:1.8】
java Spring 整合 websocket 有两种方法 :
1:配置方法 [网上有很多]
(地址:http://blog.csdn.net/stickallthetime/article/details/44587413 这位大哥写的很详细)
2:注解方法 [推荐使用这种方法,简洁。我用的就是这种方法]
第一步:pom文件添加jar包
<!-- WEB SOCKET API -->
<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>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-messaging</artifactId>
<version>${spring.version}</version>
</dependency>
第二步:添加 websocket 配置
@Configuration
@EnableWebMvc
@EnableWebSocket
public class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer{
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
System.out.println("......注册......");
//这个类的标红的代码 解释 问题2
//配置webSocket路径
registry.addHandler(systemWebSocketHandler(),"/websocket").addInterceptors(new MyHandshakeInterceptor()).setAllowedOrigins("*");
//配置webSocket路径 支持前端使用socketJs
registry.addHandler(systemWebSocketHandler(), "/sockjs/websocket").setAllowedOrigins("*").addInterceptors(new MyHandshakeInterceptor()).withSockJS();
}
@Bean
public WebSocketHandler systemWebSocketHandler(){
System.out.println("......创建WebSocketHandler......");
return new SystemWebSocketHandler();
}
}
public class MyHandshakeInterceptor extends HttpSessionHandshakeInterceptor{
@Override
public boolean beforeHandshake(ServerHttpRequest request,
ServerHttpResponse response, WebSocketHandler wsHandler,
Map<String, Object> attributes) throws Exception {
logger.info("Before Handshake");
//获得 session 和request对象(解释问题3)
ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;
//获得session
// HttpSession session = servletRequest.getServletRequest().getSession(false);
//获得httpServletRequest
HttpServletRequest httpRequest = servletRequest.getServletRequest();
return super.beforeHandshake(request, response, wsHandler, attributes);
}
@Override
public void afterHandshake(ServerHttpRequest request,
ServerHttpResponse response, WebSocketHandler wsHandler,
Exception ex) {
logger.info("After Handshake");
super.afterHandshake(request, response, wsHandler, ex);
}
}
public class SystemWebSocketHandler implements WebSocketHandler {
public SystemWebSocketHandler(){}
private static final ArrayList<WebSocketSession> users = new ArrayList<WebSocketSession>();
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
System.out.println("......连接之后After......"+"ConnectionEstablished");
System.out.println("getId:" + session.getId());
System.out.println("getLocalAddress:" + session.getLocalAddress().toString());
System.out.println("getUri:" + session.getUri().toString());
System.out.println("getPrincipal:" + session.getPrincipal());
//连接进来的用户添加到用户集合中方便以后发送消息
users.add(session);
session.sendMessage(new TextMessage("你好: webSocket connect 成功!!!"));
}
@Override
public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
System.out.println("发送信息" + message.toString()+" .session. "+session.getId());
session.sendMessage(new TextMessage(message.getPayload()+"---"+ReportUtils.long2DateString(System.currentTimeMillis(), ReportUtils.FORMAT_DATE_TIME) + ""));
}
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
if(session.isOpen()){
session.close();
}
users.remove(session);
System.out.println("异常出现handleTransportError" + exception.getMessage());
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
users.remove(session);
System.out.println("关闭afterConnectionClosed" + closeStatus.getReason());
}
@Override
public boolean supportsPartialMessages() {
return false;
}
/**
* 给所有在线用户发送消息
*
* @param message
*/
public void sendMessageToUsers(TextMessage message) {
for (WebSocketSession user : users) {
try {
if (user.isOpen()) {
user.sendMessage(message);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 给指定用户发消息
* @param username
* @param message
*/
public void sendMessageToUser(String username,TextMessage message) {
for (WebSocketSession user : users) {
if (user.getAttributes().get("username").equals(username)) {
try {
if (user.isOpen()) {
user.sendMessage(message);
}
} catch (IOException e) {
e.printStackTrace();
}
break;
}
}
}
}
第三步:页面clinet
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>My WebSocket</title>
</head>
<body>
Welcome<br/>
<input id="text" type="text" /><button onclick="send()">Send</button> <button onclick="closeWebSocket()">Close</button>
<div id="message">
</div>
</body>
<script type="text/javascript">
var websocket = null;
//判断当前浏览器是否支持WebSocket
if('WebSocket' in window){
// 路径+端口号 项目名 webSocket路径
var wsPath = window.location.host + "/ipos-mobile/websocket";
var param = "?token=123&aid=a2s2";
console.info(wsPath + param);
websocket = new WebSocket("ws://"+wsPath+param);
}
else{
alert('Not support websocket')
}
//连接发生错误的回调方法
websocket.onerror = function(){
setMessageInnerHTML("error");
};
//连接成功建立的回调方法
websocket.onopen = function(event){
setMessageInnerHTML("页面clinet打开websocket连接-----open");
}
//接收到消息的回调方法
websocket.onmessage = function(){
setMessageInnerHTML(event.data);
}
//连接关闭的回调方法
websocket.onclose = function(){
setMessageInnerHTML("页面clinet关闭websocket连接-----close");
}
//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
window.onbeforeunload = function(){
websocket.close();
}
//将消息显示在网页上
function setMessageInnerHTML(innerHTML){
document.getElementById('message').innerHTML += innerHTML + '<br/>';
}
//关闭连接
function closeWebSocket(){
websocket.close();
}
//发送消息
function send(){
var message = document.getElementById('text').value;
websocket.send(message);
}
</script>
</html>
到此websocket 已经配置完成。搭建过程中出现很多问题,下面把我遇到的问题公布一下:
问题1:
页面client 连接 websocket 的时候经常出现的问题
404:路径错误,仔细看一下。
403:先看一下路径,要是路径没问题,那看看你的项目中的filter 是不是把websocket的路劲拦截了。
400:后台肯定是报错啦,看一下什么问题,解决一下就好了。
【这三个4开头的问题大部分都是和 webSocket的路径被拦截有关系 仔细看一下filtere】
问题2:
你的项目已经跑通了,在本机也能运行起来了,但是局域网不能访问(就是localhost 能访问,但是ip地址就访问不了)
答案在 【第二步 webSocket 配置有解释 移步】
问题3:
怎么在webSocket中获得session 或者是httpServletRequest 答案在【第二步 websocket配置解释 移步】
相关推荐
1. **Spring WebSocket集成**:在Spring Boot项目中,可以通过添加`spring-boot-starter-websocket`依赖来启用WebSocket支持。然后,在配置类中配置WebSocket消息代理,包括设置STOMP(简单消息传输协议)作为消息...
Spring框架,作为Java企业级应用开发的主流框架,也提供了对WebSocket的支持,使得开发者可以方便地在Spring应用中集成WebSocket功能。本资源包"spring整合websocket完整代码"包含了实现这一整合所需的全部代码,...
在本文中,我们将深入探讨如何使用Spring Cloud Gateway实现网关转发功能,并整合WebSocket源码,以便在微服务架构中提供高效、灵活的数据通信。首先,让我们先了解一下Spring Cloud Gateway及其重要性。 Spring ...
Spring WebSocket 4.1.6 是Spring框架对WebSocket技术的集成和支持,为开发者提供了丰富的功能和易用的API,使得在Java应用中实现WebSocket变得轻而易举。 一、Spring WebSocket概述 Spring WebSocket 是Spring ...
此次主要了解,整合的是spring websocket。在最开始的时候,碰到挺多问题的,不是连接错误就是一直连接不成功。整的我的小心脏都受不了,蛋疼。百度,谷歌一大堆demo,整到工程里能跑起来,但是就是连接不成功,放弃...
整合SpringBoot、SpringSecurity和WebSocket的过程包括以下几个步骤: 1. 配置SpringBoot:创建SpringBoot项目,引入WebSocket和SpringSecurity的相关依赖。 2. 配置WebSocket:实现WebSocket服务器端点,处理连接...
Spring框架提供了对WebSocket的支持,使得在Java后端开发中集成WebSocket变得简单。在这个名为"spring websocket"的项目中,我们将会实现三个主要功能:客户端之间的消息传递、客户端向服务器发送消息以及服务器向...
Spring框架,作为Java开发中的主流框架,提供了对WebSocket的支持,使得开发者可以轻松地在Spring应用中集成WebSocket功能。 在这个"websocket+spring"项目中,前端和后端的代码都包含了实现WebSocket通信的逻辑。...
Spring Security可以集成到WebSocket应用中,提供这些安全保障。 9. **WebSocket的应用场景**: WebSocket适用于需要实时交互的场景,如实时聊天、在线协作工具、股票行情推送、多人在线游戏等。利用Spring提供的...
在Spring项目中集成WebSocket,你需要在`pom.xml`文件中添加以下依赖: ```xml <groupId>org.springframework.boot <artifactId>spring-boot-starter-websocket <groupId>javax.websocket <artifactId>javax...
在WebSocket方面,Spring提供了一个名为`Spring Websocket`的模块,使得开发者可以方便地在Spring应用中集成WebSocket,支持Stomp协议,简化了服务器与客户端的交互。 Netty则是一个高性能、异步事件驱动的网络应用...
内容概要:帮助读者通过 Spring Boot 框架一步步完成 WebSocket 集成,快速上手WebSocket。在通过两种方式集成的过程中会摘取整体框架中的核心逻辑,简化代码实现过程,保留核心功能,例如:IOC、AOP、Bean生命周期...
总的来说,SpringWebSocket-master项目是一个实用的教程,演示了如何在Spring Boot应用中集成WebSocket和STOMP,实现前后端的实时通信。开发者可以基于此项目进一步学习WebSocket和STOMP的工作原理,以及如何在实际...
- `SpringWebSocketConfig.java`是Spring MVC应用中WebSocket的配置类。在这个文件中,你会看到如何启用WebSocket,注册WebSocket处理类,以及设置自定义拦截器。通常,你需要在配置类中声明`@EnableWebSocket`注解...
Spring集成webSocket页面访问404问题的解决方法 Spring集成webSocket页面访问404问题的解决方法是指在使用Spring框架集成webSocket技术时,遇到的页面访问404错误问题的解决方案。该问题主要是由于在 ...
总结,Java实现WebSocket通信提供了多种途径,Tomcat的原生支持适合简单的应用,而Spring的WebSocket集成则适用于更复杂的业务场景,提供了更丰富的功能和更好的可扩展性。在选择实现方式时,应根据项目需求和技术栈...
可以通过Spring Security集成WebSocket,对连接进行认证和授权。 9. **测试与调试** 可以使用Chrome的WebSocket插件或自定义的测试工具进行WebSocket应用的测试。对于Spring WebSocket应用,可以使用Spring Boot的...
《Spring整合WebSocket实现实时通讯详解》 WebSocket协议的出现,为Web应用提供了全双工、低延迟的通信方式,使得服务器能够主动向客户端推送数据,极大地丰富了Web应用的交互体验。Spring框架作为Java领域中极为...
本文将深入探讨如何在Spring Cloud Gateway中配置和使用WebSocket,以实现基于Spring Cloud的微服务架构下的WebSocket通信。 首先,理解WebSocket的基础概念至关重要。WebSocket协议是HTTP/1.1协议的一个补充,它在...
在IT行业中,Spring Boot是一个非常流行的Java开发框架,它简化了Spring应用的初始搭建以及开发过程。本项目涉及的关键技术是“Springboot多连接池”和“WebSocket”,这两个概念都是现代Web应用程序的重要组成部分...