青训营笔记|大数据方向--分布式文件存储系统开发(6)

94 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的的第6天

 转眼间,夏令营就要结束了,我们的项目也到了deadline了,这里记录一下自己这些天遇到的坑与学到的处理方法。

 在我们用netty进行通信时,连接建立后,线程就阻塞在那个位置,这个线程只能根据原来添加的handler来处理任务

            EventLoopGroup connectThreadGroup = new NioEventLoopGroup()
            Bootstrap bootstrap = new Bootstrap();
            bootstrap.group(connectThreadGroup)
                    .option(ChannelOption.SO_KEEPALIVE, true)
                    .channel(NioSocketChannel.class)
                    .handler(new ChannelInitializer<SocketChannel>(){
                        @Override
                        protected void initChannel(SocketChannel ch) {
                            ch.pipeline().addLast(
                                    new Decoder(),
                                    new Encoder()
                            );
                        }
                    })
            // 线程会卡在这里
            ChannelFuture channelFuture = bootstrap.connect(hostname, port).sync();
            channelFuture.channel().closeFuture().sync();

 因此我们通常的做法是另起一个线程来与服务器建立连接。

 另一个问题,从代码中我们可以看出,需要添加编码器与解码器,原因就是在netty这个框架中,发送和接收的数据类型只能是ByteBuf,因此,发送其他的数据类型是需要进行编码,收到数据时需要进行解码,否则服务器与客户端是不能正常进行通信的。

 再说这个handler,这个handler就是专门负责处理业务的逻辑实现部分,如果把客户端和服务端建立的连接比作一个水管,数据传送过程比作水在管子里的流动过程,那么handler就可以看作是这个水管上挂着的过滤器,每一个过滤器会对经过的数据进行处理

journey
title Netty 通信过程
section Server
发送数据:5
加1: 4: handler
加2: 4: handler
加3: 4: handler
section Client
接收结果:5

如上图所示,从服务端发送的数据会经过三个handler,而客户端收到的数据就是经过handler处理过的,比如第一个handler会对收到的数字加1,第二个handler会对收到的数字加2,第三个handler会对收到的数字加3。

 那么如果服务端发送一个数字1过去,那么客户端最终会收到数字7。需要注意的是,handler对数据的处理是单向的,也就是说,从客户端发往服务端的数字并不会变化(如果没有其他handler的话)