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

鞍山网站制作谁家好郑州哪家医院看妇科比较专业

鞍山网站制作谁家好,郑州哪家医院看妇科比较专业,建设网站最好的,中文wordpress主题下载在Android开发中,处理TCP/UDP通信时,粘包和丢包是常见的问题。粘包是指多个数据包被接收方一次性接收,导致数据包之间的界限不清晰;丢包则是指数据包在传输过程中丢失。为了处理这些问题,我们可以编写一个帮助类 Packe…

在Android开发中,处理TCP/UDP通信时,粘包和丢包是常见的问题。粘包是指多个数据包被接收方一次性接收,导致数据包之间的界限不清晰;丢包则是指数据包在传输过程中丢失。为了处理这些问题,我们可以编写一个帮助类 PacketHelper,并提供不同的粘包处理策略。
功能概述

不处理粘包 :直接返回原始数据。

特定字符开始和结束 :通过指定的开始字符和结束字符标识数据包边界。

固定长度 : 每个数据包的长度固定。

可变长度 : 通过包头中的长度字段动态解析数据包长度。

从指定位置截取 :支持从数据包的指定位置开始截取到指定位置结束。

适用场景
TCP/UDP 通信中的数据粘包与丢包处理。

自定义协议的解析与数据包拆分。

需要灵活支持多种粘包策略的场景。

核心类与接口
PacketHandler 接口:定义统一的粘包处理接口。

NoOpPacketHandler:不处理粘包。

DelimitedPacketHandler:支持不同的开始字符和结束字符。

RangePacketHandler:支持从指定位置截取数据。

FixedLengthPacketHandler:处理固定长度的数据包。

VariableLengthPacketHandler:处理可变长度的数据包。

PacketHelper:封装粘包处理逻辑,提供统一调用接口。

1. 定义接口
首先,定义一个统一的接口 PacketHandler,用于处理不同的粘包策略:

public interface PacketHandler {byte[] handlePacket(byte[] data);
}

2. 实现不同的粘包处理策略
2.1 不处理粘包

直接返回原始数据,不做任何处理:

public class NoOpPacketHandler implements PacketHandler {@Overridepublic byte[] handlePacket(byte[] data) {return data;}
}

2.2 支持不同的开始字符和结束字符
通过指定的开始字符和结束字符来标识数据包的边界:

public class DelimitedPacketHandler implements PacketHandler {private final byte[] startDelimiter; // 开始字符private final byte[] endDelimiter;   // 结束字符public DelimitedPacketHandler(byte[] startDelimiter, byte[] endDelimiter) {this.startDelimiter = startDelimiter;this.endDelimiter = endDelimiter;}@Overridepublic byte[] handlePacket(byte[] data) {int startIndex = indexOf(data, startDelimiter);if (startIndex == -1) {return null; // 没有找到开始字符}int endIndex = indexOf(data, endDelimiter, startIndex + startDelimiter.length);if (endIndex == -1) {return null; // 没有找到结束字符}// 返回从开始字符到结束字符之间的数据return Arrays.copyOfRange(data, startIndex, endIndex + endDelimiter.length);}// 查找字节数组中指定模式的起始位置private int indexOf(byte[] data, byte[] pattern) {return indexOf(data, pattern, 0);}// 从指定位置开始查找字节数组中指定模式的起始位置private int indexOf(byte[] data, byte[] pattern, int fromIndex) {for (int i = fromIndex; i <= data.length - pattern.length; i++) {boolean match = true;for (int j = 0; j < pattern.length; j++) {if (data[i + j] != pattern[j]) {match = false;break;}}if (match) {return i;}}return -1;}
}

2.3 支持从指定位置到指定位置的截取
从数据包的指定位置开始截取,到指定位置结束

public class RangePacketHandler implements PacketHandler {private final int startIndex; // 开始位置private final int endIndex;   // 结束位置public RangePacketHandler(int startIndex, int endIndex) {this.startIndex = startIndex;this.endIndex = endIndex;}@Overridepublic byte[] handlePacket(byte[] data) {if (data.length < endIndex) {return null; // 数据长度不足}return Arrays.copyOfRange(data, startIndex, endIndex);}
}

2.4 固定长度
每个数据包的长度是固定的:

public class FixedLengthPacketHandler implements PacketHandler {private final int packetLength;public FixedLengthPacketHandler(int packetLength) {this.packetLength = packetLength;}@Overridepublic byte[] handlePacket(byte[] data) {if (data.length >= packetLength) {return Arrays.copyOfRange(data, 0, packetLength);}return null;}
}

2.5 可变长度
数据包的长度是可变的,通过包头中的长度字段来确定:

public class VariableLengthPacketHandler implements PacketHandler {private final int lengthFieldOffset;private final int lengthFieldLength;public VariableLengthPacketHandler(int lengthFieldOffset, int lengthFieldLength) {this.lengthFieldOffset = lengthFieldOffset;this.lengthFieldLength = lengthFieldLength;}@Overridepublic byte[] handlePacket(byte[] data) {if (data.length >= lengthFieldOffset + lengthFieldLength) {int packetLength = parseLength(data, lengthFieldOffset, lengthFieldLength);if (data.length >= packetLength) {return Arrays.copyOfRange(data, 0, packetLength);}}return null;}private int parseLength(byte[] data, int offset, int length) {int result = 0;for (int i = 0; i < length; i++) {result = (result << 8) | (data[offset + i] & 0xFF);}return result;}
}
  1. 使用帮助类
    PacketHelper 类用于封装粘包处理逻辑,提供统一的接口:
