当前位置: 首页 > 面试题库 >

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

萧树
2023-03-14
问题内容

我根本不是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和另一个空行,然后下一个in.readLine()永远挂起。为什么?我的空在哪里?

我尝试了out.close()来看看是否Yahoo! 正在执行持久的http会话或其他操作(如果没有我们愿意做的标头,我认为这不会)。

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


问题答案:

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

您有几种可能性:

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


 类似资料:
  • 问题内容: 我正在使用从远程服务器读取响应的方法(该服务器使用C语言编写,并且无法访问源代码)。 但是它总是在最后一行阻塞,直到超时为止。所以我用下面的代码: 我发现读取的最后一个字节的整数值为13,我认为这是回车,对吗? 那么为什么该方法会阻塞?服务器通常如何发出信号通知流结束?谢谢。 问题答案: 在网络连接的情况下,当套接字关闭时,流终止。 因此阻塞直到收到“行尾”或您手动关闭连接是完全正常的

  • 问题内容: 我正在尝试使用Java学习套接字,并且成功地将数据发送到了在我自己的计算机上运行的ServerSocket。当我尝试使用readline从此套接字读取消息(以便仅回显自己发送的消息)时,程序将挂起并且不会返回。 这是代码: TCPClient是我定义的类,因此在我的家庭作业中使用swing之前,我可以在更简单的界面上测试程序。这是代码: 我的服务器很简单。建立连接后,它将进入此循环并停

  • 我转向你,在这件事上我一直把头撞在墙上。 我正在做一个小的socket编程,我可以看到当我把它放出来。println(“…”)while循环之前的代码行(in.readLine())它工作正常,但我需要它位于循环内部。 说清楚一点,我没有看到任何错误。我只是看不到此应用程序的客户端显示文本。它看起来好像在工作,但事实并非如此。此外,我也不控制该应用程序的客户端,它由通过TCP连接到此套接字侦听器应

  • 问题内容: 我正在建立一个客户-服务器项目。 我需要的是客户端发送一个字符串,例如“ Pendu”,服务器接收该字符串并将一个名为“ Pendu”的对象发送回客户端。 这是我的代码: 该类在包中定义: 我的问题是: 首先,我执行服务器,然后看到控制台中显示的内容。 然后我执行客户端,在控制台中,我收到如下消息: 同时,服务器端未显示任何新内容。 现在,我停止客户端,并显示服务器的所有其他消息: 当

  • 问题内容: 我试图在多个线程中逐行读取套接字的输入。如何中断,以便可以正常停止正在阻塞的线程? 编辑(赏金) :可以在不关闭套接字的情况下完成此操作吗? 问题答案: 关闭中断线程上的套接字。这将导致在中断的线程上引发异常。 有关此和其他并发问题的更多信息,我强烈推荐Brian Goetz的书“ Java并发实践”。

  • 我想创建能够与多个客户端连接的服务器,但我总是收到“套接字关闭”异常或从输入流中读取空值,以前我认为这是由于以错误的方式关闭套接字连接引起的,所以我发布了这个主题,但现在似乎这不是问题所在。 服务器方法 HandlerThread类 客户端模拟器 例外和问题 在客户端模拟器之前启动服务器,客户端模拟器没有任何异常,但是在服务器端,并没有收到所有数据,从控制台打印信息时,我看到“null”、“Hel