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

南京建站平台seo云优化如何

南京建站平台,seo云优化如何,辽宁移动和生活app下载,北京网络公司网站粘包问题 Netty 的粘包问题是指在网络传输过程中#xff0c;由于 TCP 协议本身的特点#xff0c;导致发送方发送的若干个小数据包被接收方合并成了一个大数据包。这种情况称为粘包。 TCP 协议是面向流的协议#xff0c;没有数据边界#xff0c;发送方发送的数据可能会被分…粘包问题 Netty 的粘包问题是指在网络传输过程中由于 TCP 协议本身的特点导致发送方发送的若干个小数据包被接收方合并成了一个大数据包。这种情况称为粘包。 TCP 协议是面向流的协议没有数据边界发送方发送的数据可能会被分成多个数据包进行发送接收方则需要将这些数据包重新组装为原始数据。当接收方处理不当时就可能会发生粘包等问题。 造成粘包问题的原因主要有以下几点 传输的数据量过大或者传输速度过快。数据包长度不固定或者协议自定义导致变长。接收方的读取缓存区大小设置不当。 解决粘包问题的方法有很多种其中比较常用的方式包括以下几点 定长解码器针对长度固定的数据包采用定长的编码和解码方式可以有效避免粘包问题。分隔符解码器使用特定字符或字符串作为数据包的分隔符在接收方收到分隔符时进行消息的解码。消息头加长度字段在数据包中添加一部分用来表示数据包长度的信息以便于接收方进行消息的解码和切割。自定义协议设计自己的消息传输协议包括消息格式、头部、长度字段等来解决粘包问题。 半包问题 半包问题是指在网络传输过程中接收方无法完整地接收到一个数据包而只接收到了部分数据包的情况。这种情况称为半包。 造成半包问题的主要原因是数据包的长度超过了接收方的缓存区大小导致接收方无法一次性接收完整的数据包。协议设计不合理、网络延迟等也可能引起半包问题。 解决半包问题方法和解决粘包问题基本一致。 下面看下具体的例子 定长报文 定长报文就是收发双方约定一次通信的报文长度是固定长度的服务端按照规定长度接收客户端按照固定长度返送。这里主要用到FixedLengthFrameDecoder解码器其构造函数有一个入参来指定报文的长度。 server: pipeline.addLast(new FixedLengthFrameDecoder(1024))发送数据 // 消息解析 ByteBuf buf (ByteBuf) msg; byte[] bytes new byte[buf.readableBytes()]; buf.readBytes(bytes); String receivedMessage new String(bytes, UTF-8); System.out.println(接收到消息 receivedMessage); // 发送响应 String responseMessage Response; byte[] responseBytes responseMessage.getBytes(UTF-8); ByteBuf responseBuf ctx.alloc().buffer(responseBytes.length); responseBuf.writeBytes(responseBytes); ctx.writeAndFlush(responseBuf);// 释放资源 buf.release();client 客户端只要每次发送按约定长度组装报文即可 固定长度头 固定长度头就是报文整体有两部分组成报文头报文体。齐总报文头是固定位置长度里面会表明报文体长度消息接收方先定长读取报文头然后根据报文头指定的报文体长度来定量读取报文体。 这里用到了LengthFieldBasedFrameDecoder解码器。 该解析其有几个重要参数 maxFrameLength最大消息长度报文最大长度 lengthFieldOffset长度字段的偏移量如有些报文可能报文头上还有一些其它的标识位可以将这些标识位跳过 lengthFieldLength长度字段的长度 lengthAdjustment长度调整值这个值也有一定的用处。有些情况长度标识的是包含header头的长度这个时候可以将该值配置成负数最后继续往后解析的长度是lengthFieldLengthlengthAdjustment initialBytesToStrip从开始位置截取掉的字节长度可以把header去掉再往后传给下一个handler不过一般会保留报文头业务代理再去解析。LengthFieldBasedFrameDecoder只负责报文接收完整。 整个处理流程 当接收到来自网络的字节流时LengthFieldBasedFrameDecoder 首先根据指定的 lengthFieldOffset 和 lengthFieldLength 定位长度字段的位置并读取长度字段的值。 接下来根据读取到的长度字段值计算出消息的长度。如果消息的长度超过了指定的 maxFrameLength则会触发异常处理机制。 如果消息的长度合法则 LengthFieldBasedFrameDecoder 会读取接下来的指定长度的字节构成一个完整的消息。 最后根据配置的 initialBytesToStrip 参数可以选择是否去除消息长度头。 解码器完成后将解析出的完整消息传递给下一个处理器进行进一步的处理。 用例 如我们定义以下一种报文 长度头(4字节,只是报文体长度)标识位(1字节)报文体长度。 则创建LengthFieldBasedFrameDecoder要指定。 lengthFieldOffset0lengthFieldLength4lengthAdjustment1initialBytesToStrip0(保留报文头) 具体代码 server端pipeline添加LengthFieldBasedFrameDecoder解码器和FixedLengthServerHandler pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,4,1,0)); pipeline.addLast(new FixedLengthServerHandler());FixedLengthServerHandler处理方法如下 public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {ByteBuf buf (ByteBuf) msg;//消息解析int length buf.readInt();byte[] bytes new byte[length];char flag (char) buf.readByte();buf.readBytes(bytes);String receivedMessage new String(bytes, UTF-8);System.out.println(接收到消息 receivedMessage,消息标识flag);// 发送响应String responseMessage SUCC;byte[] responseBytes responseMessage.getBytes(UTF-8);int responseLength responseBytes.length;ByteBuf responseBuf ctx.alloc().buffer(4 1 responseLength);responseBuf.writeInt(responseLength);responseBuf.writeBytes(Y.getBytes());responseBuf.writeBytes(responseBytes);ctx.writeAndFlush(responseBuf);buf.release(); }client端 同样的pipeline添加两个handler pipeline.addLast(new LengthFieldBasedFrameDecoder(1024,0,4,1,0)); pipeline.addLast(new FixedLengthClientHandler());构造消息发送 ByteBuf buffer Unpooled.buffer(); byte[] bytes hello.getBytes(); buffer.writeInt(bytes.length); buffer.writeBytes(X.getBytes()); buffer.writeBytes(bytes); channel.writeAndFlush(buffer);FixedLengthClientHandler处理响应报文: public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {ByteBuf buf (ByteBuf) msg;// 消息处理int length buf.readInt();char flag (char) buf.readByte();byte[] bytes new byte[length];buf.readBytes(bytes);String receivedMessage new String(bytes, UTF-8);System.out.println(接收到消息 receivedMessage,flagflag);buf.release(); }另外这里处理的都是字节流数据使用原先阻塞BIO socket也是可以的不局限于ByteBuf。 如socket发送接收上面定长报文头数据 Socket socket new Socket(localhost, 8080); OutputStream outputStream socket.getOutputStream(); InputStream inputStream socket.getInputStream();// 发送消息 String message Hello; byte[] data message.getBytes();ByteBuffer buffer ByteBuffer.allocate(4); buffer.putInt(data.length);outputStream.write(buffer.array()); outputStream.write(X.getBytes()); outputStream.write(data); outputStream.flush(); //接收响应 byte[] lenB new byte[4]; inputStream.read(lenB); char flag (char) inputStream.read(); ByteBuffer buff ByteBuffer.wrap(lenB); int len buff.getInt();byte[] resp new byte[len]; inputStream.read(resp); System.out.println(响应:new String(resp) ,flagflag);outputStream.close(); inputStream.close(); socket.close();分隔符报文 分隔符报文就是将报文按固定字符进行分割这里使用DelimiterBasedFrameDecoder 解析器。 入参可指定分隔符及最大报文长度。 与之相似的还有LineBasedFrameDecoder按行读取就是以 \n’换行符当作分隔符。 自定义报文 基本上LengthFieldBasedFrameDecoder解码器已经满足解决报文粘包问题如果还有其它比较复杂的报文可以自定义协议报文格式进行处理一个基本原则还是要有一个报文长度标识然后按具体长度进行读取。
http://www.hkea.cn/news/14421645/

