WebSocket启用备忘

一:引入依赖:

复制代码
<!--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;
        }
相关推荐
梦帮科技11 小时前
领域认知知识库图谱注入:从双式记账图网络到高质量问答对自动化合成流水线
运维·网络·数据库·人工智能·矩阵·架构·自动化
菜鸡养成中...12 小时前
卫星通信协议笔记1-协议栈
网络
hzxpaipai13 小时前
杭州企业官网怎么建设?从策划到上线的5步建站方法
运维·服务器·前端·网络
smartpi_ai13 小时前
通用脱机烧录器为什么烧不进 CI-03?下载协议的门槛、免唤醒 10 条的建议值属性
服务器·网络·ci/cd
ITxiaobing202314 小时前
自研 IP 库与 AppsFlyer 判定不一致的排查实践
网络·网络协议·tcp/ip
2501_9378609414 小时前
中篇:TCP 为什么可靠又高效?滑动窗口、流量控制、拥塞控制与粘包全解析
服务器·网络·tcp/ip
刚及格的陆拾伍15 小时前
Wi-Fi核心知识精要:从频段到帧结构全解析
网络·物联网·网络协议·信息与通信·iot
xiaoye-duck15 小时前
《Linux 网络编程》深入理解 IO 多路复用:select 函数详解与 Echo 服务实战
linux·网络
xfan_me16 小时前
SSL 证书落地应用与网站安全加固
网络协议·安全·ssl
SDWAN_Cheap16 小时前
TCP滑动窗口与拥塞控制是什么?从流量控制到网络稳定性的完整解析
网络·tcp/ip·php