Home / Class/ WebSocketServerHandler Class — netty Architecture

WebSocketServerHandler Class — netty Architecture

Architecture documentation for the WebSocketServerHandler class in WebSocketServerHandler.java from the netty codebase.

Entity Profile

Dependency Diagram

graph TD
  3f7d4c4e_8262_9dae_1834_1af8d0f2e6dd["WebSocketServerHandler"]
  a304f393_f63c_fb72_cc6a_54fb179fc5b0["WebSocketServerHandler.java"]
  3f7d4c4e_8262_9dae_1834_1af8d0f2e6dd -->|defined in| a304f393_f63c_fb72_cc6a_54fb179fc5b0
  75e316aa_b744_349b_a240_9ef9a100569e["channelRead0()"]
  3f7d4c4e_8262_9dae_1834_1af8d0f2e6dd -->|method| 75e316aa_b744_349b_a240_9ef9a100569e
  508ffeb5_9c37_f836_dadf_0849a826f397["channelReadComplete()"]
  3f7d4c4e_8262_9dae_1834_1af8d0f2e6dd -->|method| 508ffeb5_9c37_f836_dadf_0849a826f397
  fcec6aed_39e7_3b17_aeb4_b612a777c609["handleHttpRequest()"]
  3f7d4c4e_8262_9dae_1834_1af8d0f2e6dd -->|method| fcec6aed_39e7_3b17_aeb4_b612a777c609
  561e834f_6fd1_e74c_a65e_ce5f1a9df2e3["handleWebSocketFrame()"]
  3f7d4c4e_8262_9dae_1834_1af8d0f2e6dd -->|method| 561e834f_6fd1_e74c_a65e_ce5f1a9df2e3
  e1c780b8_8a58_a843_981f_2378e8000b08["sendHttpResponse()"]
  3f7d4c4e_8262_9dae_1834_1af8d0f2e6dd -->|method| e1c780b8_8a58_a843_981f_2378e8000b08
  c73db5f6_2a9c_7121_7417_d6720f556959["exceptionCaught()"]
  3f7d4c4e_8262_9dae_1834_1af8d0f2e6dd -->|method| c73db5f6_2a9c_7121_7417_d6720f556959
  af3c428c_9c20_3e6a_a0f8_9f0328a14631["String()"]
  3f7d4c4e_8262_9dae_1834_1af8d0f2e6dd -->|method| af3c428c_9c20_3e6a_a0f8_9f0328a14631

Relationship Graph

Source Code

example/src/main/java/io/netty/example/http/websocketx/benchmarkserver/WebSocketServerHandler.java lines 45–162

public class WebSocketServerHandler extends SimpleChannelInboundHandler<Object> {

    private static final String WEBSOCKET_PATH = "/websocket";

    private WebSocketServerHandshaker handshaker;

    @Override
    public void channelRead0(ChannelHandlerContext ctx, Object msg) {
        if (msg instanceof FullHttpRequest) {
            handleHttpRequest(ctx, (FullHttpRequest) msg);
        } else if (msg instanceof WebSocketFrame) {
            handleWebSocketFrame(ctx, (WebSocketFrame) msg);
        }
    }

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) {
        ctx.flush();
    }

    private void handleHttpRequest(ChannelHandlerContext ctx, FullHttpRequest req) {
        // Handle a bad request.
        if (!req.decoderResult().isSuccess()) {
            sendHttpResponse(ctx, req, new DefaultFullHttpResponse(req.protocolVersion(), BAD_REQUEST,
                                                                   ctx.alloc().buffer(0)));
            return;
        }

        // Allow only GET methods.
        if (!GET.equals(req.method())) {
            sendHttpResponse(ctx, req, new DefaultFullHttpResponse(req.protocolVersion(), FORBIDDEN,
                                                                   ctx.alloc().buffer(0)));
            return;
        }

        // Send the demo page and favicon.ico
        if ("/".equals(req.uri())) {
            ByteBuf content = WebSocketServerBenchmarkPage.getContent(getWebSocketLocation(req));
            FullHttpResponse res = new DefaultFullHttpResponse(req.protocolVersion(), OK, content);

            res.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/html; charset=UTF-8");
            HttpUtil.setContentLength(res, content.readableBytes());

            sendHttpResponse(ctx, req, res);
            return;
        }

        if ("/favicon.ico".equals(req.uri())) {
            FullHttpResponse res = new DefaultFullHttpResponse(req.protocolVersion(), NOT_FOUND,
                                                               ctx.alloc().buffer(0));
            sendHttpResponse(ctx, req, res);
            return;
        }

        // Handshake
        WebSocketServerHandshakerFactory wsFactory = new WebSocketServerHandshakerFactory(
                getWebSocketLocation(req), null, true, 5 * 1024 * 1024);
        handshaker = wsFactory.newHandshaker(req);
        if (handshaker == null) {
            WebSocketServerHandshakerFactory.sendUnsupportedVersionResponse(ctx.channel());
        } else {
            handshaker.handshake(ctx.channel(), req);
        }
    }

    private void handleWebSocketFrame(ChannelHandlerContext ctx, WebSocketFrame frame) {

        // Check for closing frame
        if (frame instanceof CloseWebSocketFrame) {
            handshaker.close(ctx, (CloseWebSocketFrame) frame.retain());
            return;
        }
        if (frame instanceof PingWebSocketFrame) {
            ctx.write(new PongWebSocketFrame(frame.content().retain()));
            return;
        }
        if (frame instanceof TextWebSocketFrame) {
            // Echo the frame
            ctx.write(frame.retain());
            return;
        }

Frequently Asked Questions

What is the WebSocketServerHandler class?
WebSocketServerHandler is a class in the netty codebase, defined in example/src/main/java/io/netty/example/http/websocketx/benchmarkserver/WebSocketServerHandler.java.
Where is WebSocketServerHandler defined?
WebSocketServerHandler is defined in example/src/main/java/io/netty/example/http/websocketx/benchmarkserver/WebSocketServerHandler.java at line 45.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free