温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Tomcat如何支持WebSocket通信

发布时间:2025-12-16 06:43:23 来源:亿速云 阅读:161 作者:小樊 栏目:系统运维

支持条件与版本

  • Apache Tomcat 从 7.0.47 起内置 JSR-356(Java WebSocket 1.1) 实现,满足 RFC 6455 规范,应用可直接基于标准 API 开发 WebSocket 服务端。若使用较老版本,需先升级到支持版本。

快速上手 注解式端点

  • 添加依赖:将 Tomcat 自带的 websocket-api.jar 与 tomcat-websocket.jar 放入应用的 WEB-INF/lib(Tomcat 8/9 通常已内置,无需额外打包)。
  • 编写端点:使用 @ServerEndpoint 标注类,并在 @OnOpen/@OnMessage/@OnClose/@OnError 中处理生命周期与消息。
  • 部署运行:将应用部署到 Tomcat,启动后通过 ws:// 访问对应路径。
  • 示例代码:
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;

@ServerEndpoint("/ws/echo")
public class EchoEndpoint {
    @OnOpen
    public void onOpen(Session session) throws IOException {
        session.getBasicRemote().sendText("CONNECTED: " + session.getId());
    }

    @OnMessage
    public void onMessage(String msg, Session session) throws IOException {
        session.getBasicRemote().sendText("ECHO: " + msg);
    }

    @OnClose
    public void onClose(Session session, CloseReason cr) {
        System.out.println("CLOSED: " + cr);
    }

    @OnError
    public void onError(Session session, Throwable t) {
        t.printStackTrace();
    }
}
  • 前端连接示例:
const ws = new WebSocket("ws://localhost:8080/yourapp/ws/echo");
ws.onopen = () => ws.send("Hello");
ws.onmessage = e => console.log("recv:", e.data);
ws.onclose = () => console.log("closed");
  • 说明:Tomcat 的 WebSocket 实现为每次连接创建新的端点实例,开发者一般无需额外处理并发安全问题。

编程式端点与配置

  • 编程式端点:继承 Endpoint,在 onOpen 中注册 MessageHandler.Whole/Partial,通过 Session.getBasicRemote()/getAsyncRemote() 发送消息。
  • 应用配置:实现 ServerApplicationConfig,返回需要注册的类或 ServerEndpointConfig。
  • 示例代码:
import javax.websocket.*;
import javax.websocket.server.ServerEndpointConfig;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

public class MyAppConfig implements ServerApplicationConfig {
    @Override
    public Set<Class<?>> getAnnotatedEndpointClasses(Set<Class<?>> scanned) {
        return scanned; // 扫描到的 @ServerEndpoint 类
    }
    @Override
    public Set<ServerEndpointConfig> getEndpointConfigs(Set<Class<? extends Endpoint>> scanned) {
        Set<ServerEndpointConfig> cfgs = new HashSet<>();
        cfgs.add(ServerEndpointConfig.Builder.create(MyEndpoint.class, "/ws/prog").build());
        return cfgs;
    }
}

@javax.websocket.ClientEndpoint
class MyEndpoint extends Endpoint {
    @Override
    public void onOpen(Session session, EndpointConfig config) {
        session.addMessageHandler(new MessageHandler.Whole<String>() {
            @Override public void onMessage(String text) {
                try { session.getBasicRemote().sendText("ACK:" + text); }
                catch (IOException e) { e.printStackTrace(); }
            }
        });
    }
}
  • 说明:编程式更灵活,适合需要动态注册或复杂握手逻辑的场景。

Tomcat 专项配置与性能调优

  • 常用上下文参数(web.xml 或 ServletContext 初始化参数):
    • org.apache.tomcat.websocket.BLOCKING_SEND_TIMEOUT:阻塞发送超时,单位毫秒,默认 20000;设为 -1 表示不限制。
    • org.apache.tomcat.websocket.binaryBufferSize:二进制消息缓冲大小,默认 8192 字节。
    • org.apache.tomcat.websocket.textBufferSize:文本消息缓冲大小,默认 8192 字节。
    • org.apache.tomcat.websocket.noAddAfterHandshake:是否在首次握手后禁止编程式部署,默认 false(Tomcat 允许);设为 true 可与 JSR-356 1.0 严格一致。
  • 客户端连接参数(javax.websocket.ClientEndpointConfig.userProperties):
    • org.apache.tomcat.websocket.IO_TIMEOUT_MS:建立连接的 IO 超时,默认 5000 ms。
    • 安全连接可用:SSL_CONTEXT / SSL_PROTOCOLS / SSL_TRUSTSTORE / SSL_TRUSTSTORE_PWD 等。
  • 示例(在代码中设置客户端超时):
ClientEndpointConfig cfg = ClientEndpointConfig.Builder.create()
    .configurator(new ClientEndpointConfig.Configurator() {
        @Override
        public void beforeRequest(Map<String,List<String>> headers) {
            // 可添加自定义请求头
        }
    })
    .build();
cfg.getUserProperties().put("org.apache.tomcat.websocket.IO_TIMEOUT_MS", "10000");
  • 说明:以上参数均为 Tomcat 扩展,用于细粒度控制超时、缓冲与握手行为。

安全与运维要点

  • 使用 wss:// 与 TLS/SSL 加密传输;在反向代理/负载均衡(如 Nginx/HAProxy)上正确配置升级到 WebSocket(HTTP/1.1 Upgrade 与长连接保持)。
  • 进行 身份验证与授权(如基于 Token/JWT 在握手阶段校验),并在服务端校验来源与权限。
  • 集群与扩展:多实例部署时引入 Redis/Kafka 等做消息广播/会话粘滞;监控连接数、消息吞吐与内存占用,按需调整线程与缓冲参数。
  • 常见排错:检查 ws:///wss:// 路径、应用上下文路径、反向代理配置、TLS 证书链与浏览器控制台错误;必要时开启 Tomcat 访问日志与业务日志联动定位。
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手