
Java网络编程
文章平均质量分 91
zhaoliwen是猪啊
这个作者很懒,什么都没留下…
展开
-
Netty编程(十)—— 参数优化
Netty编程(十)—— 参数优化文章目录Netty编程(十)—— 参数优化CONNECT_TIMEOUT_MILLIS使用源码分析SO_BACKLOG三次握手与连接队列作用默认值TCP_NODELAYSO_SNDBUF & SO_RCVBUFALLOCATOR使用RCVBUF_ALLOCATORCONNECT_TIMEOUT_MILLIS属于 SocketChannal 的参数用在客户端建立连接时,如果在指定毫秒内无法连接,会抛出 timeout 异常注意:Netty 中不要用成了SO原创 2021-11-29 20:58:12 · 1952 阅读 · 0 评论 -
Netty编程(九)—— 协议设计与解析
Netty编程(九)—— 协议设计与解析文章目录Netty编程(九)—— 协议设计与解析Redis协议HTTP协议自定义协议组成要素编码器解码器编写测试类TCP/IP 中消息传输基于流的方式,没有边界,而协议的目的就是划定消息的边界,制定通信双方要共同遵守的通信规则Redis协议如果我们要向Redis服务器发送一条set name Nyima的指令,需要遵守如下协议// 该指令一共有3部分,每条指令之后都要添加回车与换行符*3\r\n// 第一个指令的长度是3$3\r\n// 第一个指令是原创 2021-11-28 10:50:55 · 1203 阅读 · 0 评论 -
Netty编程(八)—— 粘包半包(二)
Netty编程(八)—— 粘包半包(二)文章目录Netty编程(八)—— 粘包半包(二)短链接定长解码器行解码器长度字段解码器参数解析参数图解例子在上一篇博客《Netty编程(七)—— 粘包半包(一)》中介绍了一下什么是粘包和半包,这篇博客将继续介绍Netty如何处理粘包半包问题。短链接短链接的思路是客户端每次向服务器发送数据以后,就与服务器断开连接,此时的消息边界为连接建立到连接断开。这时便无需使用滑动窗口等技术来缓冲数据,则不会发生粘包现象。但如果一次性数据发送过多,接收方无法一次性容纳所有数据原创 2021-11-27 21:15:36 · 465 阅读 · 0 评论 -
Netty编程(七)—— 粘包半包(一)
Netty编程(七)—— 粘包半包文章目录Netty编程(七)—— 粘包半包粘包现象半包现象现象分析粘包半包本质粘包现象以下面这个例子来说一下什么是粘包,下面这个是一个客户端的代码,它的任务很简单,就是向服务端连发十次0到15(十进制的字节00到0f):public class StudyClient { static final Logger log = LoggerFactory.getLogger(StudyClient.class); public static void m原创 2021-11-26 22:32:49 · 505 阅读 · 0 评论 -
Netty编程(六)—— 实现一个回显Echo程序
Netty编程(六)—— 实现一个回显Echo程序文章目录Netty编程(六)—— 实现一个回显Echo程序Echo服务端Echo客户端结果之前五篇关于Netty的博客介绍了关于Netty的基础使用方法,这篇博客实现一个简单的Netty程序,他首先能够实现客户端和服务器的交互,客户可以任意输入内容(可以以某一命令结束客户端,例如quit),并将该内容发送给服务端,服务端接收到发来的消息后显示消息,并发送同样的消息给客户端,至此一次交互结束。这就是本篇博客要实现的Echo服务端和客户端的功能。Echo服原创 2021-11-25 15:57:01 · 733 阅读 · 0 评论 -
Netty编程(五)—— ByteBuf
Netty编程(四)—— ByteBuf文章目录Netty编程(四)—— ByteBuf创建直接内存与堆内存池化与非池化组成写入创建ByteBuf 可以通过ByteBufAllocator选择allocator并调用对应的 buffer( )方法来创建的,默认使用直接内存作为ByteBuf,容量为256个字节,可以指定初始容量的大小。public class ByteBufStudy { public static void main(String[] args) {原创 2021-11-24 19:23:19 · 1531 阅读 · 1 评论 -
Netty编程(四)—— Future与Promise
Netty编程(四)—— Future与Promise文章目录Netty编程(四)—— Future与Promise概念JDK FutureNetty FutureNetty Promise概念netty 中的 Future 与 jdk 中的 Future 同名,但是是两个接口,netty 的 Future 继承自 jdk 的 Future,而 Promise 又对 netty Future 进行了扩展(继承)jdk Future 只能同步等待任务结束(或成功、或失败)才能得到结果netty F原创 2021-11-23 16:17:13 · 696 阅读 · 0 评论 -
Netty编程(三)—— Channel
Netty编程(三)—— Channel文章目录Netty编程(三)—— ChannelChannel常用方法为什么需要sync()分析原因解决方法处理关闭Channel常用方法close() 可以用来关闭ChannelcloseFuture() 用来处理 Channel 的关闭事件sync 方法作用是同步等待 Channel 关闭而 addListener 方法是异步等待 Channel 关闭pipeline() 方法用于添加处理器write() 方法将数据写入因为缓冲机制,数原创 2021-11-22 20:07:54 · 2132 阅读 · 0 评论 -
Netty编程(二)—— EventLoop
Netty编程(二)—— EventLoop文章目录Netty编程(二)—— EventLoopEventLoop和EventLoopGroupEventLoop的使用处理IO事件分工细化细化1细化2如何切换EventLoop和EventLoopGroup事件循环对象 EventLoop 本质是一个单线程执行器(同时维护了一个 Selector),里面有 run 方法处理一个或多个 Channel 上源源不断的 IO 事件。事件循环组 EventLoopGroup 是一组 EventLoop,C原创 2021-11-22 13:51:17 · 695 阅读 · 0 评论 -
Netty编程(一)—— 初识Netty+超全注释
Netty编程(一)—— 初识Netty文章目录Netty编程(一)—— 初识Netty什么是NettyHello World服务端之前的博客介绍了NIO网络编程的相关知识,从这篇博客开始,我将开始介绍Netty的相关知识。什么是NettyNetty 是一个异步的、基于事件驱动的网络应用框架,可用于快速开发可维护、高性能的网络服务器和客户端基于事件驱动意思是底层实现采用多路复用技术(selector),事件发生时才需要进行处理异步是指使用了多线程完成方法调用和处理结果相分离,并不是异步IO原创 2021-11-21 19:59:14 · 1105 阅读 · 0 评论 -
NIO网络编程(十)—— 零拷贝技术
NIO网络编程(十)—— 零拷贝技术文章目录NIO网络编程(十)—— 零拷贝技术传统的IO分析NIO优化零拷贝技术零拷贝技术1零拷贝技术2零拷贝技术的特点传统的IO分析如果要将一个文件从本地磁盘通过网络传输到另一台主机上,传统的IO会通过如下的代码,这段代码的步骤就是读取文件、将文件内容存到字节数组中、通过socket发送字节数组。File f = new File("helloword/data.txt");RandomAccessFile file = new RandomAccessFile原创 2021-11-19 15:53:41 · 923 阅读 · 0 评论 -
NIO网络编程(九)—— 再探NIO、BIO概念
NIO网络编程(九)—— 再探NIO和BIO文章目录NIO网络编程(九)—— 再探NIO和BIO前面在《NIO网络编程(一)—— BIO和NIO》中介绍了BIO、伪异步IO以及NIO的基本概念,之后的七篇博客介绍了NIO编程的相关知识,这篇博客是NIO网络编程的结尾,讲解一下关于NIO和BIO的概念知识。...原创 2021-11-18 20:06:04 · 561 阅读 · 0 评论 -
NIO网络编程(八)—— 多线程优化服务端
Netty编程(八)—— 多线程优化服务端文章目录Netty编程(八)—— 多线程优化服务端多线程架构Worker类的实现多Worker服务端代码多线程架构之前说到的服务端程序都是在一个线程上进行的,这个线程不仅负责连接客户端发来的请求,同时还要处理读写事件,这样效率还是不够高。如今电脑都是多核处理器,这意味着可以同时进行多个线程,所以服务端应该充分利用这一点。服务端线程可以建立多个线程,将这些线程分成两组:其中一个线程专门处理 accept 事件,称为Boss线程创建 cpu 核心数的线程,原创 2021-11-16 19:35:24 · 821 阅读 · 0 评论 -
NIO网络编程(七)—— nio.Selector之读写事件
Netty编程(七)—— nio.Selector之读写事件文章目录Netty编程(七)—— nio.Selector之读写事件读事件删除事件上一篇博客《Netty编程(六)—— nio.Selector之基本使用》介绍了selector以及如何处理连接事件,这篇博客介绍如何处理selector的读写事件。读事件在Accept事件中,若有客户端与服务器端建立了连接,需要将其对应的SocketChannel设置为非阻塞,并注册到选择其中,对其添加关注read事件,当客户端发来消息后服务器channel原创 2021-11-15 20:01:22 · 897 阅读 · 0 评论 -
NIO网络编程(六)—— nio.Selector之基本使用
Netty编程(六)—— nio.Selector(一)文章目录Netty编程(六)—— nio.Selector(一)Selector 总述Selector 使用方法之前的博客里说到《Netty编程(一)—— BIO和NIO》提到NIO三大组件中有一个叫selector的组件,它能够对多个channel进行选择。上一篇博客《Netty编程(五)—— NIO模块下的阻塞和非阻塞模式》中提到了channel、buffer的非阻塞模式下会有cpu空转的问题,因此在这一篇博客中介绍selector,它能够解决原创 2021-11-14 10:18:35 · 1049 阅读 · 0 评论 -
NIO网络编程(五)—— NIO模块下的阻塞和非阻塞模式
Netty编程(五)—— NIO模块下的阻塞和非阻塞模式文章目录Netty编程(五)—— NIO模块下的阻塞和非阻塞模式阻塞阻塞模式的设计阻塞模式的分析非阻塞非阻塞模式的设计非阻塞模式的分析阻塞阻塞模式的设计阻塞模式下,相关方法都会导致线程暂停ServerSocketChannel.accept 会在没有连接建立时让线程暂停,即使之后有客户端向服务端发送消息,服务端也接受不到,直到有新客户端连接服务端,不再阻塞在accept方法上。SocketChannel.read 会在通道中没有数据可读原创 2021-11-12 09:48:21 · 1185 阅读 · 0 评论 -
NIO网络编程(四)—— 文件编程
Netty编程(四)—— 文件编程文章目录Netty编程(四)—— 文件编程FileChannel创建FileChannel读取内容写入内容关闭FileChannel的位置强制写入两个FileChannel传输数据transferTo方法传输超过2GPath和PathsFiles查找创建拷贝移动删除walkFileTree方法使用walkFileTree统计拷贝多级目录FileChannelFileChannel是一个对文件进行操作的通道,需要注意的是,FileChannel只能在阻塞模式下工作,因此原创 2021-11-11 22:35:07 · 844 阅读 · 0 评论 -
NIO网络编程(三)—— 分散读和集中写
Netty编程(三)—— 分散读和集中写文章目录Netty编程(三)—— 分散读和集中写分散读集中写这一篇博客中想记录下一种思想和方法——分散读和集中写。分散读分散读是当要读取一部分数据,并且这部分数据最后要送入不同的Buffer中,一种方法是先把他全部都进来,然后分给不同的Buffer,另一种就是使用一个channel,将数据直接送入不同的Buffer中,需要注意的是,这些Buffer的大小应该设置成他应该存入数据的大小。channel中有read()函数,参数可以是一个buffer,也可以是一个原创 2021-11-10 15:15:26 · 933 阅读 · 0 评论 -
NIO网络编程(二)—— nio.ByteBuffer基础操作
Netty编程(二)—— nio.ByteBuffer基础操作文章目录Netty编程(二)—— nio.ByteBuffer基础操作总述核心属性创建缓冲区allocateallocateDirectByteBuffer常用方法put()flip()get()rewind()clean()compact()mark()和reset()缓冲区和字符串的相互转换方法一方法二方法三总述流和通道之间的关键区别在于流是基于字节的,而通道是基于块的。流设计为按顺序一个字节接一个字节地传送数据。不同的是,通道会传送缓原创 2021-11-10 10:44:48 · 294 阅读 · 0 评论 -
NIO网络编程(一)—— BIO和NIO
Netty编程(一)—— BIO和NIO文章目录Netty编程(一)—— BIO和NIO什么是BIO伪异步IONIO网络中的阻塞状态三大组件缓冲区 Buffer通道 Channel多路复用器Selector什么是BIO网络编程的基本模型是Client/Server模型,也就是两个进程之间通过网络相互通信,其中服务端提供位置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的地址发起连接请求,通过三次握手建立连接,如果连接建立成功,双方就可以通过网络套接字(Socket)进行通信。在基于原创 2021-11-09 15:00:48 · 416 阅读 · 0 评论 -
Java网络编程(八)—— 组播和MulticastSocket
Java网络编程(八)—— 组播和MulticastSocket文章目录Java网络编程(八)—— 组播和MulticastSocket什么是组播MulticastSocket类总述构造方法与组播组通信设置和获取 MulticastSocket 属性MuliticastSocket示例MuliticastSocket 接收方MuliticastSocket 发送方什么是组播网络数据传播按照接收者的数量,可分为以下3种方式。单播:提供点对点的通信。发送者每次发送的数据有着唯一的目的地址,只被一个接收原创 2021-11-08 15:30:46 · 4298 阅读 · 0 评论 -
Java网络编程(七)—— UDP编程(二)
Java网络编程(七)—— UDP编程(二)文章目录Java网络编程(七)—— UDP编程(二)DatagramPacket构造函数接收数据报的构造函数发送数据报的构造函数get方法public InetAddress getAddress()public int getPort()public SocketAddress getSocketAddress()public byte[] getData()public int getLength()public int getOffset()set方法pu原创 2021-11-07 19:33:24 · 371 阅读 · 0 评论 -
Java网络编程(六)—— UDP编程(一)
Java网络编程(五)—— UDP编程(一)文章目录Java网络编程(五)—— UDP编程(一)总述与TCP不同的是UDP例子UDP客户端UDP服务端结果总述前面讲到的Socket是在TCP传输层协议之上运行的网络应用程序。除了可以选择TCP传输数据以外,还可以使用用户数据报协议(User Datagram Protocol,UDP),UDP是在IP之上发送数据的另一种传输层协议,速度很快,但不可靠。当发送UDP数据时,无法知道数据是否会到达,也不知道数据的各个部分是否会以发送时的顺序到达。不过,确实原创 2021-11-06 22:46:59 · 772 阅读 · 0 评论 -
Java网络编程(五)—— ServerSocket(二)
Java网络编程(五)—— ServerSocket(二) Java网络编程(五)—— ServerSocket(二)请求队列长度接受和关闭与客户端的连接多线程服务器关闭服务器Socket获取ServerSocket信息在上一篇博客《Java网络编程(四)—— ServerSocket(一)》介绍了什么是服务端Socket以及如何使用服务端Socket,这篇博客继续介绍ServerSocket其他的知识点。请求队列长度当服务器进程运行时,可能会同时监听到多个客户的连接请求。例如,每当一个客户进程执行原创 2021-11-04 21:08:44 · 867 阅读 · 0 评论 -
Java网络编程(四)—— ServerSocket(一)
Java网络编程(四)—— ServerSocket(一) Java网络编程(四)—— ServerSocket(一)总述创建ServerSocket绑定端口使用ServerSocket总述之前《Java网络编程(三)—— Socket》介绍了客户端Socket。不过,只有客户端socket还不够,如果不能与服务器对话,客户端并没有什么用处,因此需要一个一直等待客户端连接的服务端。服务器就像坐在电话旁等电话的接线员。他们不知道谁会打电话,或者什么时间打电话,只知道当电话铃响时,就必须拿起电话与之对话,原创 2021-11-04 08:35:34 · 5479 阅读 · 0 评论 -
Java网络编程(三)—— Socket
Java网络编程(三)—— Socket Java网络编程(三)—— Socket构造Socket设定等待建立连接的超时时间在客户/服务器通信模式中,客户端需要主动创建与服务器连接的 Socket,服务器端收到了客户端的连接请求,也会创建与客户连接的Socket。Socket可看做是通信连接两端的收发器,服务器与客户端都通过 Socket来收发数据。构造SocketSocket构造方法有以下几种形式:(1) public Socket()(2) public Socket(String host原创 2021-11-03 09:53:11 · 596 阅读 · 0 评论 -
Java网络编程(二)—— InetAddress类和NetworkInterface类
Java网络编程(二)—— InetAddress类和NetworkInterface类 Java网络编程(二)—— InetAddress类和NetworkInterface类InetAddress类使用方法可达性NetworkInterface类使用方法获取方法InetAddress类java.net.InetAddress类是Java对IP地址的高层表示。一般来说,它包括一个主机名和一个IP地址。使用方法InetAddress类没有公共构造函数,但是他有一些静态工厂方法来构造InetAddr原创 2021-11-02 09:44:05 · 839 阅读 · 0 评论 -
Java网络编程(一)—— 简单的C/S程序
Java网络编程(一)—— 简单的C/S程序 Java网络编程(一)—— 简单的C/S程序总述创建服务器端创建客户端结果展示总述TCP/UDP 协议推动了客户/服务器通信模式的广泛运用。在通信的两个进程中,一个进程为客户进程,另一个进程为服务器进程。客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求。Java网络程序建立在TCP/IP协议基础上,致力于实现应用层,传输层向应用层提供了套接字Socket接口,Socket封装了下层的数据传输细节,应用层的程序通过Socket来建立与远程主机原创 2021-11-01 19:47:48 · 1925 阅读 · 0 评论