From 912b4ac090632908d032077d0e2cee3a0defd950 Mon Sep 17 00:00:00 2001 From: zhuyijun Date: Sun, 10 Oct 2021 23:39:40 +0800 Subject: [PATCH] =?UTF-8?q?IO=20=E6=96=87=E4=BB=B6=E9=9B=B6=E6=8B=B7?= =?UTF-8?q?=E8=B4=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- C++书单.md | 157 ++++++++++++++++++ .../netty/nio/selector/NIOClient.java | 1 - .../netty/nio/zerocopy/NewIOClient.java | 29 ++++ .../netty/nio/zerocopy/NewIOServer.java | 30 ++++ .../netty/nio/zerocopy/OldIOClient.java | 29 ++++ .../netty/nio/zerocopy/OldIOServer.java | 26 +++ 6 files changed, 271 insertions(+), 1 deletion(-) create mode 100644 C++书单.md create mode 100644 nettyPro/src/main/java/cn/zyjblogs/netty/nio/zerocopy/NewIOClient.java create mode 100644 nettyPro/src/main/java/cn/zyjblogs/netty/nio/zerocopy/NewIOServer.java create mode 100644 nettyPro/src/main/java/cn/zyjblogs/netty/nio/zerocopy/OldIOClient.java create mode 100644 nettyPro/src/main/java/cn/zyjblogs/netty/nio/zerocopy/OldIOServer.java diff --git a/C++书单.md b/C++书单.md new file mode 100644 index 0000000..88a2655 --- /dev/null +++ b/C++书单.md @@ -0,0 +1,157 @@ +# C++书单 + +------ + +- 《C++ Primer Plus》 + - 看来几章,但是对于对我来讲,太过基础了,没有什么编程知识的人适合看这个 + - 不太可能继续看 +- 《深入实践C++模板编程》 + - 模板元编程的入门书籍,推荐 + - 正在看,我想我会看它第二遍 +- 《深入理解C++11》 + - 推荐:⭐⭐⭐⭐ + - 当前进度:正在看 +- 《C++语言的设计和演化》 + - 推荐: + - 评价: + - 当前进度: +- 《C++程序设计语言》 + - 推荐:⭐⭐⭐⭐⭐ + - 评价: + - C++之父写的,看一遍是绝对不够的!!!!!! + - 这绝对不是什么入门书籍!!!有一定基础的人再来看效果可能更好 + - 当前进度:第16、17章看完了。 暂停 +- 《深入探索C++对象模型》 + - 推荐:⭐⭐⭐⭐⭐ + - 评价:这书真的写的很好,虽然中文翻译不怎么样,如果不是内容太好,我真的撑不下去,会看第二遍 + - 当前进度:看完了 +- 《Effective C++ 》 + - 推荐:❤️❤️❤️❤️❤️ + - 评价: + - 信息密度很高,推荐。 + - 这是我看过的写的最好的技术书籍之一 + - 第6章写的实在太好了,已买书收藏。 + - 会看第二遍 + - 当前进度:看完了,名不虚传, 我觉得是写C++必读的书籍,就算你不打算全部看完,至少也要看完第六章 +- 《More Effective C++ 》 + - 推荐:⭐⭐⭐ + - 评价: + - 感觉我的时间被浪费了 + - 这跟《Effective C++ 》真的是一个作者吗,质量相差太大了,我很失望。 + - 这是我近期读过的技术书中最难看的一本。准确评分应该是三星半。 + - 当前进度:看完了大部分【近期不打算再看了,冷藏】 +- 《C++ Boost程序库完全开发指南》 + - 推荐:⭐⭐⭐⭐⭐ + - 评价: + - 豆瓣评分居然这么多差评,至于吗,(豆瓣)对国产作者也苛刻了吧,为此加一星。 + - 当然,学习boost最好的资料是官方文档,但是谁让我有这本📕呢,我一定会看完它的! + - 当前进度:正在看(暂停) +- 《Effective STL》 + - 当前进度:看到第3节,暂停 +- 《Exceptional C++ 》 +- 《STL源码剖析》 + +------ + +- 2021/5.20: C++语法特性暂停,我觉得我已经学的差不多了,需要一点实践,实践完了之后再回头看。接下来打算看网络编程的书籍 + +------ + +- 《HTTP权威指南》 + - 推荐:💚💚💚 + - 评价:对HTTP协议感兴趣的可以看看,还是挺有用的 + - 当前进度:走马观花的看完了,还是挺有用的 +- 《Linux-UNIX系统编程手册》 + - 推荐:❤️❤️❤️❤️💚 + - 评价:孤篇横绝,竟为大家 + - 当前进度:看到第58章,暂停 +- 《TCP-IP高效编程:改善网络程序的44个技巧》 + - 推荐:💚💚💚💚 + - 评价:谁翻译的?译者语文不好吗?还不如机器翻译呢!!!内容ok,翻译烂 + - 当前进度:正在看 +- 《TCP/IP详解:卷二》 + - 4.4BSD-Lite源码的下载地址: http://ftp.icm.edu.pl/packages/4.4BSD-Lite/ https://pub.allbsd.org/bsd-sources/ +- 《用TCP_IP进行网际互联:设计、实现与内核 (卷2)》 + - 推荐: + - 评价: + - 信息密度很高,读来有种原来如此的感觉,将买书收藏,常看常新 + - 被安利了操作系统课程,以及对Xinu的源码感兴趣了 + - 感觉网友说的“比TCP/IP详解”更好是有道理的 + - 这书的源码网上没有找到。 + - 当前进度:正在看 +- 《用TCP_IP进行网际互联:客户-服务器编程与应用(Linux版) (卷3)》 + - 推荐:❤️❤️❤️💚💚 + - 评价: + - 这书我想买下来收藏,适合有一定基础的人看 + - 第1到17章质量很高,后面的就比较拉胯了 + - 当前进度:看到第26章,暂停 +- 《TCP/IP详解卷1:协议》 + - 推荐: + - 评价: + - 当前进度: + - 正在看(2021/06/07) + - 暂停,因为我觉得它不说人话(2021/06/08) +- 《TCP/IP网络编程》 + - 推荐: + - 评价: +- 《Unix/Linux编程实践教程》 + - 推荐: + - 评价: + - 当前进度: +- 《一本书读懂TCP_IP》 + - 推荐:🌒 + - 评价: 不推荐,为什么这样的书也能出版 + - 当前进度: 已看完 + +------ + +- Linux高性能服务器编程 +- Linux多线程服务器端编程(选看) +- UNIX 环境高级编程 +- UNIX网络编程卷1(必看,五星推荐) + +零.手册类: + +- 《C++程序设计语言(The C++ Programming Language)》 +- 《C++标准程序库(C++ Standard Library Tutorial and Reference) 》 +- 《The C++ IO Streams and Locales》 +- 《The C++ Standard (INCITS/ISO/IEC 14882-2011)》 +- 《Overview of the New C++ (C++11/14) 》 +- 《The Standard C Library》 + +一.初级入门系列: + +- 《C++ Primer》 +- 《Accelerated C++》 +- 《C++编程思想(Thinking in C++) 》 +- 《C++程序设计原理与实践(Programming: Principles and Practice Using C++ )》 +- 《C++初学者指南》 +- 《Visual.C++.2008入门经典》 +- 《面向对象程序设计—C++语言描述》 +- 《数据结构(C++语言版)第三版_邓俊辉》 + +二.实用系列: + +- 《深入浅出设计模式》 +- 《设计模式:可复用面向对象软件的基础》 +- 《HeadFirst设计模式》 +- 《大话设计模式》 + +三.中级进阶系列: + +- 《C++ templates》 +- 《More Exceptional C++》 +- 《Exceptional C++ Style》 +- 《C++编程规范(C++ Coding Standards) 》 +- 《C++ 模板完全指南(C++ Templates: The Complete Guide)》 +- 《Beyond the C++ Standard Library(Boost)》 +- 《C和C++安全编码》 + +四.高级成神系列: + +- 《C++设计新思维-泛型编程与设计模式之应用(Modern C++ Design ) 》 +- 《C++模板元编程(C++ Template Metaprogramming)》 +- 《C++ Concurrency In Action》 +- 《Advanced c++ Programming Styles and Idioms 》 +- 《Real-Time C++ Efficient Object-Oriented and Template Microcontroller Programming》 +- 《Advanced_Metaprogramming_in_Classic_C 》 \ No newline at end of file diff --git a/nettyPro/src/main/java/cn/zyjblogs/netty/nio/selector/NIOClient.java b/nettyPro/src/main/java/cn/zyjblogs/netty/nio/selector/NIOClient.java index 801f79d..d409af9 100644 --- a/nettyPro/src/main/java/cn/zyjblogs/netty/nio/selector/NIOClient.java +++ b/nettyPro/src/main/java/cn/zyjblogs/netty/nio/selector/NIOClient.java @@ -4,7 +4,6 @@ import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SocketChannel; -import java.nio.charset.StandardCharsets; public class NIOClient { public static void main(String[] args) { diff --git a/nettyPro/src/main/java/cn/zyjblogs/netty/nio/zerocopy/NewIOClient.java b/nettyPro/src/main/java/cn/zyjblogs/netty/nio/zerocopy/NewIOClient.java new file mode 100644 index 0000000..85e4970 --- /dev/null +++ b/nettyPro/src/main/java/cn/zyjblogs/netty/nio/zerocopy/NewIOClient.java @@ -0,0 +1,29 @@ +package cn.zyjblogs.netty.nio.zerocopy; + +import java.io.DataOutputStream; +import java.io.FileInputStream; +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.channels.FileChannel; +import java.nio.channels.SocketChannel; + +public class NewIOClient { + public static void main(String[] args) { + String fileName = "C++书单.md"; + try(SocketChannel socketChannel = SocketChannel.open(); + //得到一个文件channel + FileChannel channel = new FileInputStream(fileName).getChannel()) { + socketChannel.connect(new InetSocketAddress("localhost",7001)); + //准备发送 + long startTime = System.currentTimeMillis(); + //linux下一个transferTo 方法可以完成发送 + //在windows下一次调用transferTo只能发送8M,就需要分段传输文件,而且要主要 + // 传输时的位置 + //transferTo 底层使用到零拷贝 + long transferCount = channel.transferTo(0,channel.size(),socketChannel); + System.out.println("发送的总得到字节数 "+ transferCount+" ,耗时: "+(System.currentTimeMillis() - startTime)); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/nettyPro/src/main/java/cn/zyjblogs/netty/nio/zerocopy/NewIOServer.java b/nettyPro/src/main/java/cn/zyjblogs/netty/nio/zerocopy/NewIOServer.java new file mode 100644 index 0000000..5bf0bfa --- /dev/null +++ b/nettyPro/src/main/java/cn/zyjblogs/netty/nio/zerocopy/NewIOServer.java @@ -0,0 +1,30 @@ +package cn.zyjblogs.netty.nio.zerocopy; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.nio.ByteBuffer; +import java.nio.channels.ServerSocketChannel; +import java.nio.channels.SocketChannel; + +public class NewIOServer { + public static void main(String[] args) { + InetSocketAddress inetSocketAddress = new InetSocketAddress(7001); + try (ServerSocketChannel serverSocketChannel = ServerSocketChannel.open()){ + serverSocketChannel.bind(inetSocketAddress); + //创建buffer + ByteBuffer byteBuffer = ByteBuffer.allocate(4096); + while (true){ + SocketChannel socketChannel = serverSocketChannel.accept(); + int readCount = 0; + while (-1 != readCount){ + readCount = socketChannel.read(byteBuffer); + } + //倒带position 设置为 0 mark作废 + byteBuffer.rewind(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/nettyPro/src/main/java/cn/zyjblogs/netty/nio/zerocopy/OldIOClient.java b/nettyPro/src/main/java/cn/zyjblogs/netty/nio/zerocopy/OldIOClient.java new file mode 100644 index 0000000..bca440a --- /dev/null +++ b/nettyPro/src/main/java/cn/zyjblogs/netty/nio/zerocopy/OldIOClient.java @@ -0,0 +1,29 @@ +package cn.zyjblogs.netty.nio.zerocopy; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.FileInputStream; +import java.io.IOException; +import java.net.Socket; + +public class OldIOClient { + public static void main(String[] args) { + String fileName = "C++书单.md"; + try( Socket socket = new Socket("localhost",7001); + FileInputStream fileInputStream = new FileInputStream(fileName); + DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream())) { + byte[] buffer = new byte[4096]; + long readCount; + long total = 0; + long startTime = System.currentTimeMillis(); + while ((readCount = fileInputStream.read(buffer)) >= 0){ + total+=readCount; + dataOutputStream.write(buffer); + } + System.out.println("发送总字节数: "+total +" ,耗时: "+(System.currentTimeMillis() - startTime)); + + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/nettyPro/src/main/java/cn/zyjblogs/netty/nio/zerocopy/OldIOServer.java b/nettyPro/src/main/java/cn/zyjblogs/netty/nio/zerocopy/OldIOServer.java new file mode 100644 index 0000000..7868c06 --- /dev/null +++ b/nettyPro/src/main/java/cn/zyjblogs/netty/nio/zerocopy/OldIOServer.java @@ -0,0 +1,26 @@ +package cn.zyjblogs.netty.nio.zerocopy; + +import java.io.DataInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.net.ServerSocket; +import java.net.Socket; + +public class OldIOServer { + public static void main(String[] args) { + try(ServerSocket serverSocket = new ServerSocket(7001)) { + Socket socket = serverSocket.accept(); + + DataInputStream dataInputStream = new DataInputStream(socket.getInputStream()); + byte[] byteArray = new byte[4096]; + while (true){ + int read = dataInputStream.read(byteArray, 0, byteArray.length); + if (-1 == read){ + break; + } + } + } catch (IOException e) { + e.printStackTrace(); + } + } +}