我正在尝试在Android设备上创建http代理服务器.当我尝试从HTTP服务器(example1.com)读取响应时(example1.com包含标题中的内容长度)如果HTTP服务器包含内容长度,那么我从内容长度读取字节,否则我读取所有字节的响应
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);
}
Run Code Online (Sandbox Code Playgroud)
out - outStream to browser
小智 7
首先,你应该知道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;
}
}
Run Code Online (Sandbox Code Playgroud)
和in.readLine()返回不以'/ r/n'结尾的每一行,它以'/ r'或'/ n'返回行结束.也许从这里的输入流块中读取.
这是一个用'/ r/n'读取行结尾的IOStreamUtils.
请尝试以下代码:
// 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...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1330 次 |
| 最近记录: |