Java网络编程:插座和网格
- Java网络编程:插座和网格
- TCP/IP介绍
- Socket介绍
- Netty介绍
- 简介
- 部分重点类和方法
- ServerBootstrap
- option / handler / attr 方法
- Bootstrap
- Channel
- EventLoop
- ChannelFuture
- ChannelHandler
- ChannelPipeline
- LengthFieldBasedFrameDecoder
- LengthFieldBasedFrameDecoder参数
Java网络编程:插座和网格
- 说到Java网络编程,第一个印象绝对是奈特利。由于JavaIO编程在底部,所以使用起来并不容易,尼特利是偶然出生的。Nety没有具有很强的通用性、跨平台负载等的Java核心库,针对特定目标和特定环境,例如Linux,已经采取了一些极端优化措施。
- 关于网络通信,TCP/IP协议和插座技术也无法避免。请参阅下面的错误或不准确之处,以便纠正。
TCP/IP介绍
简介
- TCP/IP传输协议(英语:TCP/IP transmission protocol)或传输控制/网络协议(英语:Transmission control/network protocol)也称为网络通信协议,是网络中使用的最基本的通信协议。
- TCP/IP传输协议(英语:TCP/IP transmission protocol)是一套标准和方法,用于与互联网的各个部分进行通信。
- TCP/IP传输协议是一个严格的四层架构,包括应用程序层、传输层、网络层和数据链层。
数据传输
- 在网络编程中,TCP/IP均匀用于大节点模式传输数据
- 现有的计算机都存储在8位单位元内
- 小的安迪安把低到高,大的安迪安把低到低。
- 目前,主要的CPU是Intel系列,它使用小节点格式存储数据,而Motorola系列则使用大节点。
TCP粘包和黏包
现象
- 从接收缓冲区,下一个包的头部更接近前面的尾部
- 当TCP连接建立时,客户端向服务器发送多个消息,TCP协议保证数据可靠性,但是您不能保证客户已经发送了 n 个包,服务端也可以根据n包接收。客户端端发送n包,服务器端可能接收n-1或n+1包
为什么出现
- 发送者原因: TCP默认使用Nagle算法。纳格尔算法主要做两件事:(一)只确认第一组,(二)收集多个小组,在确定的时间把它们一起发送.所以,正是纳格尔算法使发送者能够产生胶体现象
- 接收机的原因:TCP接收机在缓冲模式中读取数据包,同时在多个缓冲中读取数据包。
如何解决
- 添加一个特殊符号,接收器将通过这个特殊符号分离接收的数据包 -
DelimiterBasedFrameDecoder特殊分隔符解码器
- 每次发送的固定长度数据包-
FixedLengthFrameDecoder定长编码器
- 在消息标题中定义长度字段来识别消息的总长度-
LengthFieldBasedFrameDecoder自定义长度解码器
Socket介绍
介绍
- 接口不是协议,而是网络编程技术,任何编程语言都支持接口技术的发展,解决两个应用程序之间的通信问题
- Socket实现TCP/IP,TCP/IP只是一个文档,不同的语言根据它们的需求分别分析协议,而Java中,TCP/IP的分析实现是Socket。
功能开发
接口实现TCP/IP协议连接到网络端口,发送和接收数据
ServerSocket用于服务端口监控服务端口,等待客户端连接,并生成数据传输后接口
创建服务端
- 创建客户端
- 客户端发送消息
- 服务端接收消息
Netty介绍
简介
- 根据官方定义,它是一个非同步、基于事件的客户端/服务器网络框架,其目的是提供一个简单的和快速的方式来构建网络应用程序,同时确保高吞吐量、低延迟和高可靠性。
- 内特利的设计强调了“分开关切,”通过巧妙设计的事件机制,将商业逻辑与无关的技术逻辑分开,通过各种方便的抽象,在某种程度上,基本平台与商业发展之间的差距已经填补了。在应用开发方面,向业界传播最佳做法是更有益的。
- 从网络协议的角度来看,Netty除了支持传输层的UDP、TCP和SCTP协议外,还支持多个应用程序协议层,例如HTTP(s)和WebSocket,它不是单一协议API
- 在需要从Java对象转换到各种应用程序协议数据格式的应用程序中,或转换逆向的应用程序中,Netty提供了一个扩展的解码框架,它与应用程序开发场景无缝连结,并且表现良好。
部分重点类和方法
ServerBootstrap
- 服务器端程序的输入是Netty引入的启动机制,以简化网络程序配置和关闭等生命周期管理。
- 我们通常需要创建通道、绑定端口、注册管理员等,可以通过这种统一的输入,以液体API的形式进行,这相对简化了API的使用
option / handler / attr 方法
- 两者都定义在AbstractBootstrap中,因此服务端和客户端的导类方法调用是调用母类的相应的方法。
- 当分配方法使用时,选项/处理器/attr方法主要针对主线程组, childHandler/ childOption/ childAttr主要针对工人线程组
- 选项:设置频道的选项参数,服务端的ServerSocketChannel,客户端的SocketChannel;
- 处理器:设置主通道的处理器,服务端是ServerSocketChannel,也就是说,用于处理接受器的操作;对于客户端的SocketChannel,主要用于经营业务;
- attr:设置频道属性;
- 对于服务端,需要处理两个通道,一个是ServerSocketChannel:用于处理用户连接的接受操作,另一个是SocketChannel,它代表相应的客户端连接。
- 子初始方法在ServerBootstrap中定义,它代表处理或配置服务端接收的相应客户端连接的SocketChannel通道。
Bootstrap
- Bootstrap是客户端端的正常入口。
- 对于客户来说,通常只有一个频道, SocketChannel。
Channel
Channel作为基于NIO的扩展框架,诸如Channel和Selector的概念仍然是Netty的基本组成部分,但对于特定的应用程序开发要求提供了相对容易的抽象。
EventLoop
这是Netty事件处理的核心机制。我们可以使用EventLoopGroup。我们常在NIO做一些事情,为登记感兴趣的活动,并致电有关事务经理等,所有负责 EventLoop.
ChannelFuture
这是Nety实现异步IO的基础之一,确保同一通道操作的调用顺序。Netty扩展了Java标准到Future,为自己的场景提供了具体的Future定义。
ChannelHandler
这是应用开发者将业务逻辑置于其中的主要位置,并反映了上述关切分离原则。
ChannelPipeline
这是用于 ChannelHandler链的容器,每个频道创建后,一个通道管道被自动分配.在使用时,我们可以通过ServerBootstrap注册ChannelInitializer,并实现initChannel方法,该方法承担了安装其他手册到ChannelPipleline的任务.
LengthFieldBasedFrameDecoder
- 基于长度场的框架解码器,定制长度来解决TCP胶粘问题
- Nety从TCP缓冲器中读取字符,并将其解码到长度域基础框架编码器
- 解码操作基于设置规则,从节点解码有意义的数据,然后将数据转交给后续处理器。
- LengthFieldBasedFrameDecoder基本上是 ChannelHandler,是一个处理输入事件的渠道处理器
- LengthFieldBasedFrameDecoder需要添加到 ChannelPipeline上并位于链表顶部
- 方程: 发送包长 = 长域值 + 长域偏差 + 长域长度 + 长度调整
LengthFieldBasedFrameDecoder参数
- maxFrameLength - 发送数据帧的最大长度
- lengthFieldOffset - 定义发送字节集合底部的长度字段。 换句话说,发送字符串集合中的${lengthFieldOffset}下的位置是长度字段的开始
- lengthFieldLength - 定义长度场的长度。换句话说,发送字节的字节集时,字节的字节集[lengthFieldOffset, lengthFieldOffset+lengthFieldLength]域与定义的长度域部分相符
- 长度 - 长度FieldLength = 字节 [长度FieldOffset, 长度FieldOffset+长度FieldLength] + 长度FieldOffset + 长度调整
- initialBytesToStrip - 收到发送包去除 initialBytesToStrip 位数
- failFast - true: 读到超过最大框架长度的长度域,一个 TooLongFrameException被抛出。错误:只有在表示长度域值的字符串的实际读取完成后,TooLongFrameException,默认设置为真,建议不要修改,否则,可能会出现内存溢出
本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/27543.html。