WebSocket

  • HTTP是运行在TCP协议传输层上的应用协议,而WebSocket是通过HTTP协议协商如何连接,然后独立运行在TCP协议传输层上的应用协议。
  • Websocket是一个持久化的协议,相对于HTTP这种非持久的协议来说。
  • websocket约定了一个通信的规范,通过一个握手的机制,客户端和服务器之间能建立一个类似tcp的连接,从而方便它们之间的通信

连接过程:

第一次握手请求由客户端发起,当服务器收到握手请求后,返回响应,这时客户端收到详情并打开socket完成握手,这样就建立了服务器与客户端之间的tcp长连接,对于 WebSocket 来说,它必须依赖HTTP协议的第一次握手 ,握手成功后,数据就直接从 TCP 通道传输,与 HTTP 无关了。

WebSocket服务器在接收到客户端消息时需要对其判断,这个消息是http消息还是已经建立tcp连接的WebSocketFrame消息,若是前者,则代表是握手请求,服务器需要对握手请求进行响应 ,通常的写法如下:

private void handHttpRequest(ChannelHandlerContext ctx, FullHttpRequest req) {
        //如果不是WebSocket握手请求消息,那么就返回 HTTP 400 BAD REQUEST 响应给客户端。
        if (!req.getDecoderResult().isSuccess()
                || !("websocket".equals(req.headers().get("Upgrade")))) {
            sendHttpResponse(ctx, req,
                    new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.BAD_REQUEST));
            return;

        }
        //如果是握手请求,那么就进行握手
        WebSocketServerHandshakerFactory wsFactory = new WebSocketServerHandshakerFactory(
                WEB_SOCKET_URL, null, false);
        handshaker = wsFactory.newHandshaker(req);
        if (handshaker == null) {
            WebSocketServerHandshakerFactory.sendUnsupportedWebSocketVersionResponse(ctx.channel());
        } else {
            // 通过它构造握手响应消息返回给客户端,
            // 同时将WebSocket相关的编码和解码类动态添加到ChannelPipeline中,用于WebSocket消息的编解码,
            // 添加WebSocketEncoder和WebSocketDecoder之后,服务端就可以自动对WebSocket消息进行编解码了
            handshaker.handshake(ctx.channel(), req);
        }
    }

Tomcat是一种Web Server

Netty是一个Network Server,是处于Web Server更下层的网络框架

上一篇:Node.js(五)


下一篇:在SpringBoot中开发RestAPI应用