可以引起网络连接关闭的情况有以下4种:

1.  直接调用Socket类的close方法。

2.  只要Socket类的InputStream和OutputStream有一个关闭,网络连接自动关闭(必须通过调用InputStream和OutputStream的 close方法关闭流,才能使网络自动关闭)。

3.  在程序退出时网络连接自动关闭。

4.  将Socket对象设为null或未关闭最使用new Socket(…)建立新对象后,由JVM的垃圾回收器回收为Socket对象分配的内存空间后自动关闭网络连接。

虽然这4种方法都可以达到同样的目的,但一个健壮的网络程序最好使用第1种或第2种方法关闭网络连接。这是因为第3种和第4种方法一般并不会马上关闭网络连接,如果是这样的话,对于某些应用程序,将会遗留大量无用的网络连接,这些网络连接会占用大量的系统资源。

在Socket对象被关闭后,我们可以通过isClosed方法来判断某个Socket对象是否处于关闭状态。然而使用isClosed方法所返回的只是Socket对象的当前状态,也就是说,不管Socket对象是否曾经连接成功过,只要处于关闭状态,isClosde就返回true。如果只是建立一个未连接的Socket对象,isClose也同样返回true。如下面的代码将输出false。

Socket socket = new Socket();
System.out.println(socket.isClosed());

除了isClose方法,Socket类还有一个isConnected方法来判断Socket对象是否连接成功。看到这个名字,也许读者会产生误解。其实isConnected方法所判断的并不是Socket对象的当前连接状态,而是Socket对象是否曾经连接成功过,如果成功连接过,即使现在isClose返回true,isConnected仍然返回true。因此,要判断当前的Socket对象是否处于连接状态,必须同时使用isClose和isConnected方法,即只有当isClose返回false,isConnected返回true的时候Socket对象才处于连接状态。下面的代码演示了上述Socket对象的各种状态的产生过程。

package mysocket;
import java.net.*;
public class MyCloseConnection
{
public static void printState(Socket socket, String name)
{
System.out.println(name + ".isClosed():" + socket.isClosed());
System.out.println(name + ".isConnected():" + socket.isConnected());
if (socket.isClosed() == false && socket.isConnected() == true)
System.out.println(name + "处于连接状态!");
else
System.out.println(name + "处于非连接状态!");
System.out.println();
}
public static void main(String[] args) throws Exception
{
Socket socket1 = null, socket2 = null;
socket1 = new Socket("www.ptpress.com.cn", 80);
printState(socket1, "socket1");
socket1.getOutputStream().close();
printState(socket1, "socket1");
socket2 = new Socket();
printState(socket2, "socket2");
socket2.close();
printState(socket2, "socket2");
}
}

运行上面的代码后,将有如下的输出结果:

socket1.isClosed():false

socket1.isConnected():true

socket1处于连接状态!

socket1.isClosed():true

socket1.isConnected():true

socket1处于非连接状态!

socket2.isClosed():false

socket2.isConnected():false

socket2处于非连接状态!

socket2.isClosed():true

socket2.isConnected():false

socket2处于非连接状态!

从输出结果可以看出,在socket1的OutputStream关闭后,socket1也自动关闭了。而在上面的代码我们可以看出,对于一个并未连接到服务端的Socket对象socket2,它的isClosed方法为false,而要想让socket2的isClosed方法返回true,必须使用socket2.close显示地调用close方法。

