`
seara
  • 浏览: 669767 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

阅读更多
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="ProgId" content="Word.Document"> <meta name="Generator" content="Microsoft Word 11"> <meta name="Originator" content="Microsoft Word 11"> <link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C02%5Cclip_filelist.xml"> <!--[if gte mso 9]><xml> Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 </xml><![endif]--><!--[if gte mso 9]><![endif]--><style> <!-- /* Font Definitions */ &#64;font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1;} &#64;font-face {font-family:""&#64;宋体"; panose-1:2 1 6 0 3 1 1 1 1 1;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; font-family:"Times New Roman";} /* Page Definitions */ &#64;page {} &#64;page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt;} div.Section1 {page:Section1;} --> </style> <!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable { mso-style-parent:""; font-size:10.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} </style> <![endif]-->

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

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

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

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

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

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package server;

importjava.net.*;

classClient
{
publicstaticvoidmain(String[]args)throwsException
{
Socketsocket
=newSocket("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());
}
}
publicclassCloseSocket
{
publicstaticvoidmain(String[]args)throwsException
{
ServerSocketserverSocket
=newServerSocket(1234);
while(true)
{
Socketsocket
=serverSocket.accept();
socket.close();

}
}
}

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="ProgId" content="Word.Document"><meta name="Generator" content="Microsoft Word 11"><meta name="Originator" content="Microsoft Word 11"><link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"><!--[if gte mso 9]><xml> Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 </xml><![endif]--><!--[if gte mso 9]><![endif]--><style> <!-- /* Font Definitions */ &#64;font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0;} &#64;font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1;} &#64;font-face {font-family:""&#64;宋体"; panose-1:2 1 6 0 3 1 1 1 1 1;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; font-family:"Times New Roman";} /* Page Definitions */ &#64;page {} &#64;page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt;} div.Section1 {page:Section1;} /* List Definitions */ &#64;list l0 {} &#64;list l0:level1 { margin-left:21.0pt; text-indent:-21.0pt; font-family:Wingdings;} ol {margin-bottom:0cm;} ul {margin-bottom:0cm;} --> </style><!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable { mso-style-parent:""; font-size:10.0pt; font-family:"Times New Roman";} </style> <![endif]-->

测试
执行下面的命令

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->javaserver.CloseSocket
javaserver.Client

运行结果

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->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后,客户端就会抛出连接异常:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->Exceptioninthread"main"java.net.SocketException:Connectionreset
atjava.net.SocketInputStream.read(SocketInputStream.java:
168)
atjava.net.SocketInputStream.read(SocketInputStream.java:
182)
atchapter5.Client.main(CloseSocket.java:
12)

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="ProgId" content="Word.Document"><meta name="Generator" content="Microsoft Word 11"><meta name="Originator" content="Microsoft Word 11"><link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"><!--[if gte mso 9]><xml> Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 </xml><![endif]--><!--[if gte mso 9]><![endif]--><style> <!-- /* Font Definitions */ &#64;font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1;} &#64;font-face {font-family:""&#64;宋体"; panose-1:2 1 6 0 3 1 1 1 1 1;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; font-family:"Times New Roman";} /* Page Definitions */ &#64;page {} &#64;page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt;} div.Section1 {page:Section1;} --> </style><!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable { mso-style-parent:""; font-size:10.0pt; font-family:"Times New Roman";} </style> <![endif]-->

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

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->ServerSocketserverSocket=newServerSocket(1234);
if(serverSocket.isBound()==true&&serverSocket.isClosed()==false)
System.out.println(
"serverSocket处于活动状态!");
else
System.out.println(
"serverSocket处于非活动状态!");

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="ProgId" content="Word.Document"><meta name="Generator" content="Microsoft Word 11"><meta name="Originator" content="Microsoft Word 11"><link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"><!--[if gte mso 9]><xml> Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 </xml><![endif]--><!--[if gte mso 9]><![endif]--><style> <!-- /* Font Definitions */ &#64;font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1;} &#64;font-face {font-family:""&#64;宋体"; panose-1:2 1 6 0 3 1 1 1 1 1;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; font-family:"Times New Roman";} /* Page Definitions */ &#64;page {} &#64;page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt;} div.Section1 {page:Section1;} --> </style><!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable { mso-style-parent:""; font-size:10.0pt; font-family:"Times New Roman";} </style> <![endif]-->

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

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




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

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

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

分享到:
评论

相关推荐

    Java网络编程从入门到精通

    本教程"Java网络编程从入门到精通"旨在帮助初学者和有经验的开发者深入理解这一领域,从基础知识到高级主题,提供了一套全面的学习资源。 在Java中,网络编程主要涉及以下核心知识点: 1. **Socket编程**:Java的...

    JAVA网络编程从入门到精通

    ### JAVA网络编程从入门到精通知识点详解 #### 一、Internet地址概述 互联网中的每一台设备都需要有一个唯一的标识符——IP地址。当前广泛使用的IPv4地址由四个字节组成,而未来的趋势是采用16个字节的IPv6地址。 ...

    Java从入门到精通(第四版)官方程序实例

    《Java从入门到精通(第四版)》是一本旨在帮助初学者和有一定基础的程序员深入理解Java编程语言的书籍。本书以丰富的实例为引导,旨在让读者通过实践掌握Java的各项核心概念和技术。配套的源代码提供了大量实例,...

    java从入门到精通

    《Java从入门到精通》是一本全面覆盖Java编程语言的学习指南,由知名讲师韩顺平编著。本书旨在帮助初学者快速掌握Java编程基础,并逐步深入到高级特性,实现从零基础到熟练应用的转变。标签“java”、“入门”和...

    Java从入门到精通课后答案

    Java编程语言是软件开发领域中最常用的语言之一,尤其在企业级应用、服务器端开发以及大数据处理等方面占据着重要地位。"Java从入门到精通课后答案"是一个专门为初学者设计的学习资源,旨在帮助那些对Java感兴趣但...

    JAVA从入门到精通PPT.zip

    在Java编程领域,"入门到精通"是一个系统的学习过程,涵盖了从基础知识到高级特性的全面理解。这份"JAVA从入门到精通PPT"文档应该是为初学者设计的一套教学资料,旨在帮助他们逐步掌握这门强大的编程语言。 1. **...

    java从入门到精通全过程笔记.doc

    Java编程语言从入门到精通是一个系统的学习过程,涵盖了多种技术和概念。以下是一些核心知识点的详细解释: 1. **Java基础知识**:这是学习Java的第一步,包括了解Java的历史、环境配置(如JDK安装和环境变量设置)...

    Java学习从入门到精通 1工具篇

    ### Java学习从入门到精通之工具篇:深入解析与实践指南 #### 一、JDK (Java Development Kit) ##### 1、JDK的核心地位与重要性 JDK,即Java Development Kit,是Java开发的核心,它包含了Java运行环境(Java ...

    Java经典教程,初学者的最好的宝典,从入门到精通(下)

    本教程"Java经典教程,初学者的最好的宝典,从入门到精通(下)"是专门为那些希望掌握Java编程技能的人设计的,尤其是对Java有初步兴趣并希望深入学习的读者。下面将详细阐述Java的一些核心知识点,这些内容可能包含...

    Java学习从入门到精通.docx

    ### Java学习从入门到精通——知识点详解 #### 一、工具篇 **1. JDK (Java Development Kit)** - **定义**: JDK 是整个 Java 技术的核心,包含了 Java 运行环境(Java Runtime Environment, JRE)、一系列 Java ...

    java从零基础到精通的整个详细笔记

    这篇笔记旨在帮助初学者从零基础逐步掌握Java编程,通过一系列的讲解和实例,让你从入门到精通。 一、Java基础知识 1. Java简介:了解Java的历史背景,由Sun Microsystems(现为Oracle公司)开发,其跨平台的特性...

    老篇常谈-Java学习从入门到精通.doc

    ### Java学习从入门到精通——关键知识点解析 #### 一、工具篇 ##### 1. JDK (Java Development Kit) **概述**: - **定义**:JDK是Java开发的核心工具包,包含了Java运行环境(Java Runtime Environment, JRE)...

    《Java Web 从入门到精通》PPT讲解

    本PPT讲解《Java Web从入门到精通》,旨在为初学者提供一条清晰的学习路径,逐步深入理解并掌握这一领域的核心技术。 首先,Java Web的基础包括Java Servlet和JavaServer Pages(JSP)。Servlet是Java编写的服务端...

    netty入门到精通.txt

    根据提供的文件信息“netty入门到精通”,我们可以深入探讨Netty框架的相关知识点,包括其基本概念、核心组件、应用场景以及如何逐步掌握这项技术。 ### Netty框架简介 Netty是一款高性能、异步事件驱动的网络应用...

    Java开发资源库

    Java开发资源库是一个全面的学习平台,专为Java初学者和有经验的开发者提供从入门到精通的全方位指导。这个资源库包含了大量的实例和项目,帮助用户深入理解和实践Java编程语言的核心概念和技术。以下是对资源库中...

    Javascript-从入门到精通2.txt

    ### JavaScript:从入门到精通 #### 一、JavaScript 概述与互联网的发展 JavaScript 是一种广泛使用的编程语言,尤其在 Web 开发领域占有极其重要的地位。随着互联网技术的飞速发展,JavaScript 的重要性日益凸显...

Global site tag (gtag.js) - Google Analytics