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

时间:2012-01-22 22:24:12

标签: java delegates routes web netty

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

1 个答案:

答案 0 :(得分:5)

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

查看此网络套接字example

    @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);
    }
}

messageReceived()中,我们根据收到的邮件类型进行路由。

然后在handleHttpRequest()中,我们根据URI进行路由。

希望这有帮助。