socket 如果不关闭会自动关闭吗?为啥要心跳连接?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了socket 如果不关闭会自动关闭吗?为啥要心跳连接?相关的知识,希望对你有一定的参考价值。

如果不主动关闭socket的话,系统不会自动关闭的,除非当前进程挂掉了,操作系统把占用的socket回收了才会关闭。
为什么需要心跳连接主要是判断当前连接是否是有效的、可被使用的。在实际应用中假设一段时间没有数据传输时候理论上说应该连接是没有问题的,但是网络复杂,中途出现问题也是常见的,网线被掐断了、对方进程挂掉了、频繁丢包等,这时候TCP连接是不可使用的,但是对于应用层并不知道,如果需知道网络情况则要很复杂的超时进行了解,TCP从底层就实现了这样的功能。心跳机制是TCP在一段时间间隔后发送确定连接端是否还存在,如果存在的话就会回传一个包确定网络有效,如果心跳包有问题,则通知上层应用当前网络有问题了。
参考技术A 这取决于你的server端的超时配置,
每个socket连接都是长连接,它是一个相当占用系统资源的通信管道,
如果这个长连接什么事也没干硬是要占着资源,则server端可以选择关闭这个连接,以省下资源让更多的用户连接进来。
所以,即便客户端的是采用死循环while(true)方式连到服务端,对于特定的客户端和服务端类型来说也需要一定时间间隔的心跳(告诉服务端,我还活着,虽然我没干活也没说话,但别把我关了)。

java中IO流操作怎样关闭流

我说的意思是当关闭流时一般都先判断是否为空,如果不为空才进行关闭,例如if(in!=null)tryin.close();catch(IOExection e);此处的in代表输入流。那么当in=null时是什么意思?

如果 in == null,就说明 in这个引用所指向的对象还没有被创建,自然 in.close()也就不可能被执行,而且会报异常。我是这样想的,程序中 如果你先声明变量
InputStream(或者其他流类型) in = null;
然后执行其他语句,再 in = new 、、、、
在in new之前其他语句出exception,这时流没有被打开,也就无需关闭,如果不判断if(null != in) 硬要关闭in就出exception

另外你的代码按如下写会更合理:

if(null != in)
try
in.flush();
in.close();
in = null;

catch(IOExection e);
参考技术A 如果 in == null,就说明 in这个引用所指向的对象还没有被创建,自然 in.close()也就不可能被执行,而且会报异常。我是这样想的,程序中 如果你先声明变量
InputStream(或者其他流类型) in = null;
然后执行其他语句,再 in = new 、、、、
在in new之前其他语句出exception,这时流没有被打开,也就无需关闭,如果不判断if(null != in) 硬要关闭in就出exception

另外你的代码按如下写会更合理:

if(null != in)
try
in.flush();
in.close();
in = null;

catch(IOExection e);
参考技术B in=null时的意思就是说流还没有被初始化时就报异常了,此时流为空值。对于空值的流是不能关闭的,否则会出空指针异常。所以之前要判断一下。 参考技术C 调用流的close();方法关闭 参考技术D 有 相关方法关闭 如:FileOutputStream out = new FileOutputStream
操作完成后 out.close

以上是关于socket 如果不关闭会自动关闭吗?为啥要心跳连接?的主要内容,如果未能解决你的问题,请参考以下文章

IOCP怎么正确关闭socket

IOCP怎么正确关闭socket

如何判断对端关闭了socket

java程序中的流都要统统关闭吗?有没有先后顺序??

如何优雅的关闭线程池?

学习JAVA Socket中 启动了serverSocket 再启动socket 为啥serversocket 自动关闭了