在春天运行 javax.websocket 端点?

Posted

技术标签:

【中文标题】在春天运行 javax.websocket 端点?【英文标题】:running a javax.websocket endpoint in spring? 【发布时间】:2020-05-05 12:23:27 【问题描述】:

我已经按照本教程实现了一个 websocket 服务器:https://www.baeldung.com/java-websockets

现在我该如何运行这个应用程序?我正在使用 Spring,我的主要功能如下所示:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class App 
    public static void main(String[] args) 
        SpringApplication.run(App.class, args);
    

我的 websocket 端点看起来像这样:

import java.io.IOException;

import javax.websocket.*;
import javax.websocket.server.*;

@ServerEndpoint(
        value = "/chat/username",
        decoders=MessageDecoder.class,
        encoders = MessageEncoder.class
)
public class Controller 
    // ...

现在当我运行它并尝试像这样连接到 websocket 端点时:wsta ws://localhost:8080/chat/aa -I 我收到以下错误:

WebSocket 升级请求

---

主机:本地主机:8080

连接:升级

升级:websocket

Sec-WebSocket-版本:13

Sec-WebSocket-Key: ...

来源:http://localhost

WebSocket 升级响应

---

404 未找到

变化:OriginAccess-Control-Request-MethodAccess-Control-Request-Headers

内容类型:application/json

传输编码:分块

日期:格林威治标准时间 2020 年 5 月 5 日星期二 12:12:52

WebSocketError:WebSocket 响应错误

这里的答案 (https://***.com/a/57924245/10551293) 说您通过 ws://localhost:8080/context/chat/aa 访问 webscoket 端点。什么是上下文,如何让我的服务器运行并接受传入连接?

【问题讨论】:

【参考方案1】:

为了让OP中提到的Baeldung教程运行

    我必须为 spring-boot-starter-websocket 添加一个 maven 依赖项到 pom.xml

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-websocket</artifactId>
    </dependency>
    

    添加一个弹簧@Configuration,其中添加了@EnableWebSocket,并实例化了一个ServerEndpointExporter bean:

    @Configuration
    @EnableWebSocket
    public class WsConfig 
    
        @Bean
        public ServerEndpointExporter serverEndpoint() 
            return new ServerEndpointExporter();
        
    
    

    另外端点控制器必须是弹簧@Component:

    @ServerEndpoint(
            value = "/chat/username",
            decoders=MessageDecoder.class,
            encoders = MessageEncoder.class
    )
    @Component
    public class Controller 
     ...
    


最终在ws://localhost:8080/chat/torvalds 下可以访问 websocket 端点

【讨论】:

非常感谢,这就是我所缺少的!

以上是关于在春天运行 javax.websocket 端点?的主要内容,如果未能解决你的问题,请参考以下文章

在 grizzly 上设置 websocket SSL

Websocket 服务器和移动客户端

javax.websocket.Session API

为啥 javax.websocket 不能解决?

没有'javax.websocket.server.ServerContainer' ServletContext 属性 - Glassfish 4.1

javax websocket客户端ssl连接