首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Spring Stomp Websocket -太大的发送消息生成1009错误并断开连接

在使用 Spring 的 STOMP WebSocket 实现时,如果发送的消息过大,可能会导致客户端收到 1009 错误并被断开连接。这是因为 WebSocket 协议对消息大小有一定的限制,具体限制取决于服务器和客户端的配置。以下是解决此问题的详细步骤和建议:

1. 理解错误代码 1009

WebSocket 错误代码 1009 表示 "Policy Violation"(策略违规)。这通常意味着发送的消息超过了服务器或客户端设定的最大允许大小。

2. 检查和调整服务器配置

a. Spring 配置

确保在 Spring 的 WebSocket 配置中设置了适当的消息大小限制。可以通过 WebSocketMessageBrokerConfigurer 接口进行配置:

代码语言:javascript
复制
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.*;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic", "/queue");
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws").withSockJS();
    }

    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {
        registration.interceptors(new ChannelInterceptor() {
            @Override
            public Message<?> preSend(Message<?> message, MessageChannel channel) {
                StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
                if (StompCommand.SEND.equals(accessor.getCommand())) {
                    // 设置最大消息大小,例如 10MB
                    int maxMessageSize = 10 * 1024 * 1024;
                    if (message.getPayload() instanceof byte[]) {
                        if (((byte[]) message.getPayload()).length > maxMessageSize) {
                            throw new MessageSizeExceededException("Message size exceeded: " + maxMessageSize);
                        }
                    }
                }
                return message;
            }
        });
    }
}

b. Tomcat 配置(如果使用嵌入式 Tomcat)

application.propertiesapplication.yml 中配置最大消息大小:

代码语言:javascript
复制
# application.properties
server.tomcat.max-http-post-size=10MB

或者在 application.yml 中:

代码语言:javascript
复制
# application.yml
server:
  tomcat:
    max-http-post-size: 10485760 # 10MB

3. 调整客户端配置

确保客户端在建立 WebSocket 连接时设置了适当的消息大小限制。例如,使用 JavaScript 客户端时,可以在连接 URL 中添加参数:

代码语言:javascript
复制
const socket = new WebSocket('ws://localhost:8080/ws?maxFramePayloadSize=10485760');

4. 分片传输大消息

如果确实需要发送较大的消息,可以考虑将消息分片(chunking)传输。这可以通过自定义消息处理逻辑实现,将大消息拆分成多个较小的消息进行发送,并在客户端重新组装。

5. 检查网络中间件

如果使用了负载均衡器、代理服务器(如 Nginx)或其他网络中间件,确保这些组件没有对 WebSocket 消息大小设置额外的限制。例如,在 Nginx 中,可以调整以下配置:

代码语言:javascript
复制
http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }

    server {
        listen 80;
        server_name example.com;

        location /ws {
            proxy_pass http://backend;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_read_timeout 86400;

            # 设置最大消息大小,例如 10MB
            client_max_body_size 10M;
        }
    }
}

6. 日志和监控

启用详细的日志记录,以便在发生 1009 错误时能够快速定位问题。检查服务器和客户端的日志,了解具体的错误原因和上下文。

7. 优化消息大小

评估是否真的需要发送如此大的消息。如果可能,优化数据结构,减少不必要的数据,使用压缩算法(如 gzip)来减小消息体积。

总结

1009 错误通常是由于消息大小超过了服务器或客户端的限制。通过检查和调整服务器、客户端以及中间件的配置,可以解决此问题。此外,优化消息大小和实现消息分片也是有效的解决方案。确保在生产环境中对消息大小进行适当的限制,以保障系统的稳定性和安全性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

WebSocket的姨母级教程