相关文章:

  • 怎么做打赏看视频的网站计算机培训包就业
  • 昆明网站开发培训机构明天上海封控16个区
  • 上海门户网站建设公司wordpress 4.0模板
  • 中建南方建设集团官方网站网站域名收费标准
  • 网站用哪些系统做的比较好电子商务网站建设论文课题
  • 深圳市做网站的深圳社保
  • 保山网站建设服务网站制作业务
  • 视频发布播放网站建设做网站后期续费是怎么算的
  • 网站开发软件培训做五金有哪些网站推广
  • 互联网网站开发发展十大网站排行榜
  • 手机网站 input企业宣传片摄制
  • 公司网站发展规划书深达网站制作深圳公司
  • 网站开发设置网页端口wordpress视频主题吾爱破解版
  • 别人的抖音网站是怎么做的网站建设中翻译
  • 网站首页添加代码外链工具
  • 我做微信淘宝客网站有哪些专门做外包的网站
  • 中国交通建设集团网站我要自学网做网站
  • 如何建学校网站学院网站建设的目的
  • 如何免费建设公司网站云服务器小网站制作
  • 东丽天津网站建设广州app开发
  • 河北建设银行官网招聘网站网站相对路径和绝对路径
  • 建设网站毕业设计开题报告做网站有谁做
  • wordpress公共库设置安徽seo顾问服务
  • 网站建设方案书可自行撰写wordpress 中英文切换
  • 网站建设开发报价用wordpress做广告收益
  • 工程网站建设方案网站首页布局设计工具
  • 万和城官方网站网站域名年龄
  • 做效果图比较好的模型网站瓯海建设网站
  • 百度做网站个人工作总结ppt模板免费
  • 如何写一份食品的网站建设规划软件开发专业培训学校