目录

很有名 の weblog

标签: netty (10)

Netty中的线程模型

Netty中的线程模型

netty实现文件服务-下载

HTTP中的异步大文件流 一、引子 平常使用爬虫获取的数据太多,图片视频之类的东西,下载不完,那为什么不直接在服务器搭建一个文件服务呢! 二、步骤 2.1 搭建maven项目 那为了简单起见,所以这里直接新建一个springboot项目,搭建过程就不赘述了。 2.2 添加依赖,jar插件 netty的依赖 <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.50.Final</version> </dependency> 考虑到要部署到服务器上,所以maven添加jar包的插件 <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId&g....

从无到有,Netty基于SSL实现信息传输过程中双向加密验证

一、前提: 感谢以下博客给到的启发,完成了这篇内容 netty案例,netty4.1中级拓展篇十三《Netty基于SSL实现信息传输过程中双向加密验证》 Netty SSL双向验证 Error while creating a CSR netty中实现双向认证的SSL连接 OpenSSL主配置文件openssl.cnf 二、正文 2.1 SSL 首先了解什么是SSL,SSL(安全套接字层)是一种标准安全协议,用于在在线通信中建立Web服务器和浏览器之间的加密链接。 对于这个概念的理解,让我印象深刻的是下面这幅图 翻译版 这是SSL工作的大致过程。 知道这些就足够了进行下面的工作了 2.2 使用openssl生成客户端私钥公钥和服务端私钥公钥 这一步也是最容易卡壳的一步,网上很多文章有的介绍太详细让人云里雾里,有的太粗略不知道啥玩意儿 这里只讲最简单的一种,并罗列了实践时碰到的问题: 2.2.1 下载Windows版openssl 下载地址:windows版openssl 为什么不使用linux版的openssl? 配置比较复杂,可能搞晕新手 2.2.2 选择一个目录进行安装 2....

【转载】Java中的零拷贝

原文出自知乎:Java中的零拷贝 Java中的零拷贝 先提出两个问题: IO过程中,哪些步骤进行了拷贝?哪些地方零拷贝? Java支持哪些零拷贝? 带着这俩问题,我们一起来看下面的探究。 哪里听说过零拷贝?真的0次拷贝吗? 相信大家伙在以往的学习中,或多或少在下面这些组件、框架中有听说过零拷贝 (Zero-Copy)? Kafka Netty rocketmq nginx apache 什么是零拷贝? 零拷贝(英语: Zero-copy) 技术是指计算机执行操作时,CPU不需要先将数据从某处内存复制到另一个特定区域。这种技术通常用于通过网络传输文件时节省CPU周期和内存带宽。 ➢零拷贝技术可以减少数据拷贝和共享总线操作的次数,消除传输数据在存储器之间不必要的中间拷贝次数,从而有效地提高数据传输效率 ➢零拷贝技术减少了用户进程地址空间和内核地址空间之间因为上:下文切换而带来的开销 可以看出没有说不需要拷贝,只是说减少冗余[不必要]的拷贝。 LinuxI/O机制及零拷贝介绍 IO中断与DMA IO中断,需要CPU响应,需要CPU参与,因此效率比较低。 用户进程需要读取磁盘数据,需....

1分钟实现netty简单聊天室

这个例子实现的聊天室可以多人在线聊天,SSL加密 SecureChatServer package run.runnable.securechat; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; import io.netty.handler.ssl.SslContext; import io.netty.handler.ssl.SslContextBuilder; import io.netty.handler.ssl.util.SelfSignedCertificate; /**....

对NIO 中channel的理解

Channel NIO 中 一个 连接 就是 用 一个 Channel( 通道) 来 表示。 大家知道, 从更广泛 的 层面 来说, 一个 通道 可以 表示 一个 底层 的 文件 描述 符, 例如 硬件 设备、文件、 网络 连接 等。 然而, 远远 不止 如此, 除了 可以 对应 到底 层 文件 描述 符, Java NIO 的 通道 还可以 更加 细化。 例如, 对应 不同 的 网络 传输 协议 类型, 在 Java 中 都有 不同 的 NIO Channel( 通道) 实现。 Channel( 通道) 的 主要 类型 这里 不对 纷繁 复杂 的 Java NIO 通道 类型 进行 过多 的 描述, 仅仅 聚焦 于 介绍 其中 最为 重要的 四种 Channel( 通道) 实现: FileChannel、 SocketChannel、 ServerSocketChannel、 DatagramChannel。 对于 以上 四种 通道, 说明 如下: (1) FileChannel 文件 通道, 用于 文件 的 数据 读写。 (2) SocketChannel 套 接 字 通道, 用....

【转载】NIO ByteBuffer的allocate与allocateDirect区别(HeapByteBuffer与DirectByteBuffer的区别)

其中allocateDirect分配的字节缓冲区用中文叫做直接缓冲区(DirectByteBuffer),用allocate分配的ByteBuffer叫做堆字节缓冲区(HeapByteBuffer).. 其实根据类名就可以看出,HeapByteBuffer所创建的字节缓冲区就是在jvm堆中的,即内部所维护的java字节数组。而DirectByteBuffer是直接操作操作系统本地代码创建的内存缓冲数组(c、c++的数组)。 一、测试代码测试 由于DirectByteBuffer操作的缓冲区是通过操作系统本地代码创建的,对于java来说创建和销毁DirectByteBuffer更消耗性能。而HeapByteBuffer内部是直接创建的java数组,对于java来说更快。可以根据下面的测试代码测试: public static void directAndHeapSpeedCompare(){ int length=1000000; directExecuteTime(length); heapExecuteTime(length); } private static void direc....

Netty的复习【3】Buffer、NIO

Buffer ByteBuffer可以理解为放在内存中的一个数组。Buffer是一个抽象类,它的具体实现有 ByteBuffer,CharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBuffer,DoubleBuffer。为什么没有string,用char代替了。 在这些类型中,使用最多的是ByteBuffer,可以在网络上进行传输。 该图描述的是Buffer的分配、读写和常用操作 原生JDK网络编程- Buffer capacity 作为一个内存块,Buffer有一个固定的大小值,也叫“capacity”.你只能往里写capacity个byte、long,char等类型。一旦Buffer满了,需要将其清空(通过读数据或者清除数据)才能继续写数据往里写数据。 position 当你写数据到Buffer中时,position表示当前的位置。初始的position值为0.当一个byte、long等数据写到Buffer后, position会向前移动到下一个可插入数据的Buffer单元。position最大可为capacity – 1. 当读取....

Netty的复习【2】AIO

水平触发和边缘触发 水平触发Level_triggered 当被监控的文件描述符上有可读写事件发生时,epoll_wait()会通知处理程序去读写。如果这次没有把数据一次性全部读完(如读写缓冲区太小),那么下次调用epoll_wait()时,它还会通知你在上没读写万的文件描述符上继续读写,当然如果你一直不去读写,它会一直通知你!!!如果系统中有大量你不需要读写的就绪文件描述符,而它们每次都会返回,这样会大大降低处理程序检索自己关心的就绪文件描述符的效率。 边缘触发Edge_triggered 当被监控的文件描述符上有可读写事件发生时,epoll_wait()会通知处理程序去读写。如果这次没有把数据全部读写完(如读写缓冲区太小),那么下次调用epoll_wait()时,它不会通知你,也就是它只会通知你一次,知道该文件描述符上出现第二次可读写事件才会通知你!!!这种模式比水平触发效率高,系统中不会充斥大量你不关心的就绪文件描述符!! select(),poll()模型都是水平触发模式,信号驱动IO是边缘触发模式,epoll()模型即支持水平触发,也支持边缘触发,默认是水平触发。 原生的JD....

Netty的复习【1】

OSI七层模型【记不太清了,要好好复习一下】 OSI七层模型各层作用 物理层 物理层并不是物理媒体本身,它只是开放系统中利用物理媒体实现物理连接的功能描述和执行连接的规程。 DTE、DCE DTE数据终端:手机 DCE数据通信设备:光猫 作用 1.提供数据传输的实际通道 2.传输数据 数据链路层 数据链路的建立,拆除,对数据的检错,纠错是数据链路层的基本任务。 网卡可以看作独立的数据链路层产品。 网络层 路由选择和中继,在一条数据链路上复用多条网络连接 传输层 定义传输数据的协议端口号,以及流控和差错校验。 会话层 建立、管理、终止会话 表示层 把应用层提供的信息变换为能够共同理解的形式 应用层 网络服务与最终用户的一个接口 TCP/IP协议 端口号:端口号用来识别同一台计算机中进行通信的不同应用程序。因此,也被称为程序地址。 三次握手 首先标志位SYN置为1,客户端将这个报文发送给服务器端。 然后客户端的状态变为SYN_CENT,然后服务端把SYN,ACK标志位置为1,大写的ACK和小写的ack并不一样,小写的ack表示一个具体的值,seq=K中的K值为随机数,然后服务端....