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

简介:
 在客户端和服务端的数据交互完成后,一般需要关闭网络连接。对于服务端来说,需要关闭 Socket ServerSocket
在关闭Socket 后,客户端并不会马上感知自已的Socket 已经关闭,也就是说,在服务端的Socket 关闭后,客户端的Socket isClosed isConnected 方法仍然会分别得到false true 。但对已关闭的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 类的isClosed isBound 方法判断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 方法类似。





 本文转自 androidguy 51CTO博客,原文链接: http://blog.51cto.com/androidguy/214352 ,如需转载请自行联系原作者
目录
打赏
0
0
0
0
348
分享
相关文章
RT-DETR改进策略【Neck】| BiFPN:双向特征金字塔网络-跨尺度连接和加权特征融合
RT-DETR改进策略【Neck】| BiFPN:双向特征金字塔网络-跨尺度连接和加权特征融合
113 9
RT-DETR改进策略【Neck】| BiFPN:双向特征金字塔网络-跨尺度连接和加权特征融合
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
206 96
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
73 23
当虚拟机出现网络连接问题时,应该先检查Hyper-V的网卡连接配置
当虚拟机出现网络连接问题时,应首先检查Hyper-V的网卡配置。具体步骤包括:确认虚拟机运行状态、检查虚拟交换机类型和物理网卡连接、确保虚拟机网络适配器正确连接到虚拟交换机,并验证网络配置(IP地址等)。常见问题如虚拟交换机配置错误、网络适配器未连接或防火墙阻止连接,可通过重新配置或调整设置解决。必要时重启虚拟机和宿主机,查看事件日志或联系技术支持以进一步排查问题。
RT-DETR改进策略【Neck】| GFPN 超越BiFPN 通过跳层连接和跨尺度连接改进RT-DETR颈部网络
RT-DETR改进策略【Neck】| GFPN 超越BiFPN 通过跳层连接和跨尺度连接改进RT-DETR颈部网络
66 12
RT-DETR改进策略【Neck】| GFPN 超越BiFPN 通过跳层连接和跨尺度连接改进RT-DETR颈部网络
【03】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架搭建-服务端-后台管理-整体搭建-优雅草卓伊凡商业项目实战
【03】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架搭建-服务端-后台管理-整体搭建-优雅草卓伊凡商业项目实战
154 13
【03】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架搭建-服务端-后台管理-整体搭建-优雅草卓伊凡商业项目实战
YOLOv11改进策略【Neck】| GFPN 超越BiFPN 通过跳层连接和跨尺度连接改进v11颈部网络
YOLOv11改进策略【Neck】| GFPN 超越BiFPN 通过跳层连接和跨尺度连接改进v11颈部网络
206 10
YOLOv11改进策略【Neck】| GFPN 超越BiFPN 通过跳层连接和跨尺度连接改进v11颈部网络
YOLOv11改进策略【Neck】| BiFPN:双向特征金字塔网络-跨尺度连接和加权特征融合
YOLOv11改进策略【Neck】| BiFPN:双向特征金字塔网络-跨尺度连接和加权特征融合
283 7
YOLOv11改进策略【Neck】| BiFPN:双向特征金字塔网络-跨尺度连接和加权特征融合
云栖大会 | Terraform从入门到实践:快速构建你的第一张业务网络
云栖大会 | Terraform从入门到实践:快速构建你的第一张业务网络
Java网络编程封装
Java网络编程封装原理旨在隐藏底层通信细节,提供简洁、安全的高层接口。通过简化开发、提高安全性和增强可维护性,封装使开发者能更高效地进行网络应用开发。常见的封装层次包括套接字层(如Socket和ServerSocket类),以及更高层次的HTTP请求封装(如RestTemplate)。示例代码展示了如何使用RestTemplate简化HTTP请求的发送与处理,确保代码清晰易维护。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等