Java socket中isClose()和isConnected() .相关推荐

  1. Java socket中关闭IO流后,发生什么事?(以关闭输出流为例)

    为了方便讲解,我们把 DataOutputstream dout = new DataOutputStream(new BufferedOutputStream(mySocket.getOutputS ...

  2. java socket中的方法_Java中关于Socket的方法与作用详解

    1.java.net.Socket;套接字.封装了TCP通讯协议,使用它可以基于TCP与远端计算机上的服务端应用程序链接并进行通讯. 实例化Socket就是与服务器端建立连接的过程.这里需要传入两个参 ...

  3. java socket中属性详解_前端开发:关于Vue组件中的data属性值是函数而不是对象的详解...

    最近在搞关于前端开发的基础知识归纳,发现了不少经典知识点,那么本篇博文就来分享一个经典的知识点:Vue组件中的data属性值为什么是函数而不是对象.首先来了解一下Vue组件的使用理念:在Vue组件使用 ...

  4. java socket中属性详解_新款宝马5系详解,豪华中大型轿车也能主打运动、科技属性...

    在2020年北京车展上,宝马推出了5系的中期改款版本,共17款车型.其中,长轴距燃油版有10款车型,售价区间为42.69万-54.99万元:标准轴距燃油版有4款车型,售价区间为42.39万-60.39 ...

  5. java socket建立长连接_Java Web项目中使用Socket通信多线程、长连接的方法

    很多时候在javaweb项目中我们需要用到Socket通信来实现功能,在web中使用Socket我们需要建立一个监听程序,在程序启动时,启动socket监听.我们的应用场景是在java项目中,需要外接 ...

  6. java socket发送定长报文_java使用Socket类接收和发送数据

    网络应用分为客户端和服务端两部分,而Socket类是负责处理客户端通信的Java类.通过这个类可以连接到指定IP或域名的服务器上,并且可以和服务器互相发送和接受数据.在本文及后面的数篇文章中将详细讨论 ...

  7. 【转】Java Socket编程基础及深入讲解

    原文:https://www.cnblogs.com/yiwangzhibujian/p/7107785.html#q2.3.3 Socket是Java网络编程的基础,了解还是有好处的, 这篇文章主要 ...

  8. java socket 重连复用_Java Socket编程基础及深入讲解(示例代码)

    Socket是Java网络编程的基础,了解还是有好处的, 这篇文章主要讲解Socket的基础编程.Socket用在哪呢,主要用在进程间,网络间通信.本篇比较长,特别做了个目录: 一.Socket通信基 ...

  9. java android长连接_基于Java Socket的自定义协议,实现Android与服务器的长连接(一)...

    一.基础知识准备 在正式给大家介绍自定义协议之前,我们先对网络传输和协议解析的相关知识点做一个基本的介绍,尽管这些知识点我们在学校里学过,但难免会有所遗忘,这里先做一个简单的介绍,以便对后文的内容理解 ...

最新文章

  1. 程序员崩溃的10个瞬间
  2. 任正非:管理就要铲除公司夹心层!
  3. 【偶尔一道ctf】xctf adword mobile easy-apk
  4. c++ 不允许使用抽象类类型的对象_Java中日期API的使用总结
  5. 【深度学习】单位高斯化
  6. Android程序如何实现从网络中获取一张图片
  7. 基于 Vue 的移动端富文本编辑器 vue-quill-editor 实战
  8. VB讲课笔记02:VB程序开发环境
  9. 力扣172.阶乘后的零
  10. 廖雪峰Git学习笔记(超级无敌详细)
  11. JavaScript纯前端上传和下载文件
  12. 使用mmdetection检测并存储结果
  13. houdini大神自诉:为什么我要放弃maya I
  14. 中青杯数学建模竞赛是什么级别的比赛_2018年中青杯全国大学生数学建模竞赛...
  15. 如何检测判断硅钢片性能牌号?
  16. spring Aop中切入点和连接点什么关系?
  17. 芥川龙之介《山药粥》
  18. 计算机视觉可解释性——卷积神经网络中间层的可视化
  19. linux系统的超级管理员,系统的超级管理员:root《 Linux 文件与目录权限 》
  20. C++ sort函数(升序降序排列)

热门文章

  1. 微软为NBA提供云计算服务、Google公布Fuchsia OS细节、Zoom用户可选择数据库等|Decode the Week...
  2. 【专场】揭秘端到端视频技术
  3. Hadoop之Yarn工作机制详解
  4. 腾讯AI Lab正式开源业内最大规模多标签图像数据集
  5. 腾讯数据库内核团队资深架构师:TXSQL Internals @2018
  6. 时光机穿梭---删除文件
  7. 大数据架构如何做到流批一体?【对于Flink等流批一体的概念做了很好的澄清!】
  8. 大剑无锋之GC【面试推荐】
  9. leetcode 79. Word Search | 79. 单词搜索(回溯+DFS)
  10. leetcode 242. 有效的字母异位词(Java版)