- 讲师:刘萍萍 / 谢楠
- 课时:160h
- 价格 4580 元
特色双名师解密新课程高频考点,送国家电网教材讲义,助力一次通关
配套通关班送国网在线题库一套
百度广告
习惯了TCP编程,认为UDP可以包办这些问题是错误的。一个UDP应用程序要承担可靠性方面的全部工作,包括报文的丢失、重复、时延、乱序以及连接失效等问题。
通常我们在可靠性好,传输时延小的局域网上开发测试,一些问题不容易暴露,但在大型互联网上却会出现错误。
UDP协议把递送的可靠性责任推到了上层即应用层,下面简单编写了几个类来专门处理两个问题:乱序和丢包。
四个类:DataPacket 类,PacketHeader类,PacketBody类 ,DataEntry类,位于同一个文件DataPacket .java中。
DataPacket 类相当于一个门面模式,提供给外部使用,通信数据也在这个类中处理。
package com.skysoft.pcks;
import java.io.*;
import java.util.*;
public class DataPacket {
OutputStream os;
PacketBody body;
public static final int DataSwapSize = 64532;
/**
*/
header = new PacketHeader();
al = new ArrayList();
/**
* @param file String 硬盘文件
public DataPacket(String file) {
try {
header.CalcHeaderInfo(is.available());
is.close();
}
ex.printStackTrace();
catch (IOException ex1) {
}
/**
* @param url URL url地址
public DataPacket(URL url) {
try {
URLConnection conn=url.openConnection();
int total=conn.getContentLength();
this.madeBody();
is.close();
catch (IOException ex) {
}
/**
*/
al.clear();
DataEntry de;
try {
//is.skip(i * body.BODY_BUFFER_SIZE);
de = new DataEntry(PacketBody.BODY_BUFFER_SIZE);
de.setStreamsize(header.getStreamsize());
if (header.isWTailFragment(i)) {
is.read(buffer, 0, buffer.length);
de.setActByteSize(header.getMinfragment());
else {
is.read(buffer, 0, buffer.length);
//System.out.println("length-------"+i+" "+body.getBody().length+" "+header.getMinfragment());
//System.out.println("length:" + i + " " + header.toString());
bos.write(body.getBody(), 0, body.getBody().length);
al.add(de);
catch (IOException ex) {
}
}
* 为发送构造分组,没有考虑报头格式,也没有为分组编序号.
private void madeBody1() {
for (int i = 0; i < header.fragmentcounter; i++) {
if (header.isWTailFragment(i))
header.getMinfragment());
is.read(body.getBody(), i * body.BODY_BUFFER_SIZE,
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bos.write(body.getBody(), header.HEADER_BUFFER_SIZE,
al.add(bos);
catch (IOException ex) {
}
}
* 在接收到报文后,对此报文执行组装,并处理报文丢失和乱序情况.
*/
te buffer = (byte) b1.clone();
DataEntry de = new DataEntry(buffer, header.getActByteSize());
de.setStreamsize(header.getStreamsize());
al.add(de);
private void handlerText(byte buffer) {
baos.write(buffer, 0, header.HEADER_BUFFER_SIZE);
System.arraycopy(buffer,0,b,0,b.length);
InputStreamReader isr = new InputStreamReader(bais);
try {
}
ex.printStackTrace();
}
private String calFileSize(int size) {
}
public ArrayList getDataPackets() {
}
* 是否接收完毕,通过序号是否等于最大段数来判断,这也许有问题,比如,正好是最后一个段丢失了,这样
* @return
public boolean isFull() {
}
* 判断是否只有一个段.
*/
return this.header.getSn() == 0 ? true : false;
/**
* @return
private ByteArrayOutputStream fetchDataPackets() {
te buffer = null;
for (int i = 0; i < al.size(); i++) {
de = this.getSnData(i);
if (header.getStreamsize() == de.getStreamsize()) {
System.out.println(de.toString() + " -- fetchDataPackets");
}
ex.printStackTrace();
}
}
/**
* @return ByteArrayOutputStream
private ByteArrayOutputStream fetchDataPackets_sn() {
te buffer;
for (int i = 0; i < header.getFragmentcounter(); i++) {
de = this.getSnData(i);
de = seachDeData(i);
buffer = de.getByte();
//handlerText(buffer);
// buffer.length - header.HEADER_BUFFER_SIZE);
bos.write(de.getByte(), header.HEADER_BUFFER_SIZE,
//System.out.println(de.toString());
}
ex.printStackTrace();
}
责编:罗莉
下一篇:Java数据报之失序和丢包(2)
课程专业名称 |
讲师 |
课时 |
查看课程 |
---|
课程专业名称 |
讲师 |
课时 |
查看课程 |
---|
点击加载更多评论>>