【问题标题】:Wrting a HTTP proxy in Java using only the Socket class仅使用 Socket 类在 Java 中编写 HTTP 代理
【发布时间】: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 请求和响应正文由行甚至字符组成。

标签: java sockets


【解决方案1】:

如果您要求一种按行读取 InputStream 的方法,这个可能会为您服务:

    BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(input, "UTF-8"));
    String line;
    StringBuilder clientData=new StringBuilder();
    while ((line=bufferedReader.readLine()) != null)
    {
        clientData.append(line);
    }

您必须小心不要以这种方式读取 InputStream,除非您事先确定它包含只是纯文本(而不是二进制数据)。

顺便说一句:为了提高效率,我建议您根据最终大小使用初始大小预先调整 clientData 的大小(如果不是,它将从默认大小 10 开始,并且需要重新调整大小更多次)。

【讨论】:

  • 这不是读取 HTTP 响应的正确方法,除非在您未指定的某些严格条件下。
  • @EJP OP 正在请求某种方法来“使用输入流并逐行读取”。而且我还指定这仅对纯文本数据有用。所以我不同意你的观点......除非你好心解释,至少,那些“严格条件”是什么。
  • 没有。 OP 正在尝试编写代理。关于逐行阅读的说法来自他“进行”的所谓“研究”,我已经评论过。这是问题的一部分,而不是解决方案的一部分。您不能使用线路 I/O 编写代理。条件包括我在 cmets 中已经说明的两个条件,以及数据在流结束时终止。这些都是 HTTP 中的特殊情况。
  • @EJP 好的。我同意:在代理中,数据应直接写入输出流对等体,并且此解决方案依赖于流结束。但这不是一个广泛的问题。这个问题非常明确和具体,我试图清楚具体地回答它。如果您了解 OP 的作者应该考虑其他条件,请发布您自己的答案并让他/她决定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-19
  • 2022-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-24
相关资源
最近更新 更多