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;
        }
<think>好的,我现在需要向用户介绍如何启用WebSocket的支持。首先,我应该明确WebSocket是什么,它的用途以及为什么需要启用它。WebSocket是一种网络通信协议,允许客户端和服务器之间进行全双工通信,这对于需要实时数据更新的应用非常有用,比如聊天应用或实时游戏。 接下来,我需要考虑用户可能使用的技术栈,因为不同的服务器配置方法不同。常见的服务器包括Node.js(使用Express和ws库)、Nginx、Apache,以及Spring Boot等。我需要分别说明这些环境中如何启用WebSocket支持。 对于Node.js,我需要提到安装ws库,创建WebSocket服务器,并处理连接事件。同时,可能需要配置Express中间件来支持WebSocket。在Nginx中,需要修改配置文件,添加Upgrade和Connection头,设置代理超时时间。对于Apache,可能需要启用mod_proxy_wstunnel模块,并配置虚拟主机。Spring Boot的话,需要添加依赖,创建配置类,并使用@ServerEndpoint注解。 还需要考虑安全性,比如使用WSS(WebSocket Secure)通过TLS加密,防火墙配置是否允许WebSocket流量(通常端口80或443)。另外,跨域问题(CORS)的处理,可能需要在服务器端设置响应头。 用户可能对某些步骤不熟悉,比如如何安装库,如何修改配置文件,所以需要给出具体的命令或配置示例。同时,提醒用户测试WebSocket连接是否成功,可以使用浏览器开发者工具或者在线测试工具。 最后,总结一下关键步骤,确保用户能按照指导逐步操作,并根据自己的环境选择合适的配置方法。需要保持语言简洁明了,避免技术术语过多,必要时给出参考链接或进一步阅读建议。</think>好的,我将分步骤为您介绍如何启用WebSocket支持: 1. **理解WebSocket基础** - 基于TCP的全双工通信协议 - 默认端口:ws://80 / wss://443 - 适用于实时聊天、股票行情、在线游戏等场景 2. **选择开发环境**(常见方案): **A. Node.js环境** ```bash npm install ws # 安装WebSocket库 ``` ```javascript const WebSocket = require('ws'); const wss = new WebSocket.Server({ port: 8080 }); wss.on('connection', (ws) => { ws.on('message', (message) => { console.log('Received:', message); }); ws.send('Server connected!'); }); ``` **B. Nginx反向代理配置** ```nginx location /websocket/ { proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header Host $host; proxy_read_timeout 86400; # 保持长连接 } ``` **C. Spring Boot配置** ```xml <!-- pom.xml添加依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> ``` ```java @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(myHandler(), "/ws").setAllowedOrigins("*"); } } ``` 3. **安全配置要点** - 强制使用WSS协议(TLS加密) - 验证Origin头防止CSRF攻击 - 设置心跳机制检测连接状态 - 限制单IP连接数 4. **客户端连接示例** ```javascript const socket = new WebSocket('wss://yourdomain.com/ws'); socket.onopen = () => { console.log('Connection established'); socket.send('Hello Server!'); }; socket.onmessage = (event) => { console.log('Message from server:', event.data); }; ``` 5. **调试工具推荐** - 浏览器开发者工具 → Network → WS - Postman(新版支持WebSocket测试) - wscat命令行工具 ```bash npm install -g wscat wscat -c wss://yourdomain.com/ws ``` **常见问题解决**: 1. 连接失败检查清单: - 防火墙是否开放端口 - 是否配置了正确的CORS策略 - SSL证书是否有效(WSS必需) - 协议头是否正确处理(Upgrade头) 2. 性能优化建议: - 使用二进制传输格式(ArrayBuffer代替JSON) - 实现连接池管理 - 添加消息压缩支持 - 设置合理的ping/pong间隔 实际部署时,建议使用专业的WebSocket服务解决方案如Socket.IO(支持自动回退、心跳检测等高级功能),并配合负载均衡器处理高并发场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值