Websocket连接成功10秒后自动断开后报错1006

今天,我要带大家探索一个令人费解的网络通讯谜题。在这个数字时代的侦探故事中,我们的主角是一个看似简单的WebSocket连接。这个谜题开始于一个普通的开发者日常,但很快演变成了一场对抗看不见的代码敌人的斗争。

本地开发的秘密花园

在这个故事的第一幕,一切看起来都是那么的和谐。前端和后端的WebSocket服务在本地环境中愉快地交谈,就像一对长时间未见的老朋友。连接建立得不仅成功,而且稳定,没有任何意外的断开。

Linux环境下的意外剧情转折

然而,当这个服务被部署到了Linux环境中,故事发生了戏剧性的转变。通过域名访问后,连接虽然能成功建立,但就像是被施了魔法,每次都在10秒后神秘断开。然后返回一秘的数字1006,就像是一个谜题等待着被解开。

Nginx配置的迷宫

起初,我怀疑这是Nginx的阴谋。我尝试了网络上所有能找到的配置,就像是在一座迷宫中寻找出口,但每个尝试都以失败告终。即使绕过Nginx直接通过域名访问后端服务,这个问题仍然如影随形。

IP连接的线索

在这场技术侦探游戏中,我发现了一个关键线索:直接通过IP连接后端WebSocket服务,就像是找到了避风的港湾,一切问题似乎都消失了。

[问题原因] 腾讯云CDN的隐藏超时陷阱

最终,真相大白。原来,这一切都是腾讯云CDN加速服务的杰作。它默认的十秒超时设置,就像是一张隐形的网,无情地切断了我们的连接。当我关闭了CDN服务,就像是用魔法棒挥了一挥,连接突然之间变得稳定起来。

在这个故事中,我们学到了一个宝贵的教训:有时候,问题并不像它表面上看起来的那样。在这个复杂的网络世界中,一切都可能是罪魁祸首。所以,亲爱的侦探们,下次你遇到技术难题时,记得看看那些隐藏在幕后的设置,因为答案有时候就隐藏在那些最不起眼的地方。

这就是今天的故事,希望你们喜欢这次的网络侦探之旅。记住,每个bug都有它的故事,而每个故事背后,都有一个值得学习的经验。

