网络编程
小尘_OnMyWay
身若孤鸿,志在天间。
展开
-
netty-自定义协议(编解码器)
文章目录自定义协议的要素封装的消息实体编解码器的编写防止黏包半包问题自定义协议的要素魔数:第一时间判定是否为无效的包版本号:可支持协议的升级序列化算法:消息正文采用哪种序列化反序列化方式,如json、hessian等指令类型:表明业务类型,登录/注册/…请求序号:为了实现双工通信,提供异步能力正文长度:消息内容长度消息正文:消息的内容封装的消息实体消息正文采用实体Message:package com.throne.netty.test1.diy;import lombok.A原创 2022-04-06 11:33:40 · 859 阅读 · 0 评论 -
netty-搭建简单http服务器
netty中提供了许多定义好的协议,如HTTP编解码器,我们利用它可以快速地开发一个基于netty的web服务器。package com.throne.netty.test1.protocol;import io.netty.bootstrap.Bootstrap;import io.netty.bootstrap.ServerBootstrap;import io.netty.buffer.ByteBuf;import io.netty.channel.*;import io.netty.c原创 2022-04-06 10:35:43 · 1317 阅读 · 0 评论 -
netty-与redis进行简单通信
redis协议约定格式:*3 (命令的词数)$3 (第一个关键词长度)set (第一个关键词)$4name$8zhangsan(每一行末尾都加 回车and换行)package com.throne.netty.test1.protocol;import io.netty.bootstrap.Bootstrap;import io.netty.buffer.ByteBuf;import io.netty.channel.ChannelFuture;import io.net原创 2022-04-06 10:16:10 · 665 阅读 · 0 评论 -
netty之黏包半包问题详解
文章目录黏包问题半包问题出现问题的原因解决方案短连接定长解码器行解码器LTC解码器黏包问题在客户端循环发送十次数据,服务器端会出现黏包现象。ChannelFuture future = bootstrap.handler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) throws原创 2022-04-06 00:20:03 · 581 阅读 · 0 评论 -
netty之future和promise详解
文章目录Future和PromiseJDK Futurenetty Futurenetty PromiseFuture和Promisejdk Future:只能同步等待任务结束才能得到结果netty Future: 可以同步或者异步等待任务结束之后得到结果,继承自jdk Future。netty promise:脱离了任务而独立存在,作为两个线程间传递结果的容器,继承自netty Future。JDK Future一个例子:package com.throne.netty.test1.futu原创 2022-04-05 20:39:12 · 761 阅读 · 0 评论 -
netty之channel详解
文章目录Channelchannel的主要作用channel异步连接处理--channelFuturechannel异步关闭处理--CloseFuture优雅的关闭程序Channelchannel的主要作用close():关闭channelcloseFuture():处理channel的关闭sync 同步等待channel关闭addListener 异步等待channel关闭pipeline():添加处理器write():将数据写入writeAndFlush():将数据写入并刷出原创 2022-04-04 22:37:00 · 2659 阅读 · 1 评论 -
netty之eventloop详解
文章目录EventLoop继承关系线程数选择普通任务与定时任务EventLoop分工细化EventLoopEventLoop本质上是一个单线程执行器(同时维护了一个Selector),内部有run方法处理Channel上的IO事件。继承关系同时继承了ScheduledExecutor定时器,内部包含了线程池的所有方法,进行任务调度;其次继承了OrderedEventExecutor,内部方法能够判断一个线程是否属于当前的EventLoop,并能查看自己属于哪个EventLoopGroup。事原创 2022-04-04 21:45:10 · 1578 阅读 · 0 评论 -
netty入门--helloworld程序
首先给出最简单的CS架构通信的netty程序,实现了客户端向服务器端写入helloworld的功能。服务器端的代码如下:package com.throne.netty.test1;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelHandlerContext;import io.netty.channel.ChannelInboundHandlerAdapter;import io.netty.c原创 2022-04-04 18:46:44 · 281 阅读 · 0 评论 -
NIO基础--零拷贝
在linux2.4之后,java的nio中调用transferTo方法后,直接从用户态切换至内核态,使用DMA将数据读入内核缓冲区,其次只会将一些length和offset信息拷入socket缓冲区,几乎无消耗;使用DMA(硬件完成)进行拷贝,不会使用CPU。可以看到,所谓的零拷贝实际上数据拷贝了两次,第一次是从硬盘到内核缓冲区,第二次是从内核缓冲区到网卡。零拷贝只是不会在JVM中进行拷贝。...原创 2021-10-22 11:35:15 · 165 阅读 · 0 评论 -
NIO基础--多线程优化服务器
在前面的代码实现中,只有一个选择器selector来管理一个线程,并没有充分的利用多核CPU。这里采用多线程对其进行优化,并设置多个selector对其进行管理。采用如下的思想进行优化,设置一个Boss线程,仅仅负责连接的建立;而worker用于读写操作。多线程版服务端代码如下:package org.throne;import lombok.extern.slf4j.Slf4j;import java.io.IOException;import java.net.InetSocke.原创 2021-10-22 11:18:11 · 247 阅读 · 2 评论 -
NIO基础--阻塞与非阻塞
非阻塞模式服务器:package org.throne;import lombok.extern.slf4j.Slf4j;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.ServerSocketChannel;import java.nio.channels.SocketChannel;import java.u原创 2021-10-21 15:15:50 · 222 阅读 · 0 评论 -
NIO基础--bytebuffer基本使用
文章目录使用实例ByteBuffer的结构使用实例利用bytebuffer和channel存储读取文件。package org.throne;import lombok.extern.slf4j.Slf4j;import java.io.FileInputStream;import java.io.IOException;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;/** * @version v1原创 2021-10-20 22:15:01 · 345 阅读 · 0 评论 -
NIO基础--三大组件
NIO non-blocking io 非阻塞IONIO三大组件1. Channel & Bufferchannel是读写数据的双向通道,可以从channel中将数据读入Buffer(缓存),也可以将Buffer中的数据写入channel,channel比stream更底层。常见的channel:FileChannel:文件通道DatagramChannel:UDPSocketChannel:TCP,用于服务器ServerSocketChannel:TCP,一般用于客户端b原创 2021-10-20 21:15:56 · 80 阅读 · 0 评论