Java网络编程从入门到精通(27):关闭服务端连接

简介: 本文为原创,如需转载,请注明作者和出处,谢谢! 上一篇:Java网络编程从入门到精通(26):在服务端接收和发送数据     在客户端和服务端的数据交互完成后,一般需要关闭网络连接。

本文为原创,如需转载,请注明作者和出处,谢谢!

上一篇:Java网络编程从入门到精通(26):在服务端接收和发送数据

    在客户端和服务端的数据交互完成后,一般需要关闭网络连接。对于服务端来说,需要关闭SocketServerSocket

在关闭Socket后,客户端并不会马上感知自已的Socket已经关闭,也就是说,在服务端的Socket关闭后,客户端的SocketisClosedisConnected方法仍然会分别得到falsetrue。但对已关闭的Socket的输入输出流进行操作会抛出一个SocketException异常。

在关闭服务端的ServerSocket后,ServerSocket对象所绑定的端口被释放。这时客户端将无法连接服务端程序。下面的代码演示了在服务端关闭Socket后,客户端是所何反应的。

package server;

import  java.net. * ;

class  Client
{
    
public   static   void  main(String[] args)  throws  Exception
    {
        Socket socket 
=   new  Socket( " 127.0.0.1 " 1234 );
        Thread.sleep(
1000 );
        
//  socket.getOutputStream().write(1);
        System.out.println( " read() =  "   +  socket.getInputStream().read());
        System.out.println(
" isConnected() =  "   +  socket.isConnected());
        System.out.println(
" isClosed() =  "   +  socket.isClosed());
    }
}
public   class  CloseSocket
{
    
public   static   void  main(String[] args)  throws  Exception
    {
        ServerSocket serverSocket 
=   new  ServerSocket( 1234 );
        
while  ( true )
        {
            Socket socket 
=  serverSocket.accept();
            socket.close();
           
        }
    }
}

  测试
执行下面的命令

java server.CloseSocket
java server.Client

运行结果

read()  =   - 1
isConnected() 
= true
isClosed() 
= false

从上面的运行结果可以看出例程Client并未抛出SocketException异常。而在012行的read方法返回了-1。如果将socket.close去掉,客户端的read方法将处于阻塞状态。这是因为Java在发现无法从服务端的Socket得到数据后,就通过read方法返回了-1。如果将011行的注释去掉,Client就会抛出一个SocketException异常。大家可以试试,并socket.close行改成serverSocket.close后,客户端就会抛出连接异常:

Exception in thread  " main "  java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:
168 )
    at java.net.SocketInputStream.read(SocketInputStream.java:
182 )
    at chapter5.Client.main(CloseSocket.java:
12 )

显式地调用close方法关闭ServerSocket并不是必须的,在程序退出时将自动关闭ServerSocket。但通过close方法关闭ServerSocket,可以使其他的ServerSocket对象绑定该端口。可以使用ServerSocket类的isClosedisBound方法判断ServerSocket是否处于活动状态,如下面的代码所示:

 

ServerSocket serverSocket  =   new  ServerSocket( 1234 );
if  (serverSocket.isBound()  ==   true   &&  serverSocket.isClosed()  ==   false )
    System.out.println(
" serverSocket处于活动状态! " );
else
    System.out.println(
" serverSocket处于非活动状态! " );

上面代码所示的“非活动状态”可能是serverSocket对象已经关闭,也可能是serverSocket对象是使用ServerSocket类的默认构造方法创建的,而且未调用bind方法绑定端口。在这里要注意的是isBound方法返回true并不意味着serverSocket对象处于活动状态,调用close方法并不会将绑定状态置为false。这一点和Socket类的isConnected方法类似。

 下一篇:Java网络编程从入门到精通(28):获取ServerSocket信息的方法及FTP原理




国内最棒的Google Android技术社区(eoeandroid),欢迎访问!

《银河系列原创教程》发布

《Java Web开发速学宝典》出版,欢迎定购

目录
相关文章
|
2月前
|
存储 Oracle Java
java零基础学习者入门课程
本课程为Java零基础入门教程,涵盖环境搭建、变量、运算符、条件循环、数组及面向对象基础,每讲配示例代码与实践建议,助你循序渐进掌握核心知识,轻松迈入Java编程世界。
316 0
|
2月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
196 1
|
2月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
221 1
|
3月前
|
Java
java入门代码示例
本文介绍Java入门基础,包含Hello World、变量类型、条件判断、循环及方法定义等核心语法示例,帮助初学者快速掌握Java编程基本结构与逻辑。
424 0
|
3月前
|
Java API 数据库
2025 年最新 Java 实操学习路线,从入门到高级应用详细指南
2025年Java最新实操学习路线,涵盖从环境搭建到微服务、容器化部署的全流程实战内容,助你掌握Java 21核心特性、Spring Boot 3.2开发、云原生与微服务架构,提升企业级项目开发能力,适合从入门到高级应用的学习需求。
785 0
|
3月前
|
前端开发 Java 数据库连接
帮助新手快速上手的 JAVA 学习路线最详细版涵盖从入门到进阶的 JAVA 学习路线
本Java学习路线涵盖从基础语法、面向对象、异常处理到高级框架、微服务、JVM调优等内容,适合新手入门到进阶,助力掌握企业级开发技能,快速成为合格Java开发者。
573 3
|
3月前
|
监控 Java API
2025 年全新出炉的 Java 学习路线:从入门起步到实操精通的详细指南
2025年Java学习路线与实操指南,涵盖Java 21核心特性、虚拟线程、Spring Boot 3、微服务、Spring Security、容器化部署等前沿技术,助你从入门到企业级开发进阶。
843 0
|
4月前
|
NoSQL Java 关系型数据库
Java 从入门到进阶完整学习路线图规划与实战开发最佳实践指南
本文为Java开发者提供从入门到进阶的完整学习路线图,涵盖基础语法、面向对象、数据结构与算法、并发编程、JVM调优、主流框架(如Spring Boot)、数据库操作(MySQL、Redis)、微服务架构及云原生开发等内容,并结合实战案例与最佳实践,助力高效掌握Java核心技术。
446 1
|
网络协议 Java API
|
缓存 网络协议 Java

热门文章

最新文章