之前列出了Chuck协议格式,现在做一个能读Chuck的代码:
public class IOLine {
private byte[] data;
private String line;
public byte[] getData() {
return data;
}
public void setData(byte[] data) {
this.data = data;
}
public String getLine() {
return line;
}
public void setLine(String line) {
this.line = line;
}
}
public static byte[] readTrunck(InputStream is) throws Exception{
ByteArrayOutputStream dos = null;
dos = new ByteArrayOutputStream();
try{
DataInputStream dis = new DataInputStream(is);
IOLine line = HttpUtil.readLine(is);
// LogUtil.debug("line="+line.getLine());
int len = HttpUtil.readDataLen(line);
while(len>0){
byte tmp[] = new byte[len];
dis.readFully(tmp);
dos.write(tmp);
line = HttpUtil.readLine(is);
if("".equals(line.getLine().trim())){
line = HttpUtil.readLine(is);
}
// LogUtil.debug("line="+line.getLine());
len = HttpUtil.readDataLen(line);
}
return dos.toByteArray();
}finally{
try{
dos.close();
}catch(Exception e){
}
}
}
/**
* 读一行
* @param is
* @return
* @throws Exception
*/
public static IOLine readLine(InputStream is) throws Exception{
int b = 0;
IOLine ret = new IOLine();
byte[] data = new byte[MAX_DATA_SIZE];
int k = 0;
boolean f = false;
boolean s = false;
try{
while( (b=is.read()) != -1){
data[k++] = (byte) b;
if('\r'== b){
f = true;
}
else if(f && '\n' == b){
s = true;
break;
}
else{
f = false;
}
}
}catch(Exception e){}
byte[] d = new byte[k];
System.arraycopy(data, 0, d, 0, k);
if(s){
ret.setLine(new String(d));
}
ret.setData(d);
return ret;
}
当数据流读到数据区时,直接调用readTrunck方法,传入数据流,返回所有Chuck整合的字节数组。