FEIQQ学习总结--Netty

zhy

发布于 2020.02.13 19:10 阅读 2505 评论 0

    FEIQQ是一个基于Netty的即时通讯软件,看了FEIQQ的源码后,在这里做一下总结。

 

软件原理:

 

     本软件主要运用了mysql数据库技术进行数据处理,netty技术实现客户端与服务器交互。Netty提供异步非阻塞、事件驱动、高性能、高可靠、高可定制性的网络应用程序和工具,可用于开发服务端和客户端。

 

实现思路:

 

    程序在启动时会调用Server类和Client类的start方法,start方法包含了netty的使用,包括以下几步:

1. 新建服务netty boot并加入相关线程组(ServlerBootStrap和BootStrap)。

2. 实现出站数据分包组包规则(LengthFieldBasedFrameDecoder和LengthFieldPrepender)。

3. 添加自定义的ChannelHandler(ClientHandler和ServerHandler)。ChannelHandler实现了程序的主要功能,即处理客户端和服务端发送的信息。

 

代码实现:

public void startServer() {
		EventLoopGroup bossGroup = new NioEventLoopGroup();
		EventLoopGroup workerGroup = new NioEventLoopGroup();
		try {
			ServerBootstrap bootstrap = new ServerBootstrap();
			bootstrap.group(bossGroup, workerGroup);
			bootstrap.channel(NioServerSocketChannel.class);
			bootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
				@Override
				protected void initChannel(SocketChannel ch) throws Exception {
					ch.pipeline().addLast(new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 0, 2, 0, 2));
					ch.pipeline().addLast(new LengthFieldPrepender(2, false));
					ch.pipeline().addLast(new ServerHandler(map, clientMap));
				}
			});

			//如果在两小时内没有数据的通信时,TCP会自动发送一个活动探测数据报文。
			bootstrap.option(ChannelOption.SO_KEEPALIVE, true);

			//绑定端口,同步等待成功
			ChannelFuture future = bootstrap.bind(Constants.SERVER_PORT).sync();
			System.err.println("IP地址为:"+Constants.SERVER_IP+"端口为:"+Constants.SERVER_PORT);

			//关闭监听端口,同步等待
			future.channel().closeFuture().sync();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			bossGroup.shutdownGracefully();
			workerGroup.shutdownGracefully();
		}
	}

 

结构示意图:

 

        Netty的bossGroup负责轮询处理客户端的连接请求,生成NioSocketChannel,并将NioSocketChannel注册到workerGroup的其中一个NioEventLoop线程的Selector上,然后轮询读写操作,读写事件发生时处理。

 

        实现效果:

 

 

心得体会:

 

   通过阅读源码,体会到了Netty的可靠性和实用性,与BIO和NIO相比,Netty具有以下优点:

1. 使用简单,更容易上手,开发门槛低。

2. 框架的功能强大,预置了多种编解码功能,支持多种主流协议。

3. 高性能,高稳定性,解决了NIO的bug。

4. 定制能力高,可以通过ChannelHandler灵活的处理信息。