一、前言
从Java1.4开始, Java引入了non-blocking IO,简称NIO。NIO与传统socket最大的不同就是引入了Channel和多路复用selector的概念。传统的socket是基于stream的,它是单向的,有InputStream表示read和OutputStream表示写。而Channel是双工的,既支持读也支持写,channel的读/写都是面向Buffer。 NIO中引入的多路复用Selector机制可使一个线程同时监听多个Channel上发生的事件。 虽然Java NIO相比于以往确实是一个大的突破,但是如果要真正上手进行开发,且想要开发出好的一个服务端网络程序,那么你得要花费一点功夫了,毕竟Java NIO只是提供了一大堆的API而已,对于一般的软件开发人员来说只能呵呵了。因此,社区中就涌现了很多基于Java NIO的网络应用框架,其中以Apache的Mina,以及Netty最为出名。
注:本篇就以netty为例讲解,项目结构:
二、server-服务端
/**
* server 启动程序
*/
public class ChatServer {
public static void main(String[] args) throws InterruptedException {
//创建两个线程池
NioEventLoopGroup boos = new NioEventLoopGroup();//处理 连接 用的
NioEventLoopGroup works = new NioEventLoopGroup();//处理具体事件 用的
try {
//创建一个服务端
ServerBootstrap serverbootstrap = new ServerBootstrap();
//将线程池添加到服务中 配置channel 配置处理程序
serverbootstrap.group(boos,works).channel(NioServerSocketChannel.class).childHandler(new ChatServerInit()).option(ChannelOption.SO_BACKLOG,128).childOption(ChannelOption.SO_KEEPALIVE,true);
//配置最大连接数128个 设置连接状态为 保持连接(长连接,一直保持会话)
System.out.println("服务端启动了......");
//为防止程序挂掉,设置为异步
ChannelFuture chac = serverbootstrap.bind(4212).sync();
chac.channel().closeFuture().sync();
}finally {
//关掉服务
boos.shutdownGracefully();
works.shutdownGracefully();
}
}
}
/**
* 服务端 初始化程序
*/
public class