Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅使用Socket类在Java中编写HTTP代理_Java_Sockets - Fatal编程技术网

仅使用Socket类在Java中编写HTTP代理

仅使用Socket类在Java中编写HTTP代理,java,sockets,Java,Sockets,我试图用Java编写一个HTTP代理,只使用Socket类。我之前曾试图构造一个,并且通过写入套接字的输出流成功地发送了一个请求,但是我很难读取响应。我进行的研究表明,我应该使用输入流并逐行阅读,但我还没有能够使用这种方法成功地阅读任何网页。谁能给我一些建议,让我从这里走到哪里 我的代码实际上使用字节缓冲区从输入流中读取,以便以字节为单位读取页面: InputStream input = clientSocket.getInputStream() byte[] buffer =

我试图用Java编写一个HTTP代理,只使用Socket类。我之前曾试图构造一个,并且通过写入套接字的输出流成功地发送了一个请求,但是我很难读取响应。我进行的研究表明,我应该使用输入流并逐行阅读,但我还没有能够使用这种方法成功地阅读任何网页。谁能给我一些建议,让我从这里走到哪里

我的代码实际上使用字节缓冲区从输入流中读取,以便以字节为单位读取页面:

    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);
       }

如果您正在寻求一种逐行读取输入流的方法,此方法可能有助于您:

    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开始,需要重新调整多次)。

太宽了。您需要从阅读RFC2616开始,尤其是与内容长度相关的部分。您还需要将读取的数据直接写入对等套接字,而不是先将其累积到内存中。你在浪费时间和空间。我曾经为一门课程做过这样的项目。您是否在多线程代理服务器上使用线程?你可以作为参考。例2是一个没有线程的例子。你在哪里进行的研究?不在这里。如果您在这里查看,您将只是来回复制字节。您不能假设HTTP请求和响应正文由行甚至字符组成。这不是读取HTTP响应的正确方法,除非在某些您未指定的严格条件下。@EJP OP正在请求某种方法“使用输入流并逐行读取”。我还指定这只对纯文本数据有用。所以我不同意你的观点。。。除非你这么好心地解释,至少,那些“严格的条件”是什么。OP正在尝试编写代理。关于逐行阅读的陈述来自于他“进行”的所谓“研究”,我已经对此发表了评论。这是问题的一部分,而不是解决方案的一部分。不能使用行I/O编写代理。条件包括我在注释中已经说明的两个条件,以及数据在流结束时终止。这些都是HTTP中的特殊情况。@EJP OK。我同意:在代理中,数据应该直接写入outputstream对等方,而此解决方案依赖于流结束。但这不是一个广泛的问题;这个问题非常明确和具体,我已经试着明确和具体地回答它。如果你知道OP的作者还需要考虑其他条件,请发表你自己的答案,让他/她决定。