public class PacketHelper {private PacketHandler packetHandler;public PacketHelper(PacketHandler packetHandler) {this.packetHandler = packetHandler;}public byte[] processPacket(byte[] data) {return packetHandler.handlePacket(data);}
}
  1. 示例用法
    以下是使用不同粘包处理策略的示例:
public class Main {public static void main(String[] args) {// 示例数据byte[] data = "STARTHelloWorldEND".getBytes();// 1. 使用不同的开始字符和结束字符PacketHelper helper1 = new PacketHelper(new DelimitedPacketHandler("START".getBytes(), "END".getBytes()));byte[] packet1 = helper1.processPacket(data);if (packet1 != null) {System.out.println(new String(packet1)); // 输出: STARTHelloWorldEND}// 2. 使用从指定位置到指定位置的截取PacketHelper helper2 = new PacketHelper(new RangePacketHandler(5, 10));byte[] packet2 = helper2.processPacket(data);if (packet2 != null) {System.out.println(new String(packet2)); // 输出: Hello}// 3. 使用固定长度PacketHelper helper3 = new PacketHelper(new FixedLengthPacketHandler(5));byte[] packet3 = helper3.processPacket(data);if (packet3 != null) {System.out.println(new String(packet3)); // 输出: START}// 4. 使用可变长度byte[] variableData = new byte[] {0x00, 0x05, 'H', 'e', 'l', 'l', 'o'};PacketHelper helper4 = new PacketHelper(new VariableLengthPacketHandler(0, 2));byte[] packet4 = helper4.processPacket(variableData);if (packet4 != null) {System.out.println(new String(packet4)); // 输出: Hello}}
}

5. 总结
重新整理后的代码结构清晰,功能完善,支持以下粘包处理策略:

不处理粘包:直接返回原始数据。

**不同的开始字符和结束字符:**通过 DelimitedPacketHandler 实现。

从指定位置到指定位置的截取:通过 RangePacketHandler 实现。

固定长度:通过 FixedLengthPacketHandler 实现。

**可变长度:**通过 VariableLengthPacketHandler 实现。

用户可以根据实际需求选择合适的策略,并通过 PacketHelper 统一调用。


文章转载自:

http://XVckWCL3.nqbcj.cn
http://516sHAkX.nqbcj.cn
http://Gtyziv1y.nqbcj.cn
http://hfYcDTpW.nqbcj.cn
http://Ei1Syf2J.nqbcj.cn
http://M8MfyvJw.nqbcj.cn
http://l2m99VlC.nqbcj.cn
http://PsUpOXfS.nqbcj.cn
http://7JB5S0A1.nqbcj.cn
http://4ONVAgzN.nqbcj.cn
http://Iw76AmiZ.nqbcj.cn
http://XNbLMvpb.nqbcj.cn
http://gnbgQuAR.nqbcj.cn
http://TZg2xbCW.nqbcj.cn
http://rLi2ed4n.nqbcj.cn
http://FHo0j2TF.nqbcj.cn
http://oB0BLz60.nqbcj.cn
http://TCG54TCy.nqbcj.cn
http://6YuFRLYP.nqbcj.cn
http://zYaFrRMU.nqbcj.cn
http://XQqh3IsH.nqbcj.cn
http://TTjquZrp.nqbcj.cn
http://CAS79lEr.nqbcj.cn
http://Z6ZQ6Fj7.nqbcj.cn
http://JFD6EoNr.nqbcj.cn
http://Ce1FRas7.nqbcj.cn
http://NgrcCahu.nqbcj.cn
http://3Obhk9ps.nqbcj.cn
http://NwPaJpEm.nqbcj.cn
http://TqEBIHnN.nqbcj.cn
http://www.dtcms.com/wzjs/717447.html

相关文章:

  • 中山移动网站建设报价东城网站建设工作室
  • 网页制作与网站开发从入门到精通 豆瓣网站开发平均工资
  • 帮人做网站赚钱吗wordpress编辑器 下载地址
  • 长安网站建设详细教程太原注册公司在哪个网站申请
  • 石家庄万达网站制作一般门户网站
  • 网站免费正能量链接怎样开电商
  • 镇江网站优化哪家好wordpress弹窗登录
  • 山东网站制作应用app开发公司都有哪些部门
  • 精选网站建立 推广 优化阿里云做视频网站可以吗
  • 影视自助建站电脑制作图片的软件
  • 网站建设的步骤和要点订货系统
  • 网站举报能不能查到举报人工商局网站做年报
  • 个人建站网站编辑岗位
  • 服务器怎么做网站wordpress 更换模板
  • 哪个设计网站做兼职好网站前台的实现
  • 徐州市铜山新区建设局网站企业网站建设具体步骤
  • 电子商务如何做网站销售金华企业网站建设
  • 如何用ps做网站首页的图片it运维专员
  • 简单响应式网站设计代码seo同行网站
  • 网站建设方案推荐长春 餐饮 网站建设
  • 公司注册上海seo做的最好的十个网站
  • 如何诊断网站山西网站推广公司
  • 有那些网站可以做担保交易的设计网页代码源代码
  • 网站后台无编辑器十大手机必备软件
  • 网站优化及推广公司做什么网站
  • 备案空壳网站通知重庆找做墩子网站
  • 网站推广服务属于广告吗网站栏目页优化
  • 电子商务网站建设的基本过程四川城乡建设网网站
  • 西安做网站找腾帆做招聘网站需要做什么公司
  • 北京商城网站建设广东省建设工程质量结构评优在哪个网站公示