Java Nio(一)前言

一个小说下载引发的思考

我是一个非常喜欢看小说的人,一次找到一个很好看的小说,我的流量又不够,所以想下载下来看。但是我找了很多网站都找不到这个小说的下载,只有在线观看,于是我就在想有什么方法能下载下来呢。有需求就有动力,这本质上不就是一个http请求和响应吗,那我用java发送这个网站的http请求然后把响应转成字符串,再用正则表达式进行解析,然后再把这些解析后的字节存储到txt中,不就是一本小说了吗。于是就按照这个思路写出第一个爬虫,接着慢慢的从爬小说,到爬图片,爬视频,多线程爬多个视频,多线程爬并且组装同一个视频,再到自动刷课......(当然这些你们肯定不感兴趣,我就不介绍了,爬虫的部分等有时间了再写吧)。然后发现爬取速度的瓶颈还是在网络io,java的线程和操作系统的核心线程是一对一的,大量线程切换很费时间,线程的数量也是有上限的,而且大部分连接都是在等待,线程也就是在阻塞,浪费了大量的cpu时间,也就是说我们没办法通过不断的创建线程来解决。那么怎么才能用小部分线程来监听连接情况,等可以操作网络io的时候再交给业务线程处理呢?答案就是Java Nio。

需要的知识

  • Io模型
  • Java Nio
  • Http请求响应
  • SSL 握手加密解密
  • Java SSLEngine

因为是自己写协议,我们能用到的也只是个socket,所以要了解协议的格式,以http为例,我们需要那些发送的字节中请求头的格式,报文体的格式,请求头和报文体以什么字节分割,响应字节中哪些是响应头哪些是响应体,怎么判断是否读完响应体,相应体字节压缩怎么解压等等,这些都会在后续的文章中细细说明。

代码和使用

所有的代码都在github上 https://github.com/cxsummer/net-nio ,可以自行clone。nio因为是非阻塞的,线程提交后就做别的事情了,所以就不能让当前线程等请求响应完再执行后续代码。那么对于nio我们就使用回调的方式来操作,线程1提交任务,线程2读取完整数据后执行回调。如:

SslService sslService = new SslServiceImpl();
HttpService httpService = new HttpServiceImpl(sslService, threadPool);
IntStream.range(0, 1).forEach(i -> {
    LocalDateTime start = LocalDateTime.now();
    httpService.doGet("https://www.bilibili.com/video/BV1w64y11787?from=search&seid=5135759427111210711", httpResponseVO -> {
        System.out.println(new String(httpResponseVO.getOriginHeader()));
        System.out.println(new String(httpResponseVO.getBody()));
        System.out.println("用时:" + Duration.between(start, LocalDateTime.now()).toMillis());
    }, new LinkedHashMap() {
   
   {
        put("Accept-Encoding", "gzip, deflate");
        put("cookie", "_uuid=ED61076A-4384-3871-77CF-1D5DAC79E25F20193infoc; buvid3=A1F3EA2A-EEF0-4B9B-AD9C-5B92AEEAC7BE18553infoc; CURRENT_FNVAL=80; blackside_state=1; rpdid=|(u~|~~km~)R0J'uYuR~RlJll; buvid_fp=A1F3EA2A-EEF0-4B9B-AD9C-5B92AEEAC7BE18553infoc; buvid_fp_plain=328CBAF9-0B0F-4ED8-8F1B-AE9C1CA827F718564infoc; fingerprint=7a8d81b2349aee547658234afb8661fa; PVID=1; bsource=search_baidu; sid=b58ekf8m; CURRENT_QUALITY=0");
    }});
});
Thread.sleep(2000);
((NioAbstract) httpService).stopNioMonitor();
threadPool.shutdownNow();

目录

  1. Java Nio(二)IO模型
  2. Java Nio(三)Java Nio介绍
  3. Java Nio(四)Java Nio实现HTTP请求
  4. Java Nio(五)Java Nio实现HTTPS请求
  5. Java Nio(六)Java Nio实现高性能HTTP/HTTPS客户端

猜你喜欢

转载自blog.csdn.net/cjc000/article/details/116761154