У меня было следующее исключение с сервером веб-сокетов Netty 4.0
io.netty.handler.codec.http.websocketx.WebSocketHandshakeException: not a WebSocket request: missing key
at io.netty.handler.codec.http.websocketx.WebSocketServerHandshaker13.newHandshakeResponse(WebSocketServerHandshaker13.java:104)
at io.netty.handler.codec.http.websocketx.WebSocketServerHandshaker.handshake(WebSocketServerHandshaker.java:160)
at io.netty.handler.codec.http.websocketx.WebSocketServerHandshaker.handshake(WebSocketServerHandshaker.java:135)
, но я не смог найти причину, почему это произошло с версиями Netty 4.x.
после нескольких часов трудолюбия я обнаружил, что когда мы используем WebSocketServerHandshakerFactory
, мы должны передать FullHttpRequest
рукопожатию.но проблема в том, что 'WebSocketServerHandshaker13' запрашивает параметры заголовка с помощью 'FullHttpRequest'.но конструктор DefaultFullHttpRequest не принимает параметры заголовка по умолчанию, мы должны установить его отдельно, после того, как проблема с параметрами заголовка, установленная с помощью FullHttpRequest, будет решена.
WebSocketServerHandshakerFactory wsFactory =
new WebSocketServerHandshakerFactory(getWebSocketURL(req), null, true);
handshaker = wsFactory.newHandshaker(req);
if (handshaker == null) {
WebSocketServerHandshakerFactory.sendUnsupportedWebSocketVersionResponse(ctx.channel());
} else {
if(req instanceof HttpRequest){
FullHttpRequest fullHttpRequest = new DefaultFullHttpRequest(req.getProtocolVersion(), req.getMethod(),req.getUri());
fullHttpRequest.headers().set(req.headers());
try{
String fullReqHeadder = fullHttpRequest.headers().get(HttpHeaders.Names.SEC_WEBSOCKET_KEY);
System.out.println("Full Req Headderr " + fullReqHeadder);
handshaker.handshake(ctx.channel(), fullHttpRequest);
}catch (Exception ex){
ex.printStackTrace();
}
}
}
}```