该技术通过传统的 HTTP 发送,并具有 WebSockets 缺乏的各种功能,例如”自动重新连接”、”事件ID” 及 “发送任意事件”的能力。...) ACK(确认)) NACK(否认)) DISCONNECT(断开连接)) Server Frames: MESSAGE(消息)) RECEIPT(接收)) ERROR(错误)) (6)....Spring 封装的 STOMP 使用 Spring 的 STOMP 支持时,Spring WebSocket 应用程序充当客户端的 STOMP 代理。...在那种情况下,Spring 维护与代理的 TCP 连接,将消息中继到该代理,并将消息从该代理向下传递到已连接的 WebSocket 客户端。.../* 发送消息并指定目标地址(这里设置的目标地址为自身订阅消息的地址,当然也可以设置为其它地址) */ function sendMessageNoParameter() { // 设置发送的内容

2.4K20

Spring Websocket 中文文档 (spring5)

由于Spring的SockJS服务支持服务器发送的心跳(默认情况下每25秒),这意味着如果更频繁地发送消息,通常会在该时间段或更早的时间内检测到客户端断开连接。...Spring尽最大努力识别代表客户端断开连接(特定于每个服务器)的网络故障,并使用中DISCONNECTED_CLIENT_LOG_CATEGORY 定义的专用日志类别记录最小消息AbstractSockJsSession...生成的消息将发送到“brokerChannel”并由消息代理处理。...消息代理找到所有匹配的订户,并通过"clientOutboundChannel"from将消息编码为STOMP帧并在WebSocket连接上发送的每个发送MESSAGE帧。...DISCONNECT可能已从客户端发送,也可能在WebSocket会话关闭时自动生成。在某些情况下,每个会话可能会多次发布此事件。对于多个断开连接事件,组件应该是幂等的。

12.5K76
  • websocket关闭指定原因

    ,设备ID: " + deviceId));} Spring WebSocket 中的 CloseStatus Spring 提供了 CloseStatus 类来封装关闭码和原因。...异常关闭 (1006) 常见于网络问题或客户端断开。可以设置重连机制来保持连接的稳定性。 协议错误 (1002) 当客户端发送了不符合协议的数据时,服务端可以选择断开连接。...1006 是由客户端生成的关闭码,通常用于无法与服务端正常通信的场景(例如网络中断)。建议在服务端日志中查看异常原因。 2. 如何向客户端发送自定义关闭状态?...含义: 收到的消息太大,无法处理。...应用场景: 用于标记安全连接建立失败的情况。 扩展状态码 4500 - SESSION_NOT_RELIABLE 含义: 会话变得不可靠,例如在超时发送消息时。

    22610

    在Spring Boot框架下使用WebSocket实现消息推送

    什么是WebSocket WebSocket为浏览器和服务器之间提供了双工异步通信功能,也就是说我们可以利用浏览器给服务器发送消息,服务器也可以给浏览器发送消息,目前主流浏览器的主流版本对WebSocket...2.registerStompEndpoints方法表示注册STOMP协议的节点,并指定映射的URL。...当我的Project启动之后,在浏览器访问消息发送页面,在该页面发送一条消息,当服务端收到这条消息之后给所有的连接上了服务器的浏览器都发送一条消息。...然后我们的页面上先有两个按钮,一个是连接,一个是断开连接,两个按钮分别对应不同的点击事件,在这两个按钮下方有一个输入框,就是我们要发送的内容,然后还有一个发送按钮,发送按钮对应了一个发送消息的点击事件。...我在最上面的浏览器上发送消息,其他两个浏览器都能收到我的消息。 OK ,以上就是我们在Spring Boot框架下使用WebSocket实现消息推送的全过程。

    3.1K40

    Spring国际认证指南:使用 WebSocket 构建交互式 Web 应用程序

    原标题:Spring国际认证指南|了解如何通过 WebSocket 在浏览器和服务器之间发送和接收消息 本指南将引导您完成创建“Hello, world”应用程序的过程,该应用程序在浏览器和服务器之间来回发送消息...单击Dependencies并选择Websocket。 单击生成。 下载生成的 ZIP 文件,该文件是根据您的选择配置的 Web 应用程序的存档。...接下来,您将创建一个控制器来接收问候消息并发送问候消息。 创建消息处理控制器 在 Spring 处理 STOMP 消息传递的方法中,STOMP 消息可以路由到@Controller类。...打开连接后,系统会要求您输入姓名。输入您的姓名,然后单击发送。您的姓名将作为 JSON 消息通过 STOMP 发送到服务器。...经过一秒钟的模拟延迟后,服务器会发回一条消息,其中包含页面上显示的“Hello”问候语。此时,您可以发送另一个名称,也可以单击“断开连接”按钮关闭连接。 概括 恭喜!

    1.9K20

    【websocket】spring boot 集成 websocket 的四种方式

    ,注意它有一个 Session 参数 @OnClose 当 websocket 建立的连接断开后会触发这个注解修饰的方法,注意它有一个 Session 参数 @OnMessage 当客户端发送消息到服务端时...,会触发这个注解修改的方法,它有一个 String 入参表明客户端传入的值 @OnError 当 websocket 建立连接时出现异常会触发这个注解修饰的方法,注意它有一个 Session 参数 另外一点就是服务端如何发送消息给客户端...也就是说每台服务器都会保存与他连接的 session 于本地。然后发消息的地方要修改,并不是现在这样直接发送,而通过 redis 的订阅机制。...] WebSocket 的故事(二)—— Spring 中如何利用 STOMP 快速构建 WebSocket 广播式消息模式[4] SpringBoot 集成 WebSocket【基于纯 H5】进行点对点...[4] WebSocket 的故事(二)—— Spring 中如何利用 STOMP 快速构建 WebSocket 广播式消息模式: https://juejin.im/post/5b7071ade51d45665816f8c0

    43.3K1211

    补习系列(20)-大话WebSocket与尬聊的实现

    开源地址:http://stomp.github.io/ Stomp 定义了一些简单的指令,如下: 命令 说明 CONNECT 建立连接 SEND 发送消息 SUBSCRIBE 订阅主题 UNSUBSCRIBE...取消订阅 BEGIN 开启事务 COMMIT 提交事务 ABORT 回滚事务 ACK 确认消费 NACK 消息丢弃 DISCONNECT 断开连接 一个简单的STOMP消息大致如下: CONNECTaccept-version...会自动引入spring-websocket 的依赖,而后者就实现了WebSocket 操作的高级封装。...还有一个好消息,就是spring-websocket 也默认支持了 Stomp协议(看吧,Stomp支持者太多了)。而除此之外,还内置了一个叫 SocketJS 的东西。...四、参考文档 https://spring.io/guides/gs/messaging-stomp-websocket/ https://blog.coding.net/blog/spring-static-resource-process

    81550

    第二十章:SpringBoot项目中使用WebSocket配置广播式通信

    WebSocket为浏览器和服务端提供了双工异步通信的功能,浏览器可以向服务端发送消息,服务端也可以向浏览器发送消息。WebSocket需要浏览器的支持,目前大多数主流的浏览器都是支持的。...图2 如上图2所示,我们通过@EnableWebSocketMessageBroker注解开启使用STOMP协议来传输消息,并且实现了registerStompEndpoints方法添加了对应的STOMP...图9 下面是断开连接的代码,如下图10所示: ?...图14 我们现在是断开连接的状态,我们尝试点击连接看下效果,如下图15所示: ?...图20 可以看到上三个图中,我们的WebSocket服务端通过广播的形式完成了服务端的消息发送到浏览器中。

    1.4K40

    使用消息队列实现 分布式 webSocket

    ,那么在其中一个服务器建立了WebSocket连接的用户如何给在另外一个服务器上建立了WebSocket连接的用户发送消息呢?...、Kafka等)的的topic,然后每个应用节点都订阅这个topic,在接收到WebSocket消息后取出这个消息的“消息接收者的用户ID/用户名”,然后再比对自身是否存在相应用户的连接,如果存在则推送消息...,否则丢弃接收到的这个消息(这个消息接收者所在的应用节点会处理) 在用户建立WebSocket连接后,使用Redis缓存记录用户的WebSocket建立在哪个应用节点上,然后同样使用消息队列将消息推送到接收者所在的应用节点上面...取出用户名并判断是否连接到当前应用节点的WebSocket SimpUser simpUser = userRegistry.getUser(redisWebsocketMsg.getReceiver...,需要通知接收者连接的那个节点发送消息 else if(redisService.isSetMember(Constants.REDIS_WEBSOCKET_USER_SET, receiver

    1.4K21

    Springboot +WebSocket学习

    对象.onerror 通信发生错误时触发 close websocket对象.onclose 连接关闭时触发 WebSocket方法 WebSocket对象的相关方法: 方法 描述 send() 使用连接发送数据...发送消息则由RemoteEndpoint完成,其实例由Session维护,根据使用情况,我们可以通过Session.getBasicRemote获取通过消息发送的实例,然后调用其sendXxx()方法就可以发送消息...的区别(IE下a标签触发问题) //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。...) SpringBoot2+Netty+WebSocket(netty实现websocket,支持URL参数) Stomp+SockJS框架实现参考文章 Spring websocket+Stomp+SockJS...实现实时通信 详解 Spring使用WebSocket、SockJS、STOMP实现消息功能 Springboot 整合Websocket+Stomp协议+RabbitMQ做消息代理 实例教程 Springboot

    1.3K10

    Spring WebSocket初探2 (Spring WebSocket入门教程)

    See more: Spring WebSocket reference 整个例子属于WiseMenuFrameWork的一部分,可以将整个项目Clone下来,如果朋友们有需求,我可以整理一个独立的...接上一篇:Spring WebSocket初探1 (Spring WebSocket入门教程) WebSocket前端准备 前端我们需要用到两个js文件: sockjs.js和stomp.js...Stomp Stomp 提供了客户端和代理之间进行广泛消息传输的框架。...(socket); 用Stomp将SockJS进行协议封装 stompClient.connect() 与服务端进行连接,同时有一个回调函数,处理连接成功后的操作信息。...当我们发送公告后,将上图的公告信息在不刷新页面的情况下,使用WebSocket将其改变。发送公告的前端代码已经完成,现在我们来写另一个客户端,用来接收第一个页面发送的公告,展示在上图红框中。

    66630

    使用消息队列轻松实现 分布式 webSocket

    WebSocket连接的用户如何给在另外一个服务器上建立了WebSocket连接的用户发送消息呢?...、Kafka等)的的topic,然后每个应用节点都订阅这个topic,在接收到WebSocket消息后取出这个消息的“消息接收者的用户ID/用户名”,然后再比对自身是否存在相应用户的连接,如果存在则推送消息...,否则丢弃接收到的这个消息(这个消息接收者所在的应用节点会处理) 在用户建立WebSocket连接后,使用Redis缓存记录用户的WebSocket建立在哪个应用节点上,然后同样使用消息队列将消息推送到接收者所在的应用节点上面...取出用户名并判断是否连接到当前应用节点的WebSocket SimpUser simpUser = userRegistry.getUser(redisWebsocketMsg.getReceiver...,需要通知接收者连接的那个节点发送消息 else if(redisService.isSetMember(Constants.REDIS_WEBSOCKET_USER_SET, receiver

    60810

    WebSocket 介绍以及配合 STOMP 的使用

    既然是应用程序级别体验,自然应该有应用程序级别的网络基础支持,而这种支持就应该包含长连接,实时通信这种级别的支持;二是,使用目前的 HTTP 协议,模拟出两端长连接的效果(轮询,阻塞),消耗太大。...在一开始建立连接的过程中,希望建立连接的客户端会向服务端发送一个 HTTP 请求,询问服务器是不是支持 WebSocket,并且告诉服务端,我使用 WebSocket 请求,希望服务端进行相应的响应。...之后的消息发送,消息接受,连接建立,连接关闭等交互,与 Socket 基本类似。...它地作用是告诉 server client 不想消费这个消息 DISCONNECT // 断开连接 // 服务端 CONNECT // 连接建立 RECEIPT // server 成功处理请求带有...其中就有,调用 stompjs 库,将 sockjs 的消息发送用 stomp 进行改写,将 WebSocket 的方法统统用 STOMP 协议的方法进行了包装一遍。

    3.1K20

    websocket消息推送设计

    3.2 长轮询 长轮询是前端页面向服务端发送一次 ajax 请求,服务端收到请求后保持连接,直到有新消息才返回响应并关闭连接,并且处理完响应信息后再向服务端发送新的请求 长轮询的优点很明显,在服务端没有消息的情况下不会频繁的请求...3.4 WebSocket方案 webSocket 是 HTML5 下的一种新协议,是基于TCP的应用层协议,只需要一次连接,便可以实现全双工通信,即客户端和服务端可以相互主动发送消息。...开启并使用SockJS后,它会优先选用Websocket协议作为传输协议,如果浏览器不支持Websocket协议,则会在其他方案中,选择一个较好的协议进行通讯。 STOMP是面向消息的简单文本协议。...使用STOMP的好处在于,它完全就是一种消息队列模式,你可以使用生产者与消费者的思想来认识它,发送消息的是生产者,接收消息的是消费者。...此时客户端定时向服务端发送心跳消息,如果超过设定的时间仍没有收到心跳,则认为客户端与服务端的长连接已经断开,然后服务端会关闭连接并清理内存中的会话信息。

    4.6K10
    领券