关于Java你不知道的那些事之NIO使用案例-NIO深入学习( 二 )

上述也提到了 , 因为BIO里面不提供不阻塞的方法 , 因此无法将其改成非阻塞的
NIO但是在NIO里面 , 就提供了让其不阻塞的方法
在之前我们需要创建通信 , BIO的方法如下所示:
ServerSocket serverSocket = new ServerSocket(); serverSocket.bind(new InetSocketAddress(8080));12在NIO里面提出了通道的概念 , 其实代码和上面类似 , 只不过上面是创建了一个Socker连接 , 而下面是创建了一个通道
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); serverSocketChannel.bind(new InetSocketAddress(8080));12我们创建的通道 , 默认是阻塞的 , 但是我们可以通过下面的方式 , 将其设置成非阻塞的
// 设置非阻塞 serverSocketChannel.configureBlocking(false);12下面我们进入while(true)的方法里面 , 因为原来是通过Socket获取到一个连接
// 获取连接 Socket socket = serverSocket.accept();12但是我们都知道 , 上述的连接是阻塞的 , 也就是说如果没有连接过来 , 它会一直阻塞的 , 因此Java提出了一个新的类 , SockerChannel , 它里面 提供了非阻塞的方法
// 设置非阻塞 serverSocketChannel.configureBlocking(false);12完整代码:
/*** NIO版QQ服务器** @author: 轻狂书生FS* @create: 2020-09-28-12:16*/ public class QQServerByNIO {public static void main(String[] args) throws IOException {// 创建一个通道ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();serverSocketChannel.bind(new InetSocketAddress(8080));// 定义list用于存储SocketChannel , 也就是非阻塞的连接List socketChannelList = new ArrayList<>();byte [] bytes = new byte[1024];// 缓冲区ByteBuffer byteBuffer = ByteBuffer.allocate(1024);// 设置非阻塞serverSocketChannel.configureBlocking(false);while(true) {SocketChannel socketChannel = serverSocketChannel.accept();// 但无人连接的时候if(socketChannel == null) {// 睡眠一秒try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("无人连接");for(SocketChannel item: socketChannelList) {int len = item.read(byteBuffer);if(len > 0) {// 切换成读模式byteBuffer.flip();// 打印出结果System.out.println("读取到的数据" + new String(byteBuffer.array(), 0, len));}byteBuffer.clear();}} else {// 但有人连接的时候// 设置成非阻塞socketChannel.configureBlocking(false);// 将该通道存入到List中socketChannelList.add(socketChannel);for(SocketChannel item: socketChannelList) {int len = item.read(byteBuffer);if(len > 0) {// 切换成读模式byteBuffer.flip();// 打印出结果System.out.println("读取到的数据" + new String(byteBuffer.array(), 0, len));}byteBuffer.clear();}}}} }1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768总结欢迎点赞+关注 , 点点关注不迷路 , 谢谢 。


推荐阅读