websocket失败:WebSocket握手期间出错:意外响应代码:400

Posted

技术标签:

【中文标题】websocket失败:WebSocket握手期间出错:意外响应代码:400【英文标题】:websocket failed: Error during WebSocket handshake: Unexpected response code: 400 【发布时间】:2016-02-14 17:32:34 【问题描述】:

我正在使用 ec2,使用 socksJS 的 spring websocket 在本地运行良好。 我已经尝试过以下事情。 1. 我没有任何阻塞 TCP 的负载均衡器。请求直接去ec2服务器 2.使用真实IP代替ec2服务器名称。

虽然服务器在 chrome 控制台中出现以下问题,但应用服务器日志中没有错误

WebSocket connection to 'ws://ec2-XX-X-XXX-XXX.compute-1.amazonaws.com/ws/963/kaidmvd9/websocket' failed: Error during WebSocket handshake: Unexpected response code: 400

javascript

app.service('SocketService', function(httpService,$rootScope,SoundService) 
this.registerMe = function(callback)
    $rootScope.socket = new SockJS("/ws");
    $rootScope.stompClient = Stomp.over($rootScope.socket);
    $rootScope.stompClient.connect('guest', 'guest', function(frame1) 
        $rootScope.stompClient.subscribe('/user/'+$rootScope.loggedInUser.username+'/reply', function(frame2) 
            var msg = JSON.parse(frame2.body);
            console.log(msg);
        );
    , 
    function(error) 
        console.log(error.headers.message);
    
    ););

春天的xml

<websocket:message-broker application-destination-prefix="/app" >
    <websocket:stomp-endpoint path="/ws">
        <websocket:sockjs />
    </websocket:stomp-endpoint>
    <websocket:simple-broker prefix="/topic,/user" />
</websocket:message-broker>

【问题讨论】:

您是从同一个ec2-XX-X-XXX-XXX.compute-1.amazonaws.com 域加载网页吗?如果不是,这可能是 CORS 问题 docs.spring.io/spring-framework/docs/current/… 是的,来自同一个域.. 【参考方案1】:

通过您的 T-Hub 帖子来到这里,没有足够的声誉来添加评论,否则会这样做。这是你可以尝试的;使用您的 EC2 的私有 ip(使用 ifconfig 查找)来托管 WebSocket 端点。

<websocket:message-broker application-destination-prefix="/app">
    <websocket:stomp-endpoint path="/ws">
      <websocket:sockjs/>
    </websocket:stomp-endpoint>
     <websocket:stomp-broker-relay prefix="/topic,/user"
           relay-host="your-ec2-private-ip-addr" relay-port="80" heartbeat-send-interval="20000" heartbeat-receive-interval="20000"/>
</websocket:message-broker>

从以下方面获得帮助: Java Spring STOMP: Set broker IP

【讨论】:

它对我有用。在日志中,它在 msg DEBUG 下面重复:org.springframework.messaging.simp.stomp.StompEncoder - 编码 STOMP 命令=CONNECT headers=accept-version=[1.1,1.2], login=[guest], heart-beat=[20000 ,20000], passcode=[guest] DEBUG: org.springframework.messaging.simp.stomp.StompEncoder - 编码 STOMP 命令=CONNECT headers=accept-version=[1.1,1.2], login=[guest], heart- beat=[20000,20000],passcode=[guest] 信息:reactor.tcp.netty.NettyTcpClient - 已关闭:[id: 0x1c3f4225, /172.16.228.141:56670 :> /172.16.228.141:8080] 我找不到解决方案,所以最后我不得不切换到长轮询来代替 web socket。

以上是关于websocket失败:WebSocket握手期间出错:意外响应代码:400的主要内容,如果未能解决你的问题,请参考以下文章

使用 Maven,WebSocket 连接失败:WebSocket 握手期间出错:意外响应代码:404

WebSocket 连接到“ws://localhost:8080/”失败:WebSocket 握手期间出错:意外响应代码:404

失败:WebSocket 握手期间出错:“Sec-WebSocket-Accept”标头值不正确

WebSocket 连接到“ws://chattestarpit.herokuapp.com/”失败:WebSocket 握手期间出错:意外响应代码:503

HTML5 / PHP WebSocket 连接失败:WebSocket 握手期间出错:意外响应代码:200

WebSocket 连接到“ws://.../socket.io/”失败:WebSocket 握手期间出错:net::ERR_CONNECTION_RESET