![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发编程
文章平均质量分 92
介绍并发编程
yitian_hm
变秃了也变强了
展开
-
JSON和ProtoBuf序列化
我们在开发一些远程过程调用(RPC)的程序时,通常会涉及对象的序列化/反序列化的问题,例如一个“Person”对象从客户端通过TCP方式发送到服务器端;因为TCP协议(UDP等这种低层协议)只能发送字节流,所以需要应用层将Java POJO对象序列化成字节流,数据接收端再反序列化成Java POJO对象即可。“序列化”一定会涉及编码和格式化(Encoding & Format),目前我们可选择的编码方式有:使用JSON。将Java POJO对象转换成JSON结构化字符串。基于HTTP协议,在Web应用、移动原创 2022-11-02 19:06:33 · 2434 阅读 · 0 评论 -
echoServer回显服务器
例如,一个服务器处理十万以上的通道,如果一个通道都新建很多重复的Handler实例,就需要上十万以上重复的Handler实例,这就会浪费很多宝贵的空间,降低了服务器的性能。不过,可以肯定的是,第一个入站处理器的channelRead方法的msg实参类型,绝对是ByteBuf类型,因为它是Netty读取到的ByteBuf数据包。显而易见,@Sharable共享的业务处理器,如果需要操作的数据不仅仅是局部变量,则需要进行线程的同步控制,以保证操作是线程层面安全的。这一步很简单,直接复用前面的msg实例即可。原创 2022-11-02 19:03:31 · 961 阅读 · 0 评论 -
Decoder与Encoder重要组件
下面是一个小小的实践案例:整数解码器。其功能是,将ByteBuf缓冲区中的字节,解码成Integer整数类型。按照前面的流程,大致的步骤为:(1)定义一个新的整数解码器——Byte2IntegerDecoder类,让这个类继承Netty的ByteToMessageDecoder字节码解码抽象类。(2)实现父类的decode方法,将ByteBuf缓冲区数据,解码成以一个一个的Integer对象。(3)在decode方法中,将解码后得到的Integer整数,加入到父类传递过来的List实参中。原创 2022-11-02 19:02:46 · 1620 阅读 · 0 评论 -
Netty-bytebuf
Netty提供了ByteBuf来替代Java NIO的ByteBuffer缓冲区,以操纵内存缓冲区。ByteBuf的优势ByteBuf的逻辑部分ByteBuf是一个字节容器,内部是一个字节数组。从逻辑上来分,字节容器内部可以分为四个部分,具体如图6-14所示。第一个部分是已用字节,表示已经使用完的废弃的无效字节;第二部分是可读字节,这部分数据是ByteBuf保存的有效数据,从ByteBuf中读取的数据都来自这一部分;第三部分是可写字节,写入到ByteBuf的数据都会写到这一部分中;第四部分是可扩容字节,表原创 2022-11-02 18:59:00 · 890 阅读 · 0 评论 -
Netty原理与基础
Netty是为了快速开发可维护的高性能、高可扩展、网络服务器和客户端程序而提供的异步事件驱动基础框架和工具。换句话说,Netty是一个Java NIO客户端/服务器框架。基于Netty,可以快速轻松地开发网络服务器和客户端的应用程序。与直接使用Java NIO相比,Netty给大家造出了一个非常优美的轮子,它可以大大简化了网络编程流程。例如,Netty极大地简化TCP、UDP套接字、HTTP Web服务程序的开发。Netty的目标之一,是要使开发可以做到“快速和轻松”。原创 2022-11-02 08:34:43 · 666 阅读 · 0 评论 -
NIO- Handler业务处理器
当业务处理完成后,需要操作Java NIO底层通道时,通过一系列的ChannelOutboundHandler通道出站处理器,完成Netty通道到底层通道的操作。通道会启动该入站操作的流水线处理,在通道注册过的入站处理器Handler的channelReadComplete方法,会被调用到。上面的入站处理器实践案例InHandlerDemo,演示的是入站处理器的工作流程。通道会启动该入站操作的流水线处理,在通道注册过的入站处理器Handler的channelRegistered方法,会被调用到。原创 2022-11-02 08:33:53 · 216 阅读 · 0 评论 -
NIO Selector选择器
用于选择就绪的IO事件的select()方法,有多个重载的实现版本,具体如下:(1)select():阻塞调用,一直到至少有一个通道发生了注册的IO事件。强调一下,select()方法返回的数量,指的是通道数,而不是IO事件数,准确地说,是指发生了选择器感兴趣的IO事件的通道数。换句话说,一旦在通道中发生了某些IO事件(就绪状态达成),并且是在选择器中注册过的IO事件,就会被选择器选中,并放入SelectionKey选择键的集合中。通道和选择器之间的关系,通过register(注册)的方式完成。原创 2022-11-01 07:20:18 · 364 阅读 · 0 评论 -
Reactor反应器模式
这里的IO事件,就是NIO中选择器监控的通道IO事件。主要的升级是引入了一个线程池(ThreadPool),业务处理的代码执行在自己的线程池中,彻底地做到业务处理线程和反应器IO事件线程的完全隔离。当事件发生时,调用attachment方法,可以从选择键取出Handler处理器,将事件分发到Handler处理器中,完成业务处理。在注册serverSocket服务监听连接的接受事件之后,创建一个AcceptorHandler新连接处理器的实例,作为附件,被设置(attach)到了SelectionKey中。原创 2022-11-01 07:19:34 · 396 阅读 · 0 评论 -
NIO Channel(通道)类
实际上,通过read方法读数据,本身是很简单的,比较困难的是,在非阻塞模式下,如何知道通道何时是可读的呢?在阻塞模式下,SocketChannel通道的connect连接、read读、write写操作,都是同步的和阻塞式的,在效率上与Java旧的OIO的面向流的阻塞式读写操作相同。代码中的配置项,如服务器的IP、服务器端口、待发送的源文件名称(带路径)、远程的目标文件名称等配置信息,都是从system.properties配置文件中读取的,通过自定义的NioDemoConfig配置类来完成配置。原创 2022-11-01 07:18:46 · 616 阅读 · 0 评论 -
NIO Buffer类的重要方法
至此,大家都知道了,如何将缓冲区切换成读取模式。调用clear()之后,我们可以看到清空了position的值,即设置写入的起始位置为0,并且写入的上限为最大容量。例子中,IntBuffer是具体的Buffer子类,通过调用IntBuffer.allocate(30),创建了一个Intbuffer实例对象,并且分配了30 * 4个字节的内存空间。一个缓冲区在新建后,处于写入的模式,position写入位置为0,最大可写上限limit为的初始化值(这里是20),而缓冲区的容量capacity也是初始化值。原创 2022-11-01 07:18:13 · 349 阅读 · 0 评论 -
Java -NIO简介
OIO是面向字节流或字符流的,在一般的OIO操作中,我们以流式的方式顺序地从一个流(Stream)中读取一个或多个字节,因此,我们不能随意地改变读取指针的位置。使用的时候,必须使用Buffer的某个子类,例如使用DoubleBuffer,则写入的数据是double类型,如果其capacity是100,那么我们最多可以写入100个double数据。在这个flip翻转过程中,position会进行非常巨大的调整,具体的规则是:position由原来的写入位置,变成新的可读位置,也就是0,表示可以从头开始读。原创 2022-10-30 23:23:04 · 336 阅读 · 0 评论 -
操作系统-四种IO模型
操作系统中的4中常见的io模型原创 2022-10-30 20:26:52 · 1423 阅读 · 0 评论