英文:
running a javax.websocket endpoint in spring?
问题
我已经按照这个教程实现了一个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升级请求
>
> ---
>
> 主机:localhost:8080
>
> 连接:升级
>
> 升级:websocket
>
> Sec-WebSocket-Version:13
>
> Sec-WebSocket-Key:...
>
> 来源:http://localhost
>
>
> WebSocket升级响应
>
> ---
>
> 404 未找到
>
> Vary:OriginAccess-Control-Request-MethodAccess-Control-Request-Headers
>
> Content-Type:application/json
>
> Transfer-Encoding:分块传输
>
> 日期:2020年5月5日星期二,12:12:52 GMT
>
>
> WebSocketError:WebSocket响应错误
这里的答案(https://stackoverflow.com/a/57924245/10551293)指出,您可以通过ws://localhost:8080/context/chat/aa
访问WebSocket端点。这里的"context"是什么意思,我如何使服务器运行并接受传入连接?
英文:
I have implemented a websocket server by following this tutorial: https://www.baeldung.com/java-websockets
Now how do I run this app? I am using Spring and my main function looks like this:
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);
}
}
and my websocket endpoint looks like this:
import java.io.IOException;
import javax.websocket.*;
import javax.websocket.server.*;
@ServerEndpoint(
value = "/chat/{username}",
decoders=MessageDecoder.class,
encoders = MessageEncoder.class
)
public class Controller {
// ...
}
now when I run this, and try to connect to the websocket endpoint like this: wsta ws://localhost:8080/chat/aa -I
I get the following error:
> WebSocket upgrade request
>
> ---
>
> Host: localhost:8080
>
> Connection: Upgrade
>
> Upgrade: websocket
>
> Sec-WebSocket-Version: 13
>
> Sec-WebSocket-Key: ...
>
> Origin: http://localhost
>
>
> WebSocket upgrade response
>
> ---
>
> 404 Not Found
>
> Vary: OriginAccess-Control-Request-MethodAccess-Control-Request-Headers
>
> Content-Type: application/json
>
> Transfer-Encoding: chunked
>
> Date: Tue, 05 May 2020 12:12:52 GMT
>
>
> WebSocketError: WebSocket response error
The answer here (https://stackoverflow.com/a/57924245/10551293) says that you access the webscoket endpoint over ws://localhost:8080/context/chat/aa
. What is context, and how do I get my server to run and accept incoming connections?
答案1
得分: 2
为了使OP提到的Baeldung教程正常运行,我不得不在pom.xml
中添加一个spring-boot-starter-websocket
的Maven依赖项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
然后,我添加了一个Spring @Configuration
,其中包含了@EnableWebSocket
注解,以及一个实例化的ServerEndpointExporter
bean:
@Configuration
@EnableWebSocket
public class WsConfig {
@Bean
public ServerEndpointExporter serverEndpoint() {
return new ServerEndpointExporter();
}
}
此外,需要将端点控制器标记为Spring @Component
:
@ServerEndpoint(
value = "/chat/{username}",
decoders = MessageDecoder.class,
encoders = MessageEncoder.class
)
@Component
public class Controller {
// ...
}
最终,WebSocket端点可通过ws://localhost:8080/chat/torvalds
访问。
英文:
In order to get the Baeldung tutorial mentioned in OP running
-
I had to add a maven dependency for
spring-boot-starter-websocket
topom.xml
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>
-
Add a spring
@Configuration
in which@EnableWebSocket
is added and aServerEndpointExporter
bean is instantiated:@Configuration @EnableWebSocket public class WsConfig { @Bean public ServerEndpointExporter serverEndpoint() { return new ServerEndpointExporter(); } }
-
Additionally the endpoint controller has to be a spring
@Component
:@ServerEndpoint( value = "/chat/{username}", decoders=MessageDecoder.class, encoders = MessageEncoder.class ) @Component public class Controller { ...
<hr>
Eventually the websocket endpoint was reachable under ws://localhost:8080/chat/torvalds
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论