2016-08-11 2 views
1

Вот мои фрагменты кода из ChannelInitializer#initChannelNetty: Как использовать строку запроса с websocket?

ChannelPipeline p = ch.pipeline(); 

    p.addLast(new HttpServerCodec()   
    .addLast(new HttpObjectAggregator(65536)) 
    .addLast(new LoggingHandler(LogLevel.INFO)) 
    .addLast(new WebSocketServerProtocolHandler("/chat")) 
    .addLast(new TextWebSocketFrameToChatMessageDecoder()) 
    .addLast(new UserAccessHandler()) 

Это могут быть приняты с помощью ws://mydomain/chat, и теперь я хочу, чтобы разобрать строку запроса, как этот ws://mydomain/chat?accesskey=hello

Я посмотрел вверх WebSocketServerProtocolHandler, но я не мог найти как получить строку запроса.

Как я могу получить (или разобрать) строку запроса? Спасибо за помощь.

ответ

0

Я создал 3 новых класса, скопировал их.

WebSocketServerProtocolHandler
WebSocketServerProtocolHandshakeHandler
WebSocketProtocolHandler

И в копии WebSocketServerProtocolHandshakeHandler, добавил эти код

if(!req.getUri().matches(websocketPath)){ 
    ctx.fireChannelRead(msg); 
    return; 
} 

String [] splittedUri = req.getUri().split("\\?"); 
HashMap<String, String> params = new HashMap<String, String>(); 

if(splittedUri.length > 1){ 
    String queryString = splittedUri[1]; 
    for(String param : queryString.split("&")){ 
     String [] keyValue = param.split("="); 
     if(keyValue != null && keyValue.length >= 2){ 
      logger.trace("key = {}, value = {}", keyValue[0], keyValue[1]); 
      params.put(keyValue[0], keyValue[1]); 
     } 
    } 
} 

ctx.channel().attr(AttrKeys.getInstance().params()).set(params); 

Теперь я могу accpet несколько Ури и использовать строку запроса хорошо. Думаю, кому-то понадобится этот ответ.

1

Метод переопределения: userEventTriggered and handling event HandshakeComplete.

см WebSocketServerProtocolHandshakeHandler

Netty 4,1

public class TextWebSocketFrameToChatMessageDecoder extends SimpleChannelInboundHandler<WebSocketFrame> { 
    public final static AttributeKey<Map<String,String>> RequestParams = AttributeKey.valueOf("request.params"); 

    @Override 
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { 
     if(evt instanceof HandshakeComplete){ 
      HandshakeComplete handshake = (HandshakeComplete)evt; 

      //http request header 
      HttpHeaders headers = handshake.requestHeaders(); 

      //http request uri: /chat?accesskey=hello 
      String    uri = handshake.requestUri(); 

      //TODO: parse uri parameters to map ... 
      Map<String, String> params ; 

      //put to channel context 
      ctx.channel().attr(RequestParams).set(params); 

     }else{ 
      ctx.fireUserEventTriggered(evt); 
     } 
    } 

    @Override 
    protected void channelRead0(ChannelHandlerContext ctx, WebSocketFrame frame) throws Exception { 
     //on message 
     if (frame instanceof TextWebSocketFrame) { 
      Map<String, String> params = ctx.channel().attr(RequestParams).get(); 
      String    accesskey = params.get("accesskey"); 
      System.out.println(accesskey); //hello 
     } else { 
      System.out.println("Unsupported frame type: " + frame.getClass().getName()); 
     }   
    } 
} 
Смежные вопросы