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

如何识别Java套接字中的EOF?

何博涛
2023-03-14
问题内容

我想识别Java套接字 中数据流的结尾 。当我运行下面的代码时,它只是卡住并继续运行(它卡在value上10)。

我也希望该程序下载二进制文件,但是最后一个字节始终是不同的,因此我不知道如何(实用地)停止 一会儿

String host = "example.com";
String path = "/";
Socket connection = new Socket(host, 80);

PrintWriter out = new PrintWriter(connection.getOutputStream());
  out.write("GET "+ path +" HTTP/1.1\r\nHost: "+ host +"\r\n\r\n");
out.flush();

int dataBuffer;
while ((dataBuffer = connection.getInputStream().read()) != -1)
  System.out.println(dataBuffer);

out.close();

感谢您的任何提示。


问题答案:
  1. 您应该将现有库用于HTTP。看这里。
  2. 您的代码按预期工作。服务器不会关闭连接,并且dataBuffer永远不会变为-1。发生这种情况是因为默认情况下,连接在HTTP 1.1中保持活动状态。使用HTTP 1.0,或Connection: close在请求中添加标头。

例如:

out.write("GET "+ path +" HTTP/1.1\r\nHost: "+ host +"\r\nConnection: close\r\n\r\n");
out.flush();

int dataBuffer;
while ((dataBuffer = connection.getInputStream().read()) != -1) 
   System.out.print((char)dataBuffer);

out.close();


 类似资料:
  • 问题内容: 大家好。我有一个使用ServerSocket和Socket类用Java编写的服务器。 我希望能够检测并处理断开连接,然后在必要时重新连接新客户端。 检测客户端断开连接,关闭套接字然后接受新客户端的正确步骤是什么? 问题答案: 大概是在从套接字读取数据,也许是在输入流上使用包装器,例如BufferedReader。在这种情况下,当相应的读取操作返回-1(对于原始read()调用)或为nu

  • 问题内容: 我现在专注于需要深入了解Java字节码的项目。 借助于bcel,我现在可以完成大部分工作。我现在不清楚的一点是如何识别子类方法覆盖其基本代码?文件中是否记录了与方法相关联的任何属性,表明该重写关系,或者我应该返回其基类可以比较方法签名吗? 任何提示将不胜感激。 问题答案: 您需要查找层次结构链-字节码中没有任何内容表明它是被重写的方法,因为不需要。

  • 问题内容: TLDR;如何在基于事件的编程模型中标识套接字。 我刚刚开始使用node.js,过去我在C ++和PHP sockets()中完成了大部分编码工作,所以node.js对我来说是非常新的东西。 在c ++中,我们可以通过编写主套接字(例如服务器)来侦听新的连接和更改,然后相应地处理这些连接,从而完成识别套接字的工作。 问题答案: 如果您在寻找实际的套接字而不是socket.io,那么它们

  • 问题内容: 我正在尝试检测Java字节码。 我想识别 java循环 的 进入和退出 ,但是我发现识别循环非常具有挑战性。我花了很多时间研究 ASM 和 开源反编译器 (我一直认为自己必须始终解决此问题),但是我的想法很短。 我正在扩充/扩展的工具正在使用ASM,因此理想情况下, 我想知道如何通过ASM在Java中检测不同循环结构的进入和退出 。但是,我也欢迎关于一个好的开源反编译器的建议,因为显然

  • 问题内容: 在我的代码中,我正在创建一个对象集合,各个线程将以一种仅在对象是不可变的情况下才安全的方式访问这些对象。当试图将一个新对象插入到我的集合中时,我想测试一下它是否是不可变的(如果不是,我将抛出一个异常)。 我可以做的一件事是检查一些众所周知的不可变类型: 这实际上使我省了90%的路,但是有时我的用户会想要创建自己的简单不可变类型: 是否有某种方式(也许使用反射)可以可靠地检测到类是否不可

  • 我最近一直在玩套接字,但是我遇到了一个问题…当我从服务器接收数据时,我得到一个“java.net.套接字异常:套接字关闭”异常。我没有在任何地方关闭套接字,事实上,我唯一使用关闭()的地方是扫描仪上从System.in读取文本; 以下是我的代码: 客户: 服务器: 数据包发送者: 客户端接收器: 数据包接收器: