【问题标题】:websockets in tomcat7 spring boot apptomcat7 spring boot应用程序中的websockets
【发布时间】:2017-06-21 12:45:42
【问题描述】:

我有一个要部署到 tomcat 7.0.78 实例的 Spring Boot War 文件。网络应用程序启动正常,但网络套接字不工作。它们在嵌入式 tomcat 环境中运行良好,例如运行./gradlew bootRun

我在 Chrome 控制台中遇到的错误是:

angular.js:14525 Possibly unhandled rejection: Whoops! Lost connection to http://localhost:8080/websock

我尝试将tomcat连接器设置为使用Http11NioProtocol,但似乎没有效果。

    <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
       connectionTimeout="20000"
       redirectPort="8443" />      

我也试过设置成ROOT.war,然后浏览显示:WebSocket connection to 'ws://localhost:8080/websock/424/wzkek0zw/websocket' failed: Error during WebSocket handshake: Unexpected response code: 500.

我缺少正确启用 websockets 的 tomcat 配置文件中的某些内容吗?我的网络套接字配置类如下所示:

@Configuration
@EnableWebSocketMessageBroker
@EnableWebSocket
public class WebSocketConfiguration  extends AbstractWebSocketMessageBrokerConfigurer {


    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/websock").setAllowedOrigins("*").withSockJS();
    }
}

我没有编辑 web.xml 中的任何内容,只更改了 server.xml 中的连接器协议。

更新: 我的部分问题是我的连接尝试前面有一个斜线,例如 $stomp.connect('/websock'),所以我把它改成了 $stomp.connect('websock')。这在 tomcat 的 windows 安装上工作正常,但在 ubuntu 安装上不起作用。我必须在我的 javascript 中明确告诉它连接到 http://localhost:8080/websock,但随后在尝试连接到 Web 套接字时出现错误:

webSocket connection to 'ws://localhost:8080/websock/940/qdb1xkkp/websocket' failed: Error during WebSocket handshake: Unexpected response code: 404

【问题讨论】:

  • 查找我发现的堆栈跟踪:stackoverflow.com/a/23546192/592355 ...听起来很可能是org.apache.tomcat.websocketjavax.websocket之间的版本/实现冲突
  • 你是对的。我曾尝试添加 javax.websocket,但它导致了更多问题。部分问题是连接时我的路径错误,但我仍然遇到问题。现在更新答案。

标签: java spring tomcat websocket


【解决方案1】:

我的问题是,在通过 stomp 连接到套接字之前,我必须正确获取基本 URL:

var getUrl = window.location;
var baseUrl = getUrl .protocol + "//" + getUrl.host + "/" + getUrl.pathname.split('/')[1];
$stomp.connect(baseUrl + '/websock', {})

【讨论】:

    猜你喜欢
    • 2021-12-13
    • 2021-03-26
    • 2014-11-05
    • 2016-10-07
    • 2017-12-30
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多