Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.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
Java 在使用套接字时,我的响应似乎挂在响应类中_Java_Sockets - Fatal编程技术网

Java 在使用套接字时,我的响应似乎挂在响应类中

Java 在使用套接字时,我的响应似乎挂在响应类中,java,sockets,Java,Sockets,我目前正在实现一个web代理,但我遇到了一个问题。我可以从浏览器解析我的请求并提出一个新的请求,但我似乎在响应方面有问题。它一直挂在我的响应循环中 serveroutput.write(request.getFullRequest()); // serveroutput.newLine(); serveroutput.flush(); //serveroutput.

我目前正在实现一个web代理,但我遇到了一个问题。我可以从浏览器解析我的请求并提出一个新的请求,但我似乎在响应方面有问题。它一直挂在我的响应循环中

    serveroutput.write(request.getFullRequest());
            //  serveroutput.newLine();
                serveroutput.flush();
                //serveroutput.
                 //serveroutput.close();
            } catch (IOException e) {
                System.out.println("Writting tothe server was unsuccesful");
                e.printStackTrace();
            }
            System.out.println("Write was succesful...");
             System.out.println("flushed.");

             try {
                 System.out.println("Getting a response...");
                 response= new    HttpResponse(serversocket.getInputStream());
        } catch (IOException e) {
                System.out.println("tried to read response from server but failed");
                e.printStackTrace();
            }

              System.out.println("Response was succesfull");



      //response code

        public HttpResponse(InputStream input) {
    busy=true;

      reader = new BufferedReader(new InputStreamReader(input));
      try {
          while (!reader.ready());//wait for initialization.

          String line;
          while ((line = reader.readLine()) != null) {
              fullResponse += "\r\n" + line;


          }

          reader.close();
          fullResponse = "\r\n" + fullResponse.trim() + "\r\n\r\n";
      } catch (IOException`` e) {

          e.printStackTrace();
      } 
      busy = false;
  }
这条线进入一个无限循环,不断冲击CPU,直到流可供读取。一般来说,这不是个好主意


这条线进入一个无限循环,不断冲击CPU,直到流可供读取。通常不是一个好主意。

您正在套接字上执行阻塞同步读取。Web服务器在向您发送页面(如果指定了HTTP/1.1)后不会关闭它们的连接,因此它将一直处于关闭状态,直到Web服务器超时连接为止。要正确执行此操作,您需要查找
内容长度
标题,并在到达正文时读取适当数量的数据


您真的不应该试图重新发明轮子,而是使用Java提供的核心
HttpURLConnection
或Appache
HttpClient
来发出请求

您正在套接字上执行阻塞同步读取。Web服务器在向您发送页面(如果指定了HTTP/1.1)后不会关闭它们的连接,因此它将一直处于关闭状态,直到Web服务器超时连接为止。要正确执行此操作,您需要查找
内容长度
标题,并在到达正文时读取适当数量的数据


您真的不应该试图重新发明轮子,而是使用Java提供的核心
HttpURLConnection
或Appache
HttpClient
来发出请求

您在这里犯了很多错误

  • 使用自旋循环调用
    ready()
    ,而不只是在后续读取中阻塞
  • 当您不知道数据是文本时,使用
    读卡器
  • 没有实现HTTP 1.1协议,哪怕只是一点点
我建议您重新检查代码,而不是重新检查代码。要实现HTTP 1.1的朴素代理,只需执行以下操作:

  • 从客户端读一行。这应该是一个CONNECT命令,用于命名要连接的主机。使用DataInputStream而不是BufferedReader阅读本文,是的,我知道它已被弃用

  • 连接到目标。如果成功,将HTTP 200发送回客户端。如果没有,则发送任何适当的HTTP状态并关闭客户端

  • 如果在(2)处成功,则启动两个线程,一个用于将所有数据以字节形式从客户端复制到目标,另一个用于执行相反的操作

  • 当EOS读取其中一只袜子时,对另一只袜子调用
    shutdownOutput()

  • 如果尚未在此线程的输入套接字上调用
    shutdownOutput()
    ,请退出该线程

  • 如果已经调用了它,请关闭两个套接字并退出线程


  • 注意,除了CONNECT命令之外,您不必解析任何东西;你不必担心内容长度;您只需正确传输字节和EOS。

    您在这里犯了很多错误

    • 使用自旋循环调用
      ready()
      ,而不只是在后续读取中阻塞
    • 当您不知道数据是文本时,使用
      读卡器
    • 没有实现HTTP 1.1协议,哪怕只是一点点
    我建议您重新检查代码,而不是重新检查代码。要实现HTTP 1.1的朴素代理,只需执行以下操作:

  • 从客户端读一行。这应该是一个CONNECT命令,用于命名要连接的主机。使用DataInputStream而不是BufferedReader阅读本文,是的,我知道它已被弃用

  • 连接到目标。如果成功,将HTTP 200发送回客户端。如果没有,则发送任何适当的HTTP状态并关闭客户端

  • 如果在(2)处成功,则启动两个线程,一个用于将所有数据以字节形式从客户端复制到目标,另一个用于执行相反的操作

  • 当EOS读取其中一只袜子时,对另一只袜子调用
    shutdownOutput()

  • 如果尚未在此线程的输入套接字上调用
    shutdownOutput()
    ,请退出该线程

  • 如果已经调用了它,请关闭两个套接字并退出线程


  • 注意,除了CONNECT命令之外,您不必解析任何东西;你不必担心内容长度;您只需正确传输字节和EOS。

    服务器是否在响应结束时发送“新行”
    reader.readLine()
    …来自Java文档“一行被认为是由换行符('\n')、回车符('\r')或回车符紧跟着换行符中的任何一个终止的”同样-您可能不需要
    reader.ready()
    作为
    reader.readLine()
    将被阻止,直到它以任何方式从缓冲区中读取了一行数据……在我解析整个响应之前,我真的无法判断浏览器发送了什么。服务器在响应结束时发送了“新行”吗
    reader.readLine()
    …来自Java文档“一行被认为是由换行符('\n')、回车符('\r')或回车符紧跟着换行符中的任何一个终止的”同样-您可能不需要
    reader.ready()
    作为
    reader.readLine()
    会一直阻塞,直到它从缓冲区中读取一行内容为止……在我解析整个响应之前,我真的无法判断浏览器发送了什么。我只是在设计一个代理,想了解套接字编程的细节。好了,你来了:)如果是这样的话,你必须正确处理HTTP协议,或者。。。它会挂起来的
    while (!reader.ready());