<think>嗯,用户想了解如何在Spring Boot和Vue3 TypeScript中使用WebSocket和SockJS实现连接并带有UI反馈。首先,我需要回忆这两个技术的整合步骤。 首先,Spring Boot方面,WebSocket的支持通常需要添加依赖,比如spring-boot-starter-websocket。然后,配置WebSocket的相关组件,比如启用@EnableWebSocketMessageBroker,配置消息代理。不过用户提到了SockJS,这意味着可能需要处理SockJS的兼容性,特别是当WebSocket不可用时降级为轮询。需要创建一个WebSocket配置类,继承AbstractWebSocketMessageBrokerConfigurer或者使用新的接口,比如WebSocketMessageBrokerConfigurer。同时,要注册Stomp端点,并启用SockJS。 然后是控制器部分,使用@MessageMapping处理客户端发送的消息,可能还需要@SendTo注解来指定回复的目的地。这部分需要确保消息能够正确路由。 接下来是Vue3方面,用户使用TypeScript,所以需要安装sockjs-client和@stomp/stompjs库。在Vue组件中,需要建立连接,可能需要使用SockJS作为传输方式,然后通过STOMP协议订阅主题。需要处理连接成功、接收消息、断开连接等事件,并在UI上给出反馈,比如显示连接状态、消息列表等。 需要注意的是,跨域问题,Spring Boot后端需要配置允许跨域,或者在WebSocket配置中处理。另外,Vue前端在连接时可能需要指定正确的端点,比如使用SockJS的URL,如http://localhost:8080/ws,并确保后端端点正确注册。 可能的错误点包括依赖版本不兼容,比如sockjs-client和stompjs的版本问题,或者Spring Boot的WebSocket配置不正确导致连接失败。此外,前端在订阅主题时路径是否正确,比如是否匹配后端@SendTo的路径。 测试时,可以先用简单的消息发送,比如客户端发送一个消息,服务端返回确认,前端显示出来。同时,处理连接断开的情况,比如网络问题,前端需要重新连接或提示用户。 还需要考虑UI反馈,比如连接状态的变化,使用响应式变量控制按钮的禁用状态,或者显示加载中的提示。错误处理方面,捕获连接错误并提示用户。 最后,可能需要前后端的日志查看,比如Spring Boot控制台查看WebSocket连接是否建立,浏览器的开发者工具查看WebSocket请求和消息传输情况。</think>以下分步骤讲解Spring Boot WebSocket与Vue3 TypeScript+SockJS的整合实现: 一、Spring Boot后端配置(基于STOMP协议) 1. 添加依赖 ```gradle implementation 'org.springframework.boot:spring-boot-starter-websocket' ``` 2. WebSocket配置类 ```java @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/ws") // 连接端点 .setAllowedOriginPatterns("*") .withSockJS(); // 启用SockJS支持 } @Override public void configureMessageBroker(MessageBrokerRegistry registry) { registry.enableSimpleBroker("/topic"); // 消息代理前缀 registry.setApplicationDestinationPrefixes("/app"); // 应用请求前缀 } } ``` 3. 消息控制器 ```java @Controller public class MessageController { @MessageMapping("/hello") @SendTo("/topic/greetings") public String greeting(String message) { return "ECHO: " + message + " @ " + new Date(); } } ``` 二、Vue3前端实现(TypeScript + Composition API) 1. 安装依赖 ```bash npm install sockjs-client @stomp/stompjs ``` 2. 封装WebSocket工具类 ```typescript // src/utils/websocket.ts import { Client } from '@stomp/stompjs'; import SockJS from 'sockjs-client'; let stompClient: Client | null = null; export const connect = (url: string, onMessage: (msg: string) => void) => { const socket = new SockJS(url); stompClient = new Client({ webSocketFactory: () => socket, onConnect: () => { stompClient?.subscribe('/topic/greetings', (message) => { onMessage(message.body); }); }, onStompError: (frame) => { console.error('STOMP协议错误:', frame.headers.message); } }); stompClient.activate(); }; export const disconnect = () => { if (stompClient) { stompClient.deactivate(); } }; export const sendMessage = (content: string) => { stompClient?.publish({ destination: '/app/hello', body: content }); }; ``` 3. Vue组件实现 ```vue <template> <div> <button @click="toggleConnection" :disabled="connecting" > {{ isConnected ? '断开连接' : '建立连接' }} </button> <input v-model="inputMessage" @keyup.enter="send"/> <button @click="send">发送</button> <div class="message-list"> <div v-for="(msg, index) in messages" :key="index"> {{ msg }} </div> </div> </div> </template> <script setup lang="ts"> import { ref } from 'vue'; import { connect, disconnect, sendMessage } from '../utils/websocket'; const isConnected = ref(false); const connecting = ref(false); const inputMessage = ref(''); const messages = ref<string[]>([]); const toggleConnection = () => { if (!isConnected.value) { connecting.value = true; connect('http://localhost:8080/ws', (msg: string) => { messages.value.push(msg); }); isConnected.value = true; connecting.value = false; } else { disconnect(); isConnected.value = false; } }; const send = () => { if (inputMessage.value.trim()) { sendMessage(inputMessage.value); inputMessage.value = ''; } }; </script> ``` 三、关键问题处理 1. 跨域配置:确保Spring Boot配置允许跨域 ```java // 在WebSocketConfig中添加 registry.addEndpoint("/ws") .setAllowedOriginPatterns("*") // 生产环境需指定具体域名 .withSockJS(); ``` 2. 心跳检测配置(防止自动断开) ```typescript // 修改connect方法中的Client配置 stompClient = new Client({ // ...其他配置 heartbeatIncoming: 4000, heartbeatOutgoing: 4000, }); ``` 3. 断线重连机制 ```typescript // 在工具类中添加重试逻辑 let reconnectAttempts = 0; const maxReconnectAttempts = 5; const connect = (/* 参数 */) => { // ...原有配置 stompClient.onWebSocketClose = () => { if (reconnectAttempts < maxReconnectAttempts) { setTimeout(() => { reconnectAttempts++; connect(url, onMessage); }, 3000); } }; }; ``` 四、运行验证流程 1. 启动Spring Boot应用 2. 运行Vue前端 3. 点击"建立连接"按钮,观察浏览器开发者工具中的WS连接 4. 输入消息测试双向通信 5. 断开网络测试重连机制 典型问题排查: 1. 连接失败:检查后端端口、端点路径是否匹配 2. 消息未接收:检查STOMP订阅路径与后端@SendTo路径是否一致 3. SockJS报错:确保前端使用的协议与后端匹配(HTTP/HTTPS) 建议通过浏览器开发者工具的Network面板观察WebSocket连接状态和消息传输情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值