当前位置: 首页 > 知识库问答 >
问题:

Socket.close()被认为是结束连接的干净方法吗?

明阳旭
2023-03-14

正如标题所说——如果我想关闭一个套接字连接,只要调用mySocket就足够了。close()?另一边会发生什么?

或者,如果这不是应该走的路,那是什么?我必须通过套接字发送某种“完成”消息,这样对方就知道它也应该结束吗?

附加问题:java文档说

关闭此套接字还将关闭套接字的InputStream和OutputStream。

那么,仅仅关闭套接字就足够了,还是我也必须显式地关闭流(当然,假设我没有使用try with resources

共有2个答案

姚向晨
2023-03-14

socket。close()是关闭连接的干净方法。它会将TCP FIN数据包发送到对等方,并启动正常的TCP关闭序列。

它还关闭了套接字的InputStreamOutputStream,在这一点上我没有看到留档中的任何歧义。

商泽宇
2023-03-14

关上插座对另一侧没有任何作用。远程主机将不知道连接已关闭。检查连接是否关闭的唯一方法是尝试从输入/输出流读取或写入数据。如果InputStream#read()方法返回-1,则第二方知道第一方关闭了连接。抛出的IOException也表示连接已关闭。

通常,您不需要关闭in/output流,因为调用Socket时它们是关闭的#close()<代码>套接字#close()是关闭连接所需的唯一操作。

但是如果您有一个包装流(例如BufferdInputStream/BufferedOutputStream),您应该明确地关闭这些包装流,以释放这些包装流使用的资源(例如字节缓冲阵列)。您只需要关闭顶级包装流,因为关闭包装会关闭包装流,这也会关闭包装流的包装流。等等

 类似资料:
  • 根据我的理解,如果子例程不作用于类的实例(其作用仅限于显式输入/输出),则它是;如果子例程作用于类的实例,则它是(它可能会对实例产生副作用,使其不纯)。 关于这个话题,这里有一个很好的讨论。请注意,根据接受答案的定义,静态实际上应该是一个函数,因为实例从不隐式传递,而且它不能访问任何实例的成员。 不过,考虑到这一点,静态实际上不应该是函数吗? 我想确保我使用了正确的措辞。 有人能澄清一下吗?

  • 问题内容: 我正在尝试从另一个站点获取信息。当我尝试去做 它抛出一个。这是否意味着该站点将不允许自动连接?还有另一种获取此信息的方法吗? 问题答案: 这可能意味着几件事: 该站点有问题并且正在主动断开连接(拒绝与超时不同,拒绝完全没有响应) 中间人可能拒绝了您的连接,例如防火墙,尽管如果您可以通过浏览器访问该站点,则不太可能 您使用了错误的端口,即您输入https://时的意思是http://,反

  • 问题内容: 一个没有stopServer功能的RMI服务器,可以正常工作。 每当被调用异常中的stopServer()抛出时 这是堆栈跟踪 即使我使用清理服务对象,情况也一样 有人可以提出一种干净的方法来停止服务器,这还会释放端口以供重用。 问题答案: 您需要存储结果并取消导出结果。目前,您正在尝试取消导出存根。

  • 问题内容: 我使用并不少。 这是以下示例输出: 今天,我只需要在脚本中检索uwsgi 的 主进程 (因此我只需要15237,而不想要15293或15294)。 从今天开始,我尝试了一些……但是我想要一种 更清洁的方法 。 我还遇到了unix.com论坛中的另一种解决方案: 但是仍然有 很多管道 和 丑陋的招数 。 真的没有选择或更巧妙的技巧(也许使用 awk )来完成该任务吗? 问题答案: 与@n

  • 问题内容: 为什么将两个使用相同方法的命名接口视为不同的接口,又如何避免呢? 假设我们有一个喜欢吃产品的人(食者)。他不在乎产品是什么,他只想指出从哪里可以买到新产品。换句话说,他想要产品服务,但并不关心产品服务将生产什么产品。在具体的实现中,我们将尝试用苹果喂他,因此我们将为他提供appleService。 结果如下: 接口和具有相同的方法,除了golang之外,别无其他。为什么以及如何避免这种

  • 问题内容: 我需要使用$ resource 发送带有我的DELETE请求的请求正文 我可以看到的唯一方法是更改​​: https://github.com/angular/angular.js/blob/master/src/ngResource/resource.js 从 至 有没有更好的方法来覆盖此?就像您更改内容类型标头时一样,您可以执行以下操作: 或类似的东西…我已经用谷歌搜索了一下,但也