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 ,如需转载请自行联系原作者
相关文章
|
5天前
|
存储 监控 安全
单位网络监控软件:Java 技术驱动的高效网络监管体系构建
在数字化办公时代,构建基于Java技术的单位网络监控软件至关重要。该软件能精准监管单位网络活动,保障信息安全,提升工作效率。通过网络流量监测、访问控制及连接状态监控等模块,实现高效网络监管,确保网络稳定、安全、高效运行。
32 11
|
20天前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
38 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
9天前
|
Web App开发 网络协议 安全
网络编程懒人入门(十六):手把手教你使用网络编程抓包神器Wireshark
Wireshark是一款开源和跨平台的抓包工具。它通过调用操作系统底层的API,直接捕获网卡上的数据包,因此捕获的数据包详细、功能强大。但Wireshark本身稍显复杂,本文将以用抓包实例,手把手带你一步步用好Wireshark,并真正理解抓到的数据包的各项含义。
45 2
|
16天前
|
监控 架构师 Java
Java虚拟机调优的艺术:从入门到精通####
本文作为一篇深入浅出的技术指南,旨在为Java开发者揭示JVM调优的神秘面纱,通过剖析其背后的原理、分享实战经验与最佳实践,引领读者踏上从调优新手到高手的进阶之路。不同于传统的摘要概述,本文将以一场虚拟的对话形式,模拟一位经验丰富的架构师向初学者传授JVM调优的心法,激发学习兴趣,同时概括性地介绍文章将探讨的核心议题——性能监控、垃圾回收优化、内存管理及常见问题解决策略。 ####
|
1月前
|
网络协议 Java 物联网
Java网络编程知识点
Java网络编程知识点
43 13
|
1月前
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin
|
28天前
|
Java 程序员 数据库连接
Java中的异常处理:从入门到精通
在Java编程的海洋中,异常处理是一艘不可或缺的救生艇。它不仅保护你的代码免受错误数据的侵袭,还能确保用户体验的平稳航行。本文将带你领略异常处理的风浪,让你学会如何在Java中捕捉、处理和预防异常,从而成为一名真正的Java航海家。
|
1月前
|
数据采集 Java API
java怎么设置代理ip:简单步骤,实现高效网络请求
本文介绍了在Java中设置代理IP的方法,包括使用系统属性设置HTTP和HTTPS代理、在URL连接中设置代理、设置身份验证代理,以及使用第三方库如Apache HttpClient进行更复杂的代理配置。这些方法有助于提高网络请求的安全性和灵活性。
|
5天前
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
42 17
|
15天前
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。
下一篇
DataWorks