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

我根本不是Java程序员。 我试图不惜一切代价避免它,但是我需要将它用于一个class级(在学校意义上)。 老师要求我们使用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); } 

我得到一个空白行,一个0和另一个空白行,然后下一个in.readLine()永远挂起,而不是在HTML的结尾处完成。 为什么? 哪里是我的空?

我试过out.close()看看是否有Yahoo! 正在做一个持久的http会话或其他东西(我不认为没有我们愿意这样做的标题)。

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

您的问题是内容编码“chunked”。 当在响应开始时不知道从Web服务器请求的内容的长度时使用此方法。 它基本上由发送的字节数组成,后跟CRLF ,后跟字节。 响应的结束由您看到的确切顺序发出信号。 Web服务器现在正在等待您的下一个请求(这也称为“请求流水线”)。

你有几种可能性:

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

所以你正在从套接字中读取(你没有在你的代码中显示,但这是我从文本中收集的内容)?

只要另一方没有关闭连接,Java就不知道它在输入的末尾,所以readLine()正在等待另一方发送更多数据并且不返回null

尝试GET url HTTP/1.0HTTP/1.0告诉服务器每个连接不能处理多个文档。 在这种情况下,服务器应在发送结果后关闭连接。

没有2个回车+换行对,您的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();