Java、套接字、BufferedReader和readline挂起…:(

Java、套接字、BufferedReader和readline挂起…:(,java,sockets,Java,Sockets,我根本不是一个Java程序员。实际上,我会不惜一切代价避免它,但我必须在课堂上使用它(在学校的意义上)。老师要求我们使用Socket()、BufferedReader()、PrintWriter()和其他各种方法,包括BufferedReader()的readLine()方法 基本上,这就是我遇到的问题。文档清楚地说明readLine应该在输入流的末尾返回null,但事实并非如此 Socket link = new Socket(this.address, 80); Buffered

我根本不是一个Java程序员。实际上,我会不惜一切代价避免它,但我必须在课堂上使用它(在学校的意义上)。老师要求我们使用Socket()、BufferedReader()、PrintWriter()和其他各种方法,包括BufferedReader()的readLine()方法

基本上,这就是我遇到的问题。文档清楚地说明readLine应该在输入流的末尾返回null,但事实并非如此

Socket link       = new Socket(this.address, 80);
BufferedReader in = new BufferedReader( new InputStreamReader( link.getInputStream() ));
PrintWriter   out = new PrintWriter(    new PrintWriter(       link.getOutputStream(), true ));

out.print("GET blah blah blah"); // http request by hand
out.flush(); // send the get please

while( (s=in.readLine()) != null ) {

    // prints the html correctly, hooray!!
    System.out.println(s);
}
我没有在HTML的末尾结束,而是得到一个空行,一个0和一个0 另一个空行和.readLine()中的下一个永远挂起。为什么? 我的手机在哪里

我尝试了.close()以查看Yahoo!是否正在执行持久http 会话或其他内容(我认为如果没有标题 我们愿意这样做)

我在网上找到的所有Java套接字示例似乎都表明 while循环是正确的形式。我只是不知道足够的Java来调试
这是。

那么您是从套接字读取的(您没有在代码中显示这一点,但这是我从文本中收集的)


只要另一方不关闭连接,Java就不知道它在输入端,因此
readLine()
正在等待另一方发送更多数据,并且不返回
null

您的问题是内容编码“分块”。当响应启动时,从web服务器请求的内容长度未知时,使用此选项。它基本上由发送的字节数组成,后跟
CRLF
,后跟字节。响应结束时,您看到的确切顺序表示响应结束。web服务器现在正在等待您的响应下一个请求(也称为“请求管道”)

您有几种可能性:

  • 使用HTTP版本1.0。这将导致Web服务器在完全发送响应后自动关闭连接
  • 发送请求时指定“连接:关闭”标题。这也将关闭连接
  • 正确解析编码为“分块”的内容,并简单地将其视为响应现在已经完成

    • 如果没有两个回车符+换行符对,您的HTTP请求将不完整。您可能还应该在发送请求后调用close:

      out.print("GET /index.html HTTP/1.0\r\n");
      // maybe print optional headers here
      // empty line
      out.print("\r\n");
      out.flush();
      out.close();
      

      …从套接字读取,是的。我在问题中添加了这一点,谢谢。这很有意义。我需要检查标题。我将使用http1.0。是的,对于学校练习来说,这是最明智的做法。