- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Java数据报之失序和丢包 习惯了TCP编程,认为UDP可以包办这些问题是错误的。一个UDP应用程序要承担可靠性方面的全部工作,包括报文的丢失、重复、时延、乱序以及连接失效等问题。 通常我们在可靠性好,传输时延小的局域网上开发测试,一些问题不容易暴露,但在大型互联网上却会出现错误。 UDP协议把递送的可靠性责任推到了上层即应用层,下面简单编写了几个类来专门处理两个问题:乱序和丢包。 四个类:DataPacket 类,PacketHeader类,PacketBody类 ,DataEntry类,位于同一个文件DataPacket .java中。 DataPacket 类相当于一个门面模式,提供给外部使用,通信数据也在这个类中处理。 package com.skysoft.pcks; import java.io.*; import java.net.*; import java.util.*; public class?DataPacket { OutputStream os; PacketHeader header; PacketBody body; ArrayList al; public static final int DataSwapSize = 64532; /**? * 在接收数据报使用? */ public DataPacket() { header = new PacketHeader(); body = new PacketBody(); al = new ArrayList(); ?} /** * 在发送数据报时使用,它调用报文分割操作. * @param file String?硬盘文件 */ public DataPacket(String file) { this(); try { is = new FileInputStream(file); header.CalcHeaderInfo(is.available()); this.madeBody(); is.close(); //this.Gereratedata(); } catch (FileNotFoundException ex) { ex.printStackTrace();? } catch (IOException ex1) { ex1.printStackTrace();? ??} } ?/** * 在发送数据报时使用,它调用报文分割操作. * @param url URL url地址 */ public DataPacket(URL url) { this(); try { //is = url.openStream(); URLConnection conn=url.openConnection(); is=conn.getInputStream(); int total=conn.getContentLength(); header.CalcHeaderInfo(total); this.madeBody(); //System.out.println(total+:+total); is.close();? ??} catch (IOException ex) { ex.printStackTrace(); } }? /**? * 为发送构造分组,使用PackageHeader处理了报头格式,并为分组编序号. ?*/ private void madeBody() { al.clear(); byte[] buffer; DataEntry de; for (int i = 0; i ?header.fragmentcounter; i++) { try { ByteArrayOutputStream bos = new ByteArrayOutputStream(); //is.skip(i * body.BODY_BUFFER_SIZE); header.ArrageSort(i); de = new DataEntry(PacketBody.BODY_BUFFER_SIZE); de.setSn(i); de.setStreamsize(header.getStreamsize()); de.setFragmentcounter(header.getFragmentcounter()); if (heade
文档评论(0)