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灵活的处理信息。
{{ cmt.username }}
{{ cmt.content }}
{{ cmt.commentDate | formatDate('YYYY.MM.DD hh:mm') }}