Java网络编程:socket与Netty

      最后更新:2022-06-17 11:54:46 手机定位技术交流文章

      Java网络编程:插座和网格

      • Java网络编程:插座和网格
        • TCP/IP介绍
          • 简介
          • 数据传输
          • TCP粘包和黏包
            • 现象
            • 为什么出现
            • 如何解决
        • 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接收机在缓冲模式中读取数据包,同时在多个缓冲中读取数据包。

      如何解决

      1. 添加一个特殊符号,接收器将通过这个特殊符号分离接收的数据包 -DelimiterBasedFrameDecoder特殊分隔符解码器
      2. 每次发送的固定长度数据包-FixedLengthFrameDecoder定长编码器
      3. 在消息标题中定义长度字段来识别消息的总长度-LengthFieldBasedFrameDecoder自定义长度解码器

      Socket介绍

      介绍

      • 接口不是协议,而是网络编程技术,任何编程语言都支持接口技术的发展,解决两个应用程序之间的通信问题
      • Socket实现TCP/IP,TCP/IP只是一个文档,不同的语言根据它们的需求分别分析协议,而Java中,TCP/IP的分析实现是Socket。

      功能开发

      1. 接口实现TCP/IP协议连接到网络端口,发送和接收数据

      2. ServerSocket用于服务端口监控服务端口,等待客户端连接,并生成数据传输后接口

      3. 创建服务端

      1. 创建客户端
      1. 客户端发送消息
      1. 服务端接收消息
      • 使用Netty实现插座编程也是很容易的

      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

          热门文章

          文章分类