我正在尝试创建一个简单的Websocket Java聊天。但是我在进行一次难以置信的斗争时试图找出问题所在以及为什么我收到“ Firefox无法在ws:// localhost:8080 / ivan-stanev-client / chat /建立与服务器的连接a”。我有一个简单的Web套接字Java服务器:
@ServerEndpoint(value = "/chat/{username}", decoders = MessageDecoder.class, encoders = MessageEncoder.class)
public class ChatEndpoint {
private Session session;
private static final Set<ChatEndpoint> chatEndpoints = new CopyOnWriteArraySet<>();
private static HashMap<String, String> users = new HashMap<>();
@OnOpen
public void onOpen(Session session, @PathParam("username") String username) throws IOException, EncodeException {
this.session = session;
chatEndpoints.add(this);
users.put(session.getId(), username);
Message message = new Message();
message.setFrom(username);
message.setContent("Connected!");
broadcast(message);
}
...
这是在javascript中产生错误的部分(不知道为什么我无法建立连接,我到处搜索了):
ws = new WebSocket("ws://" + document.location.host + "/ivan-stanev-client/chat/" + username);
P.S。我正在关注本教程:https://github.com/eugenp/tutorials/tree/c83c449fa5a7ac2462fabf0ed26969f1b037aa12/java-websocket
是什么问题? Tomcat使用ServletContainerInitializer在应用程序中查找任何用ServerEndpoint注释的类。另一方面,当您使用任何嵌入式Web容器时,Spring Boot不支持ServletContainerInitializer。
因此,我们需要通过创建ServerEndpointExporter的bean来导出ServerEndpoint。必须在应用程序中创建WebSocketConfig类。
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
而且我在WebSocket服务器上也缺少@Component注释。