将请求路由到netty中的不同方法的最佳做法是什么?

Joe*_*mob 2 java delegates routes netty web

  1. netty是否以某种方式内置了对此的支持?
  2. 如果没有,我应该在哪里做,以及如何实施?

Vee*_*ebs 5

我不相信有内置的支持.但是,在Handler中实现switch语句并不困难.

看看这个Web套接字示例.

    @Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
    Object msg = e.getMessage();
    if (msg instanceof HttpRequest) {
        handleHttpRequest(ctx, (HttpRequest) msg);
    } else if (msg instanceof WebSocketFrame) {
        handleWebSocketFrame(ctx, (WebSocketFrame) msg);
    }
}

private void handleHttpRequest(ChannelHandlerContext ctx, HttpRequest req) throws Exception {
    // Allow only GET methods.
    if (req.getMethod() != GET) {
        sendHttpResponse(ctx, req, new DefaultHttpResponse(HTTP_1_1, FORBIDDEN));
        return;
    }

    // Send the demo page and favicon.ico
    if (req.getUri().equals("/")) {
        HttpResponse res = new DefaultHttpResponse(HTTP_1_1, OK);

        ChannelBuffer content = WebSocketServerIndexPage.getContent(getWebSocketLocation(req));

        res.setHeader(CONTENT_TYPE, "text/html; charset=UTF-8");
        setContentLength(res, content.readableBytes());

        res.setContent(content);
        sendHttpResponse(ctx, req, res);
        return;
    } else if (req.getUri().equals("/favicon.ico")) {
        HttpResponse res = new DefaultHttpResponse(HTTP_1_1, NOT_FOUND);
        sendHttpResponse(ctx, req, res);
        return;
    }

    // Handshake
    WebSocketServerHandshakerFactory wsFactory = new WebSocketServerHandshakerFactory(
            this.getWebSocketLocation(req), null, false);
    this.handshaker = wsFactory.newHandshaker(req);
    if (this.handshaker == null) {
        wsFactory.sendUnsupportedWebSocketVersionResponse(ctx.getChannel());
    } else {
        this.handshaker.handshake(ctx.getChannel(), req);
    }
}
Run Code Online (Sandbox Code Playgroud)

在messageReceived(),我们根据收到的消息类型进行路由.

然后handleHttpRequest(),我们基于URI进行路由.

希望这可以帮助.