一:引入依赖:
<!--WebSocket专用--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> <dependency> <groupId>org.glassfish.tyrus.bundles</groupId> <artifactId>tyrus-standalone-client</artifactId> <version>2.1.5</version> </dependency> <!--WebSocket end-->
二:写Service:
@Component @ServerEndpoint("/websocket/tterm") public class WebSocketServerEterm {
@OnOpen public void onOpen(Session session) { try { _socket = new Socket(serverIp, serverPort); // 使用配置中的IP和端口 if (_socket.isConnected()) {。。。} }}
@OnMessage public void onMessage(String command, Session session)
@OnClose public void onClose(Session session) { try { if (_socket != null) _socket.close(); System.out.println("Socket连接关闭: " + session.getId()); } catch (IOException e) { System.err.println("关闭Socket资源失败:" + e.getMessage()); } }
三、使用
const WS_BASE_URL = import.meta.env.VITE_WS_URL;
const url = WS_BASE_URL ? `${WS_BASE_URL}/websocket/tterm` : null;
// 切换模态框 const toggleEtermModal = async () => { if (!url) { message.error('WebSocket服务未配置'); return; } etermVisible.value = !etermVisible.value; if (etermVisible.value) { try { await nextTick(); document.querySelector('.eterm-input')?.focus(); etermLoading.value = true; await etermApi.connect(url, { onMessage: (data) => { etermList.value.push({ command: '', response: data }); scrollToBottom(); }, onOpen: () => { socketConnected.value = true; etermList.value.push({ command: '', response: '>>> 连接成功' }); }, onClose: () => { socketConnected.value = false; } }); } catch (error) { message.error(`连接失败: ${error.message}`); etermVisible.value = false; } finally { etermLoading.value = false; } } else { etermApi.exit(); } };
四、正式环境需要结合NGINX:
# WebSocket 代理配置 location /api/websocket/eterm { proxy_pass http://111.222.3.4:1111/websocket/eterm; # WebSocket 必须配置 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; # 连接超时设置 proxy_read_timeout 86400s; proxy_send_timeout 86400s; proxy_connect_timeout 5s; # 日志记录 access_log /var/log/nginx/websocket.log websocket; }