Netty NIO 非阻塞模式

1.概要

1.1 说明

使用非阻塞的模式,就可以用一个现场,处理多个客户端的请求了

1.2 要点

  • ssc.configureBlocking(false);
  • if(sc!=null){ sc.configureBlocking(false); channels.add(sc); }
  • if(len>0){ byteBuffer.flip();

2.代码

2.1 服务端代码

package com.xjc.springcloundtest;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.SocketAddress;
import java.net.SocketOption;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

public class Main {
    public static void main(String[] args) throws IOException {
        ByteBuffer byteBuffer = ByteBuffer.allocate(16);
        ServerSocketChannel ssc = ServerSocketChannel.open();
        ssc.configureBlocking(false);
        ssc.bind(new InetSocketAddress(8080));
        List<SocketChannel> channels = new ArrayList<>();
        while (true){
            System.out.println("accept 前");
            SocketChannel sc = ssc.accept();
            System.out.println("accept 后");
            if(sc!=null){
                sc.configureBlocking(false);
                channels.add(sc);
            }
            for (SocketChannel channel: channels){
                System.out.println("read 后");
                int len = channel.read(byteBuffer);
                if(len>0){
                    byteBuffer.flip();
                    while (byteBuffer.hasRemaining()){
                        byte b = byteBuffer.get();
                        System.out.println((char)b);
                    }
                    byteBuffer.clear();
                    System.out.println("read 后");
                }
            }
        }
        //System.out.println("Hello world!");
    }
}

2.2 客户端代码

 

package com.xjc.springcloundtest;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.SocketChannel;

public class Client {
    public static void main(String[] args) throws IOException {
        SocketChannel sc = SocketChannel.open();
        sc.connect(new InetSocketAddress("localhost", 8080));
        System.out.println("Hello world!");
    }
}

2.2 客户端发数据

sc.write(Charset.defaultCharset().encode("hello")

 

3.运行结果

3.1 服务端结果

3.2 客户端结果

2023.3.2\lib\idea_rt.jar" com.xjc.springcloundtest.Client
Connected to the target VM, address: '127.0.0.1:53167', transport: 'socket'
Hello world!

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设你正在为一个重要的大型公司开发一款全新的任务关键型的应用程序。在第一次会议上,你得知该系统必须要能够扩展到支撑 100000 名并发用户,并且不能有任何的性能损失,这时所有的目光都投向了你。你会怎么说呢? 你可以自信地说:“当然,没问题。”然后留下一顿崇拜的目光离开,回来后悄悄打开netty相关知识,开始编程。 什么是NettyNetty 是一款异步的事件驱动的网络应用程序框架,支持快速地开发可维护的高性能的面向协议的服务器和客户端。如果你还得去看这些专业术语 那我这文章就毫无意义,接下来我就用大白话告诉你什么是Netty和他的各种组件。 总所周知,Netty是网络编程方面的东西。Netty就是NIO技术的一套框架,就是对NIO技术的封装。有NIO,自然有IO,大白话就是一个是非阻塞IO,一个是阻塞IO。 早期时候的网络编程是阻塞IO模式,IO就是输入输出,举个例子:你打字就是键盘的输入,输入你要打的东西。阻塞就是类似塞车,总是得卡在半路上,等着前面的车开走了我才能开,这里例子中就是电脑总得等着你输入完 我才能把你输入的东西发给别人。那么是什么在等?就是线程! 阻塞IO模式就是一个客户端连接到服务端,服务端就为每个新的客户端 Socket 创建一个新的 Thread。 Netty的书我帮你看!---什么是Netty 什么是Socket?Socket就是你想用Java代码API去组织数据,指定协议去通讯,很烦!写的太多代码!Socket帮你封装了 你只需要调用一下Socket的方法就行了,省事!回到图1-1,你会发现线程开太多了 ,100000人连接我开100000线程吗,还是一直阻塞的等待用户输入,我开的线程还不能去干其他事,那还叫线程吗?太丢人了! 所以Java推出了NIO,Java 对于非阻塞 I/O 的支持是在 2002 年引入的,位于 JDK 1.4 的 java.nio 包中。解决我刚才说的弊端思路就是如下图 Netty的书我帮你看!---什么是Netty class java.nio.channels.Selector 是 Java 的非阻塞 I/O 实现的关键。它使用了事件通知 API 以确定在一组非阻塞套接字中有哪些已经就绪能够进 行 I/O 相关的操作。继续上面的例子,就是当有人输入了 通过Selector 告诉线程说某个Socket有操作,赶紧处理下,这样就不用开那么多线程了,而且所有Socket都没操作的时候,这个线程还能去干别的事,多自由 这就是书本上说的总体来看,与阻塞 I/O 模型相比,这种模型提供了更好的资源管理: 1.使用较少的线程便可以处理许多连接,因此也减少了内存管理和上下文切换所带来开销; 2.当没有 I/O 操作需要处理的时候,线程也可以被用于其他任务。 可当你想使用NIO的时候发现,哇!还是很麻烦!需要记这么多东西,敲这么多代码,这时候Netty就孕育而生了!!在网络编程领域,Netty是Java的卓越框架。它驾驭了Java高级API的能力,并将其隐藏在一 个易于使用的API之后。Netty使你可以专注于自己真正感兴趣的——你的应用程序的独一无二的价值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值