
网络编程
文章平均质量分 76
一只胡说八道的猴子
共勉!!高处见!
展开
-
Future模式与异步回调模式
写再前面Future模式与异步回调模式二者十分相似又存在区别,所以将两个和在一起进行总结。Future模式什么是Future模式长篇大论用生活中的例子来打个比喻,就像叫外卖。比如在午休之前我们可以提前叫外卖,只需要点好食物,下个单。然后我们可以继续工作。到了中午下班的时候外卖也就到了,然后就可以吃个午餐,再美滋滋的睡个午觉。而如果你在下班的时候才叫外卖,那就只能坐在那里干等着外卖小哥,最后拿到外卖吃完午饭,午休时间也差不多结束了。Future 模式是高并发设计与开发过程中常见的设计模式,原创 2021-11-09 22:04:32 · 2503 阅读 · 2 评论 -
使用Netty实现一套分布式RPC服务
写在前面Netty作为一个异步事件驱动的网络应用框架,可以用于快速开发可维护的高性能服务器和客户端。国内著名的RPC框架Dubbo底层使用的是Netty作为网络通信的。本篇文章我们来探索一下RPC框架的本质以及使用Netty来实现一个简单地RPC框架。什么是RPC概述RPC(Remote Procedure Call)— 远程过程调用,是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程两个或多个应用程序都分布在不同的服务器上,它们之原创 2021-08-10 13:53:57 · 701 阅读 · 1 评论 -
第30讲TCP粘包及拆包解决方案
概述拆包粘包概述拆包和粘包是在socket编程中经常出现的情况,在socket通讯过程中,如果通讯的一端一次性连续发送多条数据包,tcp协议会将多个数据包打包成一个tcp报文发送出去,这就是所谓的粘包。而如果通讯的一端发送的数据包超过一次tcp报文所能传输的最大值时,就会将一个数据包拆成多个最大tcp长度的tcp报文分开传输,这就叫做拆包。TCP是面向连接的,面向流的,提供高可靠性服务。收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发给接收端的包,更有效的发给对方,原创 2021-08-05 11:31:38 · 869 阅读 · 0 评论 -
第29讲Log4j整合到Netty
1.添加对应的依赖 <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <g原创 2021-08-05 11:31:06 · 307 阅读 · 0 评论 -
第28讲Handler链调用机制
概述学前须知netty的组件设计:Netty的主要组件有Channel、EventLoop、ChannelFuture、ChannelHandler、ChannelPipe等ChannelHandler充当了处理入站和出站数据的应用程序逻辑的容器。例如,实现ChannelInboundHandler接口(或ChannelInboundHandlerAdapter),你就可以接收入站事件和数据,这些数据会被业务逻辑处理。当要给客户端发送响应时,也可以从ChannelInboundHandler冲刷数据原创 2021-08-05 11:30:47 · 206 阅读 · 0 评论 -
第27讲Netty编解码机制概述
Netty编解码机制概述通常我们习惯将编码(Encode)称为序列化(serialization),它将对象序列化为字节数组,用于网络传输、数据持久化或者其它用途。反之,解码(Decode)称为反序列化(deserialization),它把从网络、磁盘等读取的字节数组还原成原始对象(通常是原始对象的拷贝),以方便后续的业务逻辑操作。Java序列化相信大多数Java程序员接触到的第一种序列化或者编解码技术就是Java默认提供的序列化机制,需要序列化的Java对象只需要实现java.io.Seria原创 2021-08-05 11:29:55 · 180 阅读 · 0 评论 -
第26讲WebSocket长连接开发
概述实例要求:问题:Http协议是无状态的,浏览器和服务器间的请求响应一次,下一次会重新建立连接,这样的操作极其耗费资源要求:实现基于websocket的长连接的全双工的交互,改变Http协议多次请求的约束,实现长连接,服务器可以发送消息给浏览器实例要求:Http协议是无状态的, 浏览器和服务器间的请求响应一次,下一次会重新创建连接.要求:实现基于webSocket的长连接的全双工的交互改变Http协议多次请求的约束,实现长连接了, 服务器可以发送消息给浏览器客户端浏览器和服务器端会原创 2021-08-04 12:06:52 · 299 阅读 · 0 评论 -
第25讲Netty心跳检测机制
何为心跳顾名思义, 所谓 心跳, 即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确保 TCP 连接的有效性.为什么需要心跳因为网络的不可靠性, 有可能在 TCP 保持长连接的过程中, 由于某些突发情况, 例如网线被拔出, 突然掉电等, 会造成服务器和客户端的连接中断. 在这些突发情况下, 如果恰好服务器和客户端之间没有交互的话, 那么它们是不能在短时间内发现对方已经掉线的. 为了解决这个问题, 我们就需要引入 心跳 机制. 心跳机制的工作原理是: 在转载 2021-08-04 12:06:19 · 472 阅读 · 0 评论 -
第24讲Netty实现群聊系统
概述实例要求:编写一个 Netty 群聊系统,实现服务器端和客户端之间的数据简单通讯(非阻塞)实现多人群聊服务器端:可以监测用户上线,离线,并实现消息转发功能客户端:通过channel 可以无阻塞发送消息给其它所有用户,同时可以接受其它用户发送的消息(有服务器转发得到)目的:进一步理解Netty非阻塞网络编程机制代码实现服务端代码主类package com.pjh.Netty.GroupChat;import com.pjh.Netty.GroupChat.me.ServerH原创 2021-08-04 12:05:46 · 300 阅读 · 0 评论 -
第23讲Netty核心模块组件
1.Bootstrap、ServerBootstrap概述Bootstrap 意思是引导,一个 Netty 应用通常由一个 Bootstrap 开始,主要作用是配置整个 Netty 程序,串联各个组件,Netty 中 Bootstrap 类是客户端程序的启动引导类,ServerBootstrap 是服务端启动引导类方法解析2.Future ,ChannelFuture概述用于保存Channel异步操作的结果Netty 中所有的 IO 操作都是异步的,不能立刻得知消息是否被正确处理。但是可以过原创 2021-08-04 11:59:05 · 147 阅读 · 0 评论 -
第22节Netty实现Http服务
概述实例要求:1.使用IDEA 创建Netty项目2.Netty 服务器在 6668 端口监听,浏览器发出请求 "http://localhost:6668/ "3.服务器可以回复消息给客户端 "Hello! 我是服务器 5 " , 并对特定请求资源进行过滤.目的:Netty 可以做Http服务开发,并且理解Handler实例和客户端及其请求的关系.代码实现TestServer代码package com.pjh.Netty.Http;import com.pjh.Netty.Http原创 2021-08-04 11:58:14 · 343 阅读 · 1 评论 -
第21节Netty异步模型介绍
在netty中I/O操作都是异步执行,所以任何的I/O调用都将立即返回。netty为我们提供了一个ChannelFuture实例,这个实例将会返回关于I/O操作结果或者状态。我们可以通过 addListener()为ChannelFuture添加监听器,这样当相关的操作执行结束之后就会发送消息给监听器。概述1.异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的组件在完成后,通过状态、通知和回调来通知调用者。2.Netty 中的 I/O 操作是异步的,包括 Bin原创 2021-08-04 11:57:42 · 205 阅读 · 0 评论 -
第20节Netty任务队列中的三种场景
概述1.用户自定义的普通任务1 . 用户自定义任务流程 :① 获取通道 : 首先获取 通道 Channel ;② 获取线程 : 获取通道对应的 EventLoop 线程 , 就是 NioEventLoop , 该 NioEventLoop 中封装了任务队列 TaskQueue ;③ 任务入队 : 向任务队列 TaskQueue 中放入异步任务 Runnable , 调用 NioEventLoop 线程的 execute 方法 , 即可将上述 Runnable 异步任务放入任务队列 TaskQueu原创 2021-07-31 19:08:05 · 224 阅读 · 0 评论 -
第19节Netty案例
案例一概述实例要求:使用IDEA 创建Netty项目Netty 服务器在 6668 端口监听,客户端能发送消息给服务器 “hello, 服务器~”服务器可以回复消息给客户端 “hello, 客户端~”目的:对Netty 线程模型 有一个初步认识, 便于理解Netty 模型理论代码实现服务器端主函数package com.pjh.Netty.Test;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.原创 2021-07-31 19:07:48 · 278 阅读 · 0 评论 -
第18节Netty模型概述
Netty模型简单版Netty 主要基于主从 Reactors 多线程模型(如图)做了一定的改进,其中主从 Reactor 多线程模型有多个 Reactor 。1.BossGroup 线程维护Selector , 只关注Accecpt2.当接收到Accept事件,获取到对应的SocketChannel, 封装成 NIOScoketChannel并注册到Worker 线程(事件循环), 并进行维护3.当Worker线程监听到selector 中通道发生自己感兴趣的事件后,就进行处理(就由handler原创 2021-07-31 19:06:56 · 138 阅读 · 0 评论 -
第17节Reactor模式介绍
传统IO模型工作原理图黄色的框表示对象蓝色的框表示线程白色的框表示方法(API)模型特点采用阻塞IO模式获取输入的数据 每个连接都需要独立的线程完成数据的输入,业务处理,数据返回问题分析1.当并发数很大,就会创建大量的线程,占用很大系统资源2.连接创建后,如果当前线程暂时没有数据可读,该线程会阻塞在read 操作,造成线程资源浪费解决方案1.基于 I/O 复用模型:多个连接共用一个阻塞对象,应用程序只需要在一个阻塞对象等待,无需阻塞等待所有连接。当某个连接有新的数据可以处理时,操作系原创 2021-07-31 19:05:38 · 277 阅读 · 0 评论 -
第16节Netty概述
原生NIO存在的问题1.NIO 的类库和 API 繁杂,使用麻烦:需要熟练掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer 等。2.需要具备其他的额外技能:要熟悉 Java 多线程编程,因为 NIO 编程涉及到 Reactor 模式,你必须对多线程和网络编程非常熟悉,才能编写出高质量的 NIO 程序。3.开发工作量和难度都非常大:例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常流的处理等等。4.JDK NIO 的 B原创 2021-07-31 19:04:34 · 102 阅读 · 0 评论 -
第15节AIO带过
1.JDK 7 引入了 Asynchronous I/O,即 AIO。在进行 I/O 编程中,常用到两种模式:Reactor和 Proactor。Java 的 NIO 就是 Reactor,当有事件触发时,服务器端得到通知,进行相应的处理 AIO 即 NIO2.0,叫做异步不阻塞的 IO。2.AIO 引入异步通道的概念,采用了 Proactor 模式,简化了程序编写,有效的请求才启动线程,它的特点是先由操作系统完成后才通知服务端程序启动线程去处理,一般适用于连接数较多且连接时间较长的应用3.目前 AIO原创 2021-07-31 19:03:41 · 97 阅读 · 0 评论 -
第14节FileChannel详解
经过前两篇文章的学习,相信对Channel有了一定的整体性认识。接下来通过学习本篇文章,更进一步认识Channel,学习FileChannel的细节用途特点api原理一.用途传统IO中的FileInputStream和FileOutputStream,相信读者都不陌生。在NIO中提供新的方式对文件进行I/O操作。A channel for reading, writing, mapping, and manipulating a file.上面的描述来自Java SE8中FileCh转载 2021-07-28 09:54:07 · 761 阅读 · 0 评论 -
第13节NIO与零拷贝
1.概述在通过IO进行数据读写时(例如从文件读取数据),需要进行多次的数据拷贝,有些拷贝是通过DMA的方式进行的,有些拷贝是CPU 需要从来源把每一片段的资料复制到暂存器,然后把它们再次写回到新的地方,这种方式效率较低。那所谓的零拷贝就是指在进行IO读写时,尽量减少拷贝次数,尤其是cpu拷贝。零拷贝主要是由操作系统来支持,和java api无关。2.相关概念须知在详细介绍零拷贝前,先需要了解以下个概念:DMA、NIO Gather & Scatter 和mmap2.1 DMA直接内存访问原创 2021-07-28 09:52:19 · 251 阅读 · 0 评论 -
第12节网络编程提升案例之群聊系统实现
案例二群聊系统实现案例要求1.编写一个NIO群聊系统,实现服务器端与客户端之间的数据简单通信(非阻塞)2.实现多人群聊3.服务器端:可以监测用户上线,离线,并实现消息转发功能4.客户端:通过channel 可以无阻塞发送消息给其它所有用户,同时可以接受其它用户发送的消息(有服务器转发得到)5.目的:进一步理解NIO非阻塞网络编程机制需求:进一步理解 NIO 非阻塞网络编程机制,实现多人群聊编写一个 NIO 群聊系统,实现客户端与客户端的通信需求(非阻塞)服务器端:可以监测用户上线,离线,原创 2021-07-28 09:50:49 · 207 阅读 · 0 评论 -
第11节网络编程快速入门案例
案例1NIO非阻塞网络编程快速入门案例要求编写一个NIO入门案例,实现服务端与客户端之间简单的数据通信代码实现服务端代码public class Server { public static void main(String[] args) throws IOException { /*1.获取通道,创建NIO通道*/ ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();原创 2021-07-28 09:50:06 · 108 阅读 · 0 评论 -
第10节JavaNIO常用类解析
1.Channel类详解Java NIO的通道类似流,但又有些不同:既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。通道可以异步地读写。通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。正如上面所说,从通道读取数据到缓冲区,从缓冲区写入数据到通道。如下图所示:Channel的实现这些是Java NIO中最重要的通道的实现:FileChannelDatagramChannelSocketChannelServerSocketChan原创 2021-07-27 11:45:09 · 519 阅读 · 0 评论 -
第9节复用模型三大组件详解
缓冲区概述缓冲区(Buffer):缓冲区本质上是一个可以读写数据的内存块,可以理解成是一个容器对象(含数组),该对象提供了一组方法,可以更轻松地使用内存块,,缓冲区对象内置了一些机制,能够跟踪和记录缓冲区的状态变化情况。Channel 提供从文件、网络读取数据的渠道,但是读取或写入的数据都必须经由 Buffer,如图: 【后面举例说明】由 java.nio 包定义的,所有缓冲区都是 Buffer 抽象类的子类。除了Boolean外其他所有的基本数据类型都有缓冲区。Java NIO 中的 Buf原创 2021-07-27 11:40:13 · 269 阅读 · 0 评论 -
第8节一文读懂Socket
1. 前言最近在研究RDMA的实时流处理系统,其中需要比较RDMA高速网络通信和传统Socket网络通信的传输特点进行比较。所以我们就来总结游戏传统Scoket网络通信的特点,对于一个程序开发人员来说,我们还需要了解Scoket网络通信的底层数据传输知识。2. Socket简介Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主原创 2021-07-27 11:38:00 · 472 阅读 · 0 评论 -
第7节包传输与流传输
你可能需要理解这句话:TCP是流传输协议,UDP是包传输协议。1:TCP流传输协议?、打个比方比喻TCP,你家里有个蓄水池,你可以里面倒水,蓄水池上有个龙头,你可以通过龙头将水池里的水放出来,然后用各种各样的容器装(杯子、矿泉水瓶、锅碗瓢盆)接水。上面的例子中,往水池里倒几次水和接几次水是没有必然联系的,也就是说你可以只倒一次水,然后分10次接完。另外,水池里的水接多少就会少多少;往里面倒多少水,就会增加多少水,但是不能超过水池的容量,多出的水会溢出。结合TCP的概念,水池就好比接收缓存,倒水就相当原创 2021-07-25 14:25:05 · 1696 阅读 · 1 评论 -
第6节TCP是如何管理连接的
在学习Socket的过程中我一直想对底层进行学习,于是就在网上找了许多资料,发现对底层的叙述还是很少,最后终于找到了一篇管理Tcp连接的文章。因为我们知道Socket是对Tcp/ip协议的封装,Socket本身并不是协议,而是一个调用接口APISocket连接与TCP/IP连接的关系创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP或UDP)。当使用TCP协议进行连接时,该Socket连接就是一个TCP连接。socket则是对TCP/IP协议的封装和应用(原创 2021-07-25 14:18:34 · 382 阅读 · 2 评论 -
第4节浅谈BIO
IO模型概述什么是IO模型?即规定用什么样的方式来对数据进行发送和接收,很大程度的觉得了通信的性能。比如使用UDP协议通信的方式就比采用TCP通信的方式高效很大,但是二者的使用也要看不同的使用场景,有的场景使用UDP效果会更好,而有的场景则必须采用TCP。IO模型也是如此,在不同的场景也因该使用不同的IO模型。找对象也是如此,不是好看的有钱的才好,适合自己的才是真的好。名词介绍同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO时,Java自己处理IO读写)。异步 : 委托一小弟拿银.原创 2021-07-11 15:07:17 · 104 阅读 · 0 评论 -
第2节Socket介绍
Socket介绍进程之间是怎么进行通信的在学习Socket之前我们先来了解了解进程之间是怎么进行通信的。本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类:消息传递(管道、FIFO、消息队列)同步(互斥量、条件变量、读写锁、文件和写记录锁、信号量)共享内存(匿名的和具名的)远程过程调用(Solaris门和Sun RPC)但这些都不是本文的主题!我们要讨论的是网络中进程之间如何通信?首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程原创 2021-07-11 15:00:35 · 873 阅读 · 0 评论 -
第3节 从UNIX底层出发一文带你领会 同步 异步 阻塞 非阻塞
写在前面本文的大多数内容大多来自于UNIX网络编程这本书,我觉得要学好网络编程最好都看一下这本书,因为网络编程离不开Socket,而Socket起源于Unix。Unix/Linux 基本哲学之一就是“一切皆文件,套接字的本质就是一种特殊的文件,不过这个特殊特殊在他的背后是一个网络连接。所谓写操作就是向远程主机发送数据,所谓读操作就是接收来自远方主机的信息。本文概述本文将通过案例介绍同步 异步 阻塞 非阻塞的概念同时本文将介绍一下五种IO模型1.阻塞式I/O2.非阻塞式I/O3.I/O复用(s原创 2021-07-09 10:51:38 · 196 阅读 · 2 评论 -
第1节Netty概述
Netty简介1.Netty是由JBOSS提供的一个Java开源框架,是Gitthub上的开源项目2.Netty是一个异步的,基于事件驱动的网络应用框架,用以快速开发高性能,高可靠的网络IO程序3.Netty主要针对TCP协议下,面向Client端的高并发应用,或者Peer-to-Peeer场景下的大量数据持续性传输的应用4.Netty本质上是一个NIO框架,适用于服务器通讯相关的多种应用场景5.在学习Netty之前应该先学习学习NIO 【Netty架构图解】一原创 2021-06-04 22:42:48 · 183 阅读 · 1 评论