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