websocket啊【二】

Blade 未结 1 464
3092844924
3092844924 剑圣 2023-04-18 13:22

一、该问题的重现步骤是什么?

1. 问题来源

37N0V2GQ`%5Y(~S1)_KN@FX.png

2. 根据链接https://juejin.cn/post/6844904029244538893中服务端的代码:

package com.ytao.websocket;


import io.netty.bootstrap.ServerBootstrap;

import io.netty.channel.*;

import io.netty.channel.nio.NioEventLoopGroup;

import io.netty.channel.socket.SocketChannel;

import io.netty.channel.socket.nio.NioServerSocketChannel;

import io.netty.handler.codec.http.HttpObjectAggregator;

import io.netty.handler.codec.http.HttpServerCodec;

import io.netty.handler.logging.LogLevel;

import io.netty.handler.logging.LoggingHandler;

import io.netty.handler.stream.ChunkedWriteHandler;


/**

 * Created by YANGTAO on 2019/11/17 0017.

 */

public class WebSocketServer {


    public static String HOST = "127.0.0.1";

    public static int PORT = 8806;


    public static void startUp() throws Exception {

        // 监听端口的线程组

        EventLoopGroup bossGroup = new NioEventLoopGroup();

        // 处理每一条连接的数据读写的线程组

        EventLoopGroup workerGroup = new NioEventLoopGroup();

        // 启动的引导类

        ServerBootstrap serverBootstrap = new ServerBootstrap();

        try {

            serverBootstrap.group(bossGroup, workerGroup)

                    .channel(NioServerSocketChannel.class)

                    .childHandler(new ChannelInitializer<SocketChannel>() {

                        @Override

                        protected void initChannel(SocketChannel ch) throws Exception{

                            ChannelPipeline pipeline = ch.pipeline();

                            pipeline.addLast("logger", new LoggingHandler(LogLevel.INFO));

                            // 将请求和返回消息编码或解码成http

                            pipeline.addLast("http-codec", new HttpServerCodec());

                            // 使http的多个部分组合成一条完整的http

                            pipeline.addLast("aggregator", new HttpObjectAggregator(65536));

                            // 向客户端发送h5文件,主要是来支持websocket通信

                            pipeline.addLast("http-chunked", new ChunkedWriteHandler());

                            // 服务端自定义处理器

                            pipeline.addLast("handler", new WebSocketServerHandler());

                        }

                    })

                    // 开启心跳机制

                    .childOption(ChannelOption.SO_KEEPALIVE, true)

                    .handler(new ChannelInitializer<NioServerSocketChannel>() {

                        protected void initChannel(NioServerSocketChannel ch) {

                            System.out.println("WebSocket服务端启动中...");

                        }

                    });


            Channel ch = serverBootstrap.bind(HOST, PORT).sync().channel();

            System.out.println("WebSocket host: "+ch.localAddress().toString().replace("/",""));

            ch.closeFuture().sync();

        }catch (Exception e){

            e.printStackTrace();

        }finally {

            bossGroup.shutdownGracefully();

            workerGroup.shutdownGracefully();

        }


    }


    public static void main(String[] args) throws Exception {

        startUp();

    }

}


作者:ytao

链接:https://juejin.cn/post/6844904029244538893

来源:稀土掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。



HTTP轮询和WebSocket生命周期示意图

那么问题来了

通过注释,这段服务端的代码也是将请求和返回消息编码或解码成http,那这是使用WebSocket通信还是http通信?







1条回答
  • 代码只是例子。如果将请求和返回消息编码或解码成HTTP,则这是使用HTTP通信,而不是WebSocket通信。WebSocket通信是一种全双工协议,它使用单个TCP连接进行通信,并且不需要在每个消息之间进行HTTP握手。与此不同,HTTP通信是一种半双工协议,每个请求都需要建立一个新的TCP连接,并且在每个请求和响应之间进行HTTP握手。因此,如果请求和响应消息采用HTTP编码,则使用的是HTTP通信。


    WebSocket是一种基于TCP协议实现的全双工通信协议,它可以在浏览器和服务器之间建立一个持久的连接,实现实时的双向通信。与HTTP协议不同,WebSocket协议是一种真正的双向通信协议,可以在客户端和服务器之间实现实时的数据交换。


    WebSocket通信的原理如下:

    1. 客户端向服务器发起WebSocket连接请求,请求头包含Upgrade和Connection字段,指定使用WebSocket协议进行通信。

    2. 服务器返回101状态码,表示同意建立WebSocket连接,并在响应头中包含Upgrade和Connection字段,指定使用WebSocket协议进行通信。

    3. 建立WebSocket连接后,客户端和服务器可以通过send()方法和onmessage事件来发送和接收消息。

    4. WebSocket连接可以保持长时间的活动状态,客户端和服务器可以随时发送消息,而不需要每次都建立新的连接。

    5. WebSocket连接可以通过close()方法来关闭连接。


    WebSocket通信的特点:

    1. 支持实时双向通信,可以实现服务器向客户端推送数据。

    2. 建立连接时需要进行握手,建立连接后可以保持长时间的活动状态。

    3. 数据格式轻量,通信性能高效。

    4. 支持跨域通信。

    5. 支持自定义协议,可以根据具体需求进行扩展。


    0 讨论(0)
提交回复