【发布时间】:2015-12-18 03:37:28
【问题描述】:
我正在尝试仅使用 Socket 类在 Java 中编写 HTTP 代理。我之前曾尝试构建一个,并且通过写入套接字的输出流成功地发送了一个请求,但是我很难读取响应。我进行的研究表明我应该使用输入流并逐行读取,但我无法使用这种方法成功读取任何网页。有人对我可以从这里去哪里有任何建议吗?
我的代码实际上使用字节缓冲区从输入流中读取,以便以字节为单位读取页面:
InputStream input = clientSocket.getInputStream()
byte[] buffer = new byte[48*1024];
byte[] redData;
StringBuilder clientData = new StringBuilder();
String redDataText;
int red;
while((red = input.read(buffer)) > -1) {
redData = new byte[red];
System.arraycopy(buffer, 0, redData, 0, red);
redDataText = new String(redData, "UTF-8");
System.out.println("Got message!! " + redDataText);
clientData.append(redDataText);
}
【问题讨论】:
-
太宽泛了。您需要从阅读 RFC 2616 开始,尤其是与内容长度相关的部分。您还需要将读取的数据直接写入对等套接字,而不是先将其累积在内存中。你在浪费时间和空间。
-
我曾经为一门课程做过这样的项目。您是否将线程用于多线程代理服务器?您可以使用this 作为参考。示例 2 将是一个没有线程的示例。
-
您在哪里进行了这项研究?不在这里。如果你看过这里,你只会来回复制字节。您不能假设 HTTP 请求和响应正文由行甚至字符组成。