我正在尝试在Android设备上创建http代理服务器。当我尝试从HTTP服务器(example1.com)读取响应时(example1.com包含标题中的内容长度) 如果HTTP服务器包含content-length,那么我从content-length读取字节 否则我会读取所有响应字节
byte[] bytes = IOUtils.toByteArray(inFromServer);
问题在于,当响应包含content-length
响应时
读得很快。
如果回复不包含content-length
,则回复缓慢。
这是我的代码
DataInputStream in = new DataInputStream(inFromServer);
//BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line = "";
String str = "";
Integer len = 0;
while(true) {
line = in.readLine();
if (line.indexOf("Content-Length") != -1)
{
len = Integer.parseInt( line.split("\\D+")[1] );
//System.out.println("LINEE="+len);
}
out.println(line);
str = str + line + '\n';
if(line.isEmpty()) break;
}
int i = Integer.valueOf(len);
String body= "";
System.out.println("i="+i);
if (i>0) {
byte[] buf = new byte[i];
in.readFully(buf);
out.write(buf);
for (byte b:buf) {
body = body + (char)b;
}
}else{
byte[] bytes = IOUtils.toByteArray(inFromServer);
out.write(bytes);
}
out-outStream to browser
答案 0 :(得分:7)
请尝试以下代码:
// Get server response
int responseCode = connection.getResponseCode();
if (responseCode == 200) {
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
StringBuilder builder = new StringBuilder();
while ((line = reader.readLine()) != null) {
builder.append(line);
}
String response = builder.toString()
// Handle response...
}
答案 1 :(得分:6)
首先,你应该知道http protocal是什么以及它是如何工作的。
和每个http请求一样:
和每个http响应如:
但是我们可以从http服务器读取InputStream,我们可以将从inputstream端读取的每一行拆分为' / r / n'。
和你的代码:
while(true) {
**line = in.readLine();**
if (line.indexOf("Content-Length") != -1)
{
len = Integer.parseInt( line.split("\\D+")[1] );
//System.out.println("LINEE="+len);
}
out.println(line);
str = str + line + '\n';
if(line.isEmpty()) break;
}
}
和 in.readLine()返回每一行不以' / r / n'结尾,它以' / r'返回行尾。或者' / n' 。 也许从这里的输入流块中读取。
这是一个IOStreamUtils,用' / r / n'来读取行尾。