当前位置: 首页 > news >正文

佛山 网址开发 网站制作扬州手机网站建设

佛山 网址开发 网站制作,扬州手机网站建设,微网站的建设,简单详细搭建网站教程视频作者简介#xff1a;☕️大家好#xff0c;我是Aomsir#xff0c;一个爱折腾的开发者#xff01; 个人主页#xff1a;Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏#xff1a;Netty应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言问题产… 作者简介☕️大家好我是Aomsir一个爱折腾的开发者 个人主页Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏Netty应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言问题产生实际场景问题出现问题解决总结 参考文献 孙哥suns说NettyNetty官方文档 前言 在之前的文章中我们深入了解了NIO中的两个核心模块Channel和Buffer包括它们的结构、作用以及所解决的问题等。然而虽然我们已经掌握了理论知识但尚未经历实际的应用。在今天的这篇文章中我们将以实战场景为例探讨如何使用Channel和Buffer来解决一个常见的问题即半包与粘包 问题产生实际场景 让我们考虑一个实际场景客户端与服务端建立了连接客户端需要向服务端发送三个句子Im Aomsir、I love you 和 Do you love me?。然而由于计算机无法理解文本的含义它在接收这些句子时并不知道何时结束每句话。为了解决这个问题我们通常在每个句子的末尾添加换行符\n。这样在解析数据时服务端可以根据换行符来确定每个句子的结束。实际上这也是网络通信中协议概念。 问题出现 在上面的场景中我们假设了一个常见的情况其中客户端和服务端之间使用NIO中的Channel进行通信。服务端将从Channel中读取的数据放入ByteBuffer中。然而在确定Buffer的大小时我们面临一个挑战 设置一个过大的Buffer可能会导致资源浪费而设置一个过小的Buffer则可能导致半包和粘包问题。 半包和粘包是通信中常见的问题通常在数据读取和解析过程中引发。举例来说如果我们将Buffer大小设置为15并且客户端发送的第一句话包括换行符只有12个字符没有超过15那么第二句话会被读入Buffer。但是第二句话只读取了Buffer的前几个字符然后Buffer就满了。此时Buffer中包含第一句完整和第二句的开头这就是粘包。接着Buffer继续从Channel中读取第二句的剩余部分和第三句的开头这导致Buffer中包含第二句的结尾和第三句的开头这就是半包。半包和粘包问题可能会导致我们在处理接收到的数据时遇到一些困难 问题解决 显然我们不能允许我们的程序出现半包和粘包问题因此我们需要采取措施来解决这个问题。我们可以借助ByteBuffer的compact方法来解决这一挑战。解决思路是在每个句子的末尾添加换行符\n的基础上遍历原始Buffer在遇到\n时将其之前的数据通过循环方式放入名为target的Buffer中然后进行输出。如果原始Buffer中只有一个\n后续的循环将不会进入if条件最终将剩余的部分压缩到原始Buffer的最开始以便继续接收数据。 需要注意的是为了避免原始Buffer中出现两个\n即两个完整的句子target的Buffer大小不能随意设置。我们可以使用i 1 - buffer.position来确定target的长度因为在ByteBuffer.get(i)的过程中position不会移动只有在ByteBuffer.get()时才会使position不断前进所以我们就可以在程序中动态的计算长度(也就是 position - i)之间的长度。 还有一个需要注意的问题是如果原始Buffer中没有\n整个程序可能会陷入死循环。为了解决这种情况我们可以在else部分采取适当的处理措施。然而这个具体处理方法超出了本文的范围因为后续的Netty框架已经为我们提供了解决半包和粘包问题的更全面的解决方案 public class TestNIO10 {public static void main(String[] args) {ByteBuffer buffer ByteBuffer.allocate(50);// 假装buffer从channel里面读取到了第一次数据buffer.put(Hi Aomsir\n I love y.getBytes());doLineSplit(buffer);// 假装buffer从channel里面读取到了第二次数据buffer.put(ou\nDo you like me?\n.getBytes());doLineSplit(buffer);}private static void doLineSplit(ByteBuffer buffer) {// 读模式让程序从buffer里面读取数据buffer.flip();// 循环会将整个buffer的数据都读取一遍for (int i 0; i buffer.limit(); i) {// 在找到一行完整数据以后没有直接结束循环是因为可能会出现两个\n的情况if (buffer.get(i) \n) {// 以免出现一行里面有多个\n的情况// 注意get(i)不会导致position的变化int length i 1 - buffer.position();// buffer的大小不能写死,每个句子的大小不一样,所以要动态分配ByteBuffer target ByteBuffer.allocate(length);// 从buffer里面读取数据写入targetfor (int j 0; j length; j) {target.put(buffer.get());}// 截取工作完成,将target切换为读模式,然后读取数据target.flip();System.out.println(StandardCharsets.UTF_8.decode(target) StandardCharsets.UTF_8.decode(target));target.clear();}}// buffer切换写模式,将未读完的数据移到最前面(position-limit之间)buffer.compact();} }总结 今天的文章介绍和解决了半包和粘包的区别这部分需要对Channel和Buffer的读写有一定的基础如果没有看明白就先看看前面的文章打好基础为本篇和以后的文章打基础。
http://www.huolong8.cn/news/259360/

相关文章:

  • 菏泽外贸网站建设企业网站404页面设计
  • 设计高端的国外网站离婚协议书模板免费下载
  • 上海网站建设公司选哪家好哪个网站教做西餐
  • 网站支付按钮怎么做网页与网站
  • 网站开发与管理专业的就业信息四川手机网站
  • 我要建房子去什么网站找人做竞价推广代运营企业
  • 响应式网站div居中高端大气网络设计建设公司网站织梦模板
  • 安全的赣州网站建设自适应网站建设
  • 深圳网站建设专业的公司正定网站建设
  • server 2008 r2搭建网站手机可以下载wordpress吗
  • 江津哪里找做网站的泉州找工作网站
  • 做cpa用什么网站html作业
  • dede网站mip代做网页制作网站
  • 网站建设 gei l fwordpress微博登陆
  • 网站推广计划渠道店铺代运营服务
  • 有教做点心的网站吗网站制作软件手机版
  • 网站开发会计处理经典品牌推广文案
  • 做网站需要的执照汉寿网站建设
  • 安康做网站做动物网站的原因是
  • wordpress一小时建站企业信息查询平台官网
  • 浅谈企业网站建设的目标盐城北京网站建设
  • 怎样把自己做的网站放到网上本地南通网站建设
  • 济南高新区网站建设公司网站增加一体化建设功能的好处
  • 余杭区建设局网站制作相册小程序
  • 网站如何微信支付做两个阿里网站
  • 出售自己的网站建设银行网站怎么下载地址
  • 网站建设与设计毕业设计Wordpress已有数据库表
  • 青州做网站的电话网站哪个好
  • 白酒网站源码网站上线模板
  • 网站建设明薇通网络不错哈尔滨口碑好的网站建设