WebSocket握手期间出错:意外的响应代码:302

时间:2017-08-12 23:20:37

标签: java json reactjs websocket jetty

在将基于REACT的WebSocket客户端连接到基于Java Jetty的Web Socket服务器时,我收到以下错误 -

WebSocket connection to 'ws://localhost:2319/ws' failed: Error during WebSocket handshake: Unexpected response code: 302

通过Chrome的Smart Web Socket客户端连接时,此错误不存在。

我正在尝试基于REACT开发Web Socket Client。客户端代码是 -

var connection = new WebSocket('ws://localhost:2319/ws');
     connection.onopen = function () {
     // connection is opened and ready to use
    };

WebSocket Server基于Jetty。服务器代码是 -

server = new Server();
    ServerConnector connector = new ServerConnector(server);
    connector.setPort(SSConstants.WWBSOCKET_PORT);
    server.addConnector(connector);

    // Setup the basic application "context" for this application at "/"
    // This is also known as the handler tree (in jetty speak)
    ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
    context.setContextPath("/ws"); // Set to "/ws" for future integration with the main jetty server.
    server.setHandler(context);

    try {
        // Initialize javax.websocket layer
        ServerContainer wsContainer = WebSocketServerContainerInitializer.configureContext(context);

        // Add WebSocket endpoint to javax.websocket layer
        wsContainer.addEndpoint(WebsocketListener.class);
        server.start();           
    }
    catch (Throwable t) {
        ssLogger.logInfo("Websocket Server start exp : ");
        t.printStackTrace(System.err);
    }

输出 -

WebSocket connection to 'ws://localhost:2319/ws' failed: Error during WebSocket handshake: Unexpected response code: 302

Request URL:ws://localhost:2319/ws
Request Method:GET
Status Code:302 Found

Response Headers
view source
Content-Length:0
Date:Fri, 11 Aug 2017 18:51:42 GMT
Location:http://localhost:2319/ws/
Server:Jetty(9.3.8.v20160314)

Request Headers
view source
Accept-Encoding:gzip, deflate, br
Accept-Language:en-US,en;q=0.8
Cache-Control:no-cache
Connection:Upgrade
Host:localhost:2319
Origin:https://localhost:1338
Pragma:no-cache
Sec-WebSocket-Extensions:permessage-deflate; client_max_window_bits
Sec-WebSocket-Key:2OZooIjOX7G6kgNpPOz9Fw==
Sec-WebSocket-Version:13
Upgrade:websocket
User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36
Name

2 个答案:

答案 0 :(得分:4)

ws://localhost:2319/ws不是有效的端点网址/ URI,它希望重定向到您contextPath /ws的已声明Location: http://localhost:2319/ws/的正确端点

这就是302重定向告诉你的......

WebsocketListener

假设您的@ServerEndpoint("/ws")被声明为ServletContext,我们会使用contextPath "/ws" ws://localhost:2319/ws/ws来表示您的网址/ URI websocket端点是......

ws://<host>:<port>/<contextPath>/<endpointPath>

或以不同的方式说...

$("form").submit(function () { $('#loader').addClass("before").removeClass("after hide"); }); $(document).ready(function () { $("#loader").addClass("hide"); }); $(document).ajaxStart(function () { $("#loader").addClass("before").removeClass("after hide"); }).ajaxStop(function () { $("#loader").addClass("hide"); }); .before, .after{ display:none; width: 50px; height: 20px; position:absolute; bottom: 10px; right: 10px; } .hide{ display:none; } .show{ display:block; }

答案 1 :(得分:0)

我最近遇到了同样的问题,这就是我解决问题的方式。

我将Websocket服务器的端口号从8080更改为8335,这与我的Apache服务器的端口号相同。

<?php
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use MyApp\Chat;

require dirname(__DIR__) . '/vendor/autoload.php';

$server = IoServer::factory(
    new HttpServer(
        new WsServer(
            new Chat()
        )
    ),
    8335
);

$server->run();

还对我的javascript代码进行了实际连接的相同更改

let conn = new WebSocket('ws://localhost:8335');
conn.onopen = function(e) {
    console.log("Connection established!");

    conn.send('Hello Everyone');
};

conn.onmessage = function(e) {
    console.log(e.data);
    $("#msg").append('<br>'+e.data);
};

您还可以按照以下图片在Apache控制器中查找可用端口。谢谢

click on Netstart on the Xampp Controller

在此处输入图片描述

Click to refresh to view Active Socket, New Sockets and Old Sockets

Select any of the ports that falls in the burgundy section

谢谢