Java语言程序设计基础教程(异常处理和Java网络编程)ppt.ppt_第1页
Java语言程序设计基础教程(异常处理和Java网络编程)ppt.ppt_第2页
Java语言程序设计基础教程(异常处理和Java网络编程)ppt.ppt_第3页
Java语言程序设计基础教程(异常处理和Java网络编程)ppt.ppt_第4页
Java语言程序设计基础教程(异常处理和Java网络编程)ppt.ppt_第5页
已阅读5页,还剩79页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第9章 异常处理 n了解异常处理的基础知识 n理解异常处理机制 n自定义异常类的使用 9.1异常处理基础 n异常就是在程序的运行过程中所发生的异 常事件,它中断指令的正常执行。Java中 提供了一种独特的处理异常的机制,通过 异常来处理程序设计中出现的错误。当程 序运行出现异常时,Java运行环境就用异 常类Exception的相应子类创建一个异常对 象,并等待处理,例如,读取一个不存在 的文件时,运行环境就用异常类 IOException创建一个对象。异常对象可以 调用如下方法得到或输出有关异常的信息 。 9.1.1异常示例 n【例9-1】 读取一个不存在的文件时,系统编译的时候报异常。 nimport java.io.*; nclass ExceptionDemo1 npublic static void main(String args) throws IOException nFileInputStream fis = new FileInputStream(“test.txt“); nint b; nwhile (b = fis.read() != -1) nSystem.out.print(b); n nfis.close(); n n n查看程序的编译结果: n编译结果提示:第4行会出现异常,必须 对其进行捕获或声明抛出,否则程序编译 无法通过。 9.1.2异常类的层次 n在jdk中,每个包中都定义了异常类,而所有的 异常类都直接或间接地继承于Throwable类。图 9-1为jdk中异常类的继承关系。 n异常的继承结构:基类为Throwable, Error和Exception继承Throwable, RuntimeException和IOException等继承 Exception,具体的RuntimeException继 承RuntimeException。 9.1.3异常类的分类 nJava中的异常类可分为两大类: Error和Exception。 nError动态链接失败,虚拟机 错误等,通常Java程序不应该捕 获这类异常,也不会抛弃这种异 常。 nException包括运行时异常和 非运行时异常。 1)运行时异常: n继承于RuntimeException的类都属于 运行时异常,例如算术异常(除零错 )、数组下标越界异常等等。由于这 些异常产生的位置是未知的,Java 编译器允许程序员在程序中不对它们 做出处理。 2)非运行时异常: n除了运行时异常之外的其他由Exception 继承来的异常类都是非运行时的异常,例 如FileNotFoundException(文件未找到 异常)。Java编译器要求在程序中必须处 理这种异常,捕获异常或者声明抛弃异常 。 1Error体系类型异常的特 点 nError类体系描述了Java运行系统中的内 部错误以及资源耗尽的情形。应用程序不 应该抛出这种类型的对象(一般是由虚拟 机抛出)。如果出现这种错误,除了尽力 使程序安全退出外,在其他方面是无能为 力的。所以,在进行程序设计时,应该更 关注Exception体系。 2Exception体系类型异常的 特点 nException体系包括RuntimeException体系和其他非 RuntimeException的体系 n(1)RuntimeException nRuntimeException体系包括错误的类型转换、数组越界访问和试图 访问空指针等等。处理RuntimeException的原则是:如果出现 RuntimeException,那么一定是程序员的错误。例如,可以通过检 查数组下标和数组边界来避免数组越界访问异常。 n(2)其他(IOException等等) n这类异常一般是外部错误,例如试图从文件尾后读取数据等,这并 不是程序本身的错误,而是在应用环境中出现的外部错误。 9.2异常的处理 nJava语言中有两种异常处理机制:捕获异常和声明抛弃异常。 n(1)捕获异常: n当Java运行环境得到一个异常对象时,它将会沿着方法的调用栈逐 层回溯,寻找处理这一异常的代码。找到能够处理这种类型的异常 的方法后,运行环境把当前异常对象交给这个方法进行处理,这一 过程称为捕获(catch)异常。这是积极的异常处理机制。如果 Java运行环境找不到可以捕获异常的方法,则运行环境将终止,相 应的Java程序也将退出。 n(2)声明抛弃异常: n如果一个方法并不知道如何处理所出现的异常,则可在方法声明时 ,声明抛弃(throws)异常。这是一种消极的异常处理机制。 9.2.1捕获异常 n捕获异常是通过try-catch-finally语句实现的。 ntry n ncatch( ExceptionName1 e ) n ncatch( ExceptionName2 e ) n n n nfinally n n n try n捕获异常的第一步是用try选定捕获异常的范 围,由try所限定的代码块中的语句在执行过程 中可能会生成异常对象并抛弃。 n catch n每个try代码块可以伴随一个或多个catch语句, 用于处理try代码块中所生成的异常事件。catch 语句只需要一个形式参数指明它所能够捕获的 异常类型,这个类必须是Throwable的子类,运 行时系统通过参数值把被抛弃的异常对象传递 给catch块。 n在catch块中是对异常对象进行处理的代码,与访问其它对象一样,可以访 问一个异常对象的变量或调用它的方法。getMessage( )是类Throwable所 提供的方法,用来得到有关异常事件的信息,类Throwable还提供了方法 printStackTrace( )用来跟踪异常事件发生时执行堆栈的内容。例如: ntry n ncatch( FileNotFoundException e ) n System.out.println( e ); n System.out.println( “message: “+e.getMessage() ); n e.printStackTrace( System.out ); ncatch( IOException e ) n System.out.println( e ); n ncatch 语句的顺序: n捕获异常的顺序和catch语句的顺序有关 ,当捕获到一个异常时,剩下的catch语 句就不再进行匹配。因此,在安排catch 语句的顺序时,首先应该捕获最特殊的异 常,然后再逐渐一般化。也就是一般先安 排子类,再安排父类。 n finally n捕获异常的最后一步是通过finally语 句为异常处理提供一个统一的出口, 使得在控制流转到程序的其它部分以 前,能够对程序的状态作统一的管理 。不论在try代码块中是否发生了异常 事件,finally块中的语句都会被执行 。 9.2.2声明抛弃异常 n1声明抛弃异常 n如果在一个方法中生成了一个异常, 但是这一方法并不确切地知道该如何 对这一异常事件进行处理,这时,一 个方法就应该声明抛弃异常,使得异 常对象可以从调用栈向后传播,直到 有合适的方法捕获它为止。 n2抛出异常 n抛出异常就是产生异常对象的过程,首先 要生成异常对象,异常或者由虚拟机生成 ,或者由某些类的实例生成,也可以在程 序中生成。在方法中,抛出异常对象是通 过throw语句实现的。 9.3自定义异常类 n当Java内置的异常都不能明确的说明异常 情况的时候,开发人员往往需要定义一些 异常类用于描述自身程序中的异常信息, 以区分其他程序的异常信息。需要注意的 是,唯一有用的就是类型名这个信息,所 以不要在异常类的设计上花费精力。 实现自定义异常类的方法如 下: n类java.lang.Throwable是所有异常类的基类,它包括两 个子类:Exception和Error,Exception类用于描述程序 能够捕获的异常,如ClassNotFoundException。Error 类用于指示合理的应用程序不应该试图捕获的严重问题 ,如虚拟机错误VirtualMachineError n自定义异常类必须是Throwable的直接或间接子类。自 定义异常类可以继承Throwable类或者Exception,而不 要继承Error类。自定义异常类之间也可以有继承关系 n需要为自定义异常类设计构造方法,以方便构造自定义 异常对象。 n注意:一个方法所声明抛弃的异常是 作为这个方法与外界交互的一部分而 存在的。所以,方法的调用者必须了 解这些异常,并确定如何正确的处理 他们。 9.3.1继承Exception类 n【例9-3】继承Exception类。 npublic class MyFirstException extends Exception npublic MyFirstException() nsuper(); n npublic MyFirstException(String msg) nsuper(msg); n npublic MyFirstException(String msg, Throwable cause) nsuper(msg, cause); n npublic MyFirstException(Throwable cause) nsuper(cause); n n n/自定义异常类的主要作用是区分异 常发生的位置,当用户遇到异常时, 根据异常名就可以知道哪里有异常, 根据异常提示信息进行修改。 9.3.2继承Throwable 类 n【例9-4】继承Throwable 类。 npublic class MySecondException extends Throwable npublic MySecondException() nsuper(); n npublic MySecondException(String msg) nsuper(msg); n npublic MySecondException(String msg, Throwable cause) nsuper(msg, cause); n npublic MySecondException(Throwable cause) nsuper(cause); n n 9.3.3自定义异常类的使用 n【例9-5】自定义异常类的使用。 npublic class TestMyException npublic static void firstException() throws MyFirstException nthrow new MyFirstException( n“firstException() method occurs an exception!“); n npublic static void secondException() throws MySecondException nthrow new MySecondException( n“secondException() method occurs an exception!“); n npublic static void main(String args) ntry nTestMyException.firstException(); nTestMyException.secondException(); n catch (MyFirstException e1) nSystem.out.println(“Exception: “ + e1.getMessage(); ne1.printStackTrace(); n catch (MySecondException e2) nSystem.out.println(“Exception: “ + e2.getMessage(); ne2.printStackTrace(); n n n 程序运行的结果如下所示: n当一个try块后面跟着多个catch块时,如果发生 的异常匹配第一个catch块的参数,便将异常处 理权利交给第一个catch块。如果发生的异常与 第一个catch块不匹配,便看是否与第二个catch 块匹配,依次下去,如果到最后依然无法匹配 该异常,便需要在方法声明中添加一条throw语 句,将该异常抛出。 9.4 练习思考题 n1、 为了捕获一个异常,代码必须放在下面( )语句块中。 A、try块 B、catch块 C、throws块 D、finally块 n2、 下列常见的系统定义的异常中,有可能是网络原因导致的异常 是( )。 A、ClassNotFoundExceptionB、IOException C、FileNotFoundExceptionD、 UnknownHostException n3、 在代码中,使用catch(Exception e)的好处是 ( ) A、只会捕获个别类型的异常 B、捕获try块中产生的所有类型的异常 C、忽略一些异常 D、执行一些程序 第10章 Java网络编程 n10.1 网络编程基础知识 n10.2 URL及应用示例 n10.3 InetAdress类 n10.4 基于套接字的低层次Java网络编程 n10.5 UDP数据报 10.1网络编程基础知识 n网络编程的目的就是指直接或间接地通过网络协 议与其他计算机进行通讯。网络编程中有两个主 要的问题,一个是如何准确的定位网络上一台或 多台主机,另一个就是找到主机后如何可靠高效 的进行数据传输。在TCP/IP协议中IP层主要负责 网络主机的定位,数据传输的路由,由IP地址可 以唯一地确定Internet上的一台主机。而TCP层则 提供面向应用的可靠的或非可靠的数据传输机制 ,这是网络编程的主要对象,一般不需要关心IP 层是如何处理数据的。 10.1.1网络基础知识 n目前较为流行的网络编程模型是客户 机/服务器(C/S)结构。即通信双方 一方作为服务器等待客户提出请求并 予以响应。客户则在需要服务时向服 务器提出申请。服务器一般作为守护 进程始终运行,监听网络端口,一旦 有客户请求,就会启动一个服务进程 来响应该客户,同时自己继续监听服 务端口,使后来的客户也能及时得到 服务。 10.1.2网络基本概念 nIP地址:标识计算机等网络设备的网 络地址,由四个8位的二进制数组成 ,中间以小数点分隔。如: n 和 0 n主机名(hostname):网络地址的 助记名,按照域名进行分级管理。如 : n端口号(port number):网络通信时同 一机器上的不同进程的标识。如80、21、 23、25,其中11024为系统保留的端口 号 n服务类型(service):网络的各种服务。 nhttp, telnet, ftp, smtp n在Internet上IP地址和主机名是一一对应 的,通过域名解析可以由主机名得到机器 的IP,由于机器名更接近自然语言,容易 记忆,所以使用比IP地址广泛,但是对机 器而言只有IP地址才是有效的标识符。 10.1.3传输协议:TCP、UDP n尽管TCP/IP协议的名称中只有TCP这个协议名, 但是在TCP/IP的传输层同时存在TCP和UDP两个 协议。 nTCP是Tranfer Control Protocol的简称,是一种面 向连接的保证可靠传输的协议。通过TCP协议传 输,得到的是一个顺序的无差错的数据流。发送 方和接收方的成对的两个socket之间必须建立连 接,以便在TCP协议的基础上进行通信,当一个 socket(通常都是server socket)等待建立连接 时,另一个socket可以要求进行连接,一旦这两 个socket连接起来,它们就可以进行双向数据传 输,双方都可以进行发送或接收操作。 nUDP是User Datagram Protocol的简称,是 一种无连接的协议,每个数据报都是一个独 立的信息,包括完整的源地址或目的地址, 它在网络上以任何可能的路径传往目的地, 因此能否到达目的地,到达目的地的时间以 及内容的正确性都是不能被保证的。 两种协议简单比较 n使用UDP时,每个数据报中都给出了完整的地址信息,因 此无需要建立发送方和接收方的连接。对于TCP协议,由 于它是一个面向连接的协议,在socket之间进行数据传输 之前必然要建立连接,所以在TCP中多了一个连接建立的 时间。 n使用UDP传输数据时是有大小限制的,每个被传输的数据 报必须限定在64KB之内。而TCP没有这方面的限制,一 旦连接建立起来,双方的socket就可以按统一的格式传输 大量的数据。UDP是一个不可靠的协议,发送方所发送的 数据报并不一定以相同的次序到达接收方。而TCP是一个 可靠的协议,它确保接收方完全正确地获取发送方所发送 的全部数据。 n总之,TCP在网络通信上有极强的生命力,例如远程连接 (Telnet)和文件传输(FTP)都需要不定长度的数据被 可靠地传输。相比之下UDP操作简单,而且仅需要较少的 监护,因此通常用于局域网高可靠性的分散系统中 client/server应用程序。 10.2 URL及应用示例 nJava程序可以获取网络上结点的图象、声 音、HTML文档及文本等资源,并可以对获 得的资源进行处理。例如Java程序可以每 隔一定时间读取某结点提供的最新数据,并 以图表的形式显示出来。 n在编程处理上,一般先生成一个URL类型的 对象,然后用Java中相应的方法(method )获取该对象所代表的资源。 10.2.1统一资源定位器URL nURL(Uniform Resource Locator)是一致资源 定位器的简称,它表示Internet上某一资源的地 址。通过URL我们可以访问Internet上的各种网 络资源,比如最常见的WWW,FTP站点。浏览 器通过解析给定的URL可以在网络上查找相应 的文件或其他资源。 nURL是最为直观的一种网络定位方法。使用 URL符合人们的语言习惯,容易记忆,所以应 用十分广泛。而且在目前使用最为广泛的 TCP/IP中对于URL中主机名的解析也是协议的 一个标准,即所谓的域名解析服务。使用URL 进行网络编程,不需要对协议本身有太多的了 解,功能也比较弱,相对而言是比较简单的, 所以在这里我们先介绍在Java中如何使用URL 进行网络编程来引导读者入门。 10.2.2 URL的组成 nURL的一般格式为(带方括号的为可选项): nprotocol:/ hostname:port / path / ;parameters?query#fragment n协议名(protocol)指明获取资源所使用的传输协 议,如http、ftp、gopher、file等,资源名( resourceName)则应该是资源的完整地址,包括 主机名、端口号、文件名或文件内部的一个引用 。例如: n:80/WebApplication1/W ebForm1.aspx?name=tomparameters(参数):这是用于指定特殊参 数的可选项。 n6、?query(查询):可选,用于给动态网页(如 使用CGI、ISAPI、PHP/JSP/ASP/ASP.NET等 技术制作的网页)传递参数,可有多个参数, 用“ n通过一个表示URL地址的字符串,构造一 个URL对象。 nURL urlBase=new URL(“http:/www. 263.net/“) n2) public URL(URL context, String spec); n通过基准URL和文件名或路径相对URL,构造一 个URL对象。 nURL net263=new URL (“/“); nURL index263=new URL(net263, “index.html“) n3) public URL(String protocol, String host, String file); n通过协议,主机名,文件名或路径,构造一个 URL对象。 nnew URL(“http“, ““, “/pages/G. html“); n4) public URL(String protocol, String host, int port, String file); n通过协议,主机名,端口号,文件名或路径 ,构造一个URL对象。 nURL gamelan=new URL(“http“, ““, 80, n“Pages/Gwork.html“); n注意:类URL的构造方法都声明抛弃非运行时例 外(MalformedURLException),因此生成URL 对象时,我们必须要对这一例外进行处理,通常 是用try-catch语句进行捕获。格式如下: ntry n URL myURL= new URL() ncatch (MalformedURLException e) n n/exception handler code here n n 10.2.4解析一个URL n一个URL对象生成后,其属性是不能被改 变的,但是我们可以通过类URL所提供的 方法来获取这些属性: npublic String getProtocol() 获取该URL的 协议名。 npublic String getHost() 获取该URL的主机 名。 npublic int getPort() 获取该URL的端口号 ,如果没有设置端口,返回-1。 npublic String getFile() 获取该URL的文件 名。 npublic String getRef() 获取该URL在文件中的相对 位置。 npublic String getQuery() 获取该URL的查询信息 。 npublic String getPath() 获取该URL的路径 npublic String getAuthority() 获取该URL的权限信 息 npublic String getUserInfo() 获得使用者的信息 npublic String getRef() 获得该URL的锚 【例10-1】生成一个URL对象,并获取它 的各个属性。 nimport .*; npublic class ParseURL npublic static void main(String args) throws Exception nURL Aurl = new URL(“:80/docs/books/“); nURL tuto = new URL(Aurl, “ro.html#DOWNLOADING“); nSystem.out.println(“protocol=“ + tuto.getProtocol(); nSystem.out.println(“host =“ + tuto.getHost(); nSystem.out.println(“filename=“ + tuto.getFile(); nSystem.out.println(“port=“ + tuto.getPort(); nSystem.out.println(“ref=“ + tuto.getRef(); nSystem.out.println(“query=“ + tuto.getQuery(); nSystem.out.println(“path=“ + tuto.getPath(); nSystem.out.println(“UserInfo=“ + tuto.getUserInfo(); nSystem.out.println(“Authority=“ + tuto.getAuthority(); n n 程序的执行结果如下所示: 10.2.5从URL读取WWW网络 资源 n当我们得到一个URL对象后,就可以通过 它读取指定的WWW资源。这时我们将使 用URL的方法openStream(),其定义为: nInputStream openStream(); n方法openSteam()与指定的URL建立连接 并返回InputStream类的对象,以便从这 一连接中读取数据。 【例10-2】读取网络URL资 源。 nimport java.io.BufferedReader; nimport java.io.InputStreamReader; nimport .URL; npublic class URLReader npublic static void main(String args) throws Exception n/ 声明抛出所有例外 nURL tirc = new URL(“/ /“); n/ 构建一URL对象 nBufferedReader in = new BufferedReader(new InputStreamReader(tirc n.openStream(); n/ 使用openStream得到一输入流并由此 构造一个BufferedReader对象 nString inputLine; nwhile (inputLine = in.readLine() != null) n/ 从输入流不断的读数据,直到读 完为止 nSystem.out.println(inputLine); / 把读入的数据打印到屏幕上 nin.close(); / 关闭输入流 n n n程序执行后,会根据指定的URL地址 /生成一个URL对 象,然后调用此URL对象的openStream() 方法获取URL资源,生成in输入流,在 while循环中读取输入流,调用System.out 的println()方法,把读入的数据流打印到 屏幕上。在这个例子中,就是把URL资源 对应的页面文件源代码输出到屏幕上。 10.2.6通过URLConnetction连接 WWW n通过URL的方法openStream(),我们只能 从网络上读取数据,如果我们同时还想输 出数据,例如向服务器端的CGI程序发送 一些数据,我们必须先与URL建立连接, 然后才能对其进行读写,这时就要用到类 URLConnection了。 n类URLConnection也在包中定义 ,它表示Java程序和URL在网络上的通信 连接。当与一个URL建立连接时,首先要 在一个URL对象上通过方法 openConnection()生成对应的 URLConnection对象。 n下面的例子程序中首先生成一个指向地址 / 的对象,然后用 openConnection()打开该URL对象上的一 个连接,返回一个URLConnection对象。 如果连接过程失败,将产生IOException 。 n【例10-4】 nimport java.io.IOException; nimport .MalformedURLException; nimport .URL; nimport .URLConnection; npublic class ep10_4 npublic static void main(String args) ntry nURL netchinaren = new URL(“/index.shtml“); nURLConnection tc = netchinaren.openConnection(); n catch (MalformedURLException e) /创建URL()对象失败 n/ n catch (IOException e) /openConnection()失败 n/ n n n n类URLConnection提供了很多方法来设置 或获取连接参数,程序设计时最常使用的 是getInputStream()和getOurputStream(), 其定义为: nInputSteram getInputSteram(); nOutputSteram getOutputStream(); n通过返回的输入/输出流我们可以与远程对 象进行通信。 10.3 InetAdress类 n我们已经学习过Internet上的主机有两种方式表 示地址: n域名: nIP地址:00 包中的InetAddress类对象含有一个 Internet主机的域名和IP地址如: /10 n域名比较容易记忆,当我们在连接网络输入一 个主机的域名后,域名服务器(DNS)负责将 域名转换成IP地址,这样我们就和主机建立了 连接。 1获取Internet主机的地址 n我们可以使用InetAddress类的静态方法 getByname(String s)将一个域名或者一个 IP地址传递给该方法的参数s,获得一个 InetAdress的对象该对象就会包含如下信 息: /0, n另外 InetAddress类中含有两个实例方法 : npublic String getHostName()获取域名 npublic String getHostAddress()获得IP地 址 2获取本地主机地址 n使用InetAddress类的静态方法, getLocalHost()获得的对象中包含我们本 机的域名和IP地址。 10.4基于套接字的低层次Java网 络编程 n网络上的两个程序通过一个双向的通讯连 接实现数据的交换,这个双向链路的一端 称为一个Socket。Socket通常用来实现客 户方和服务方的连接。Socket是TCP/IP协 议的一个十分流行的编程界面,一个 Socket由一个IP地址和一个端口号唯一确 定。 10.4.1 Socket通讯 n在传统的UNIX环境下可以操作TCP/IP协议的接 口不止Socket一个,Socket所支持的协议种类 也不光TCP/IP一种,因此两者之间是没有必然 联系的。在Java环境下,Socket编程主要是指 基于TCP/IP协议的网络编程。 n说Socket编程是低层次网络编程并不等于它功 能不强大,恰恰相反,正因为层次低,Socket 编程比基于URL的网络编程提供了更强大的功 能和更灵活的控制,但是却要更复杂一些。由 于Java本身的特殊性,Socket编程在Java中可 能已经是层次最低的网络编程接口,在Java中 要直接操作协议中更低的层次,需要使用Java 的本地方法调用(JNI),在这里就不予讨论了 。 10.4.2 Socket通讯的一般过 程 n前面已经提到Socket通常用来实现C/S结 构。 n使用Socket进行Client/Server程序设计的 一般连接过程是这样的:Server端Listen( 监听)某个端口是否有连接请求,Client端 向Server端发出Connect(连接)请求, Server端向Client端发回Accept(接受) 消息。一个连接就建立起来了。Server端 和Client端都可以通过Send,Write等方法 与对方通信。 n工作过程包含以下四个基本的步骤: n(1) 创建Socket; n(2) 打开连接到Socket的输入/出流; n(3) 按照一定的协议对Socket进行读/写操作 ; n(4) 关闭Socket. n第三步是程序员用来调用Socket和实现程序功 能的关键步骤,其他三步在各种程序中基本相 同。 n以上4个步骤是针对TCP传输而言的,使用UDP 进行传输时略有不同,在后面会有具体讲解。 10.4.3创建Socket njava在包中提供了两个类Socket 和ServerSocket,分别用来表示双向连接 的客户端和服务端。这是两个封装得非常 好的类,使用很方便。其构造方法如下: nSocket(InetAddress address, int port); nSocket(InetAddress address, int port, boolean stream); nSocket(String host, int prot); nSocket(String host, int prot, boolean stream); nSocket(SocketImpl impl) nSocket(String host, int port, InetAddress localAddr, int localPort) nSocket(InetAddress address, int port, InetAddress localAddr, int localPort) nServerSocket(int port); nServerSocket(int port, int backlog); nServerSocket(int port, int backlog, InetAddress bindAddr) n其中address、host和port分别是双向连接中另一方的IP 地址、主机名和端口号,stream指明socket是流socket 还是数据报socket,localPort表示本地主机的端口号, localAddr和bindAddr是本地机器的地址(ServerSocket 的主机地址),impl是socket的父类,既可以用来创建 serverSocket又可以用来创建Socket。count则表示服务 端所能支持的最大连接数。 n例如: nSocket client = new Socket(“127.0.01.“, 80); nServerSocket server = new ServerSocket(80); n注意,在选择端口时,必须小心。每一个端口 提供一种特定的服务,只有给出正确的端口, 才能获得相应的服务。01023的端口号为系统 所保留,例如http服务的端口号为80,telnet服 务的端口号为21,ftp服务的端口号为23, 所以 我们在选择端口号时,最好选择一个大于1023 的数以防止发生冲突。 n在创建socket时如果发生错误,将产生 IOException,在程序中必须对之作出处理。所 以在创建Socket或ServerSocket是必须捕获或 抛出例外。 10.4.4客户端的Socket n【例10-6】 一个典型的创建客户端Socket的过程。 nimport java.io.IOException; nimport .Socket; npublic class ep10_6 npublic static void main(String args) ntry nSocket socket = new Socket(““, 4700); n/ 是TCP/IP协议中默认的本机地址 n catch (IOException e) nSystem.out.println(“Error:“ + e); n n n n这是最简单的在客户端创建一个Socket的一个小程序段,也是使用Socket 进行网络通讯的第一步,程序相当简单,在这里不作过多解释了。在后面 的程序中会用到该小程序段。 10.4.5服务器端的 ServerSocket n【例10-7】一个典型的创建Server端ServerSocket的过程。 nimport java.io.IOException; nimport .ServerSocket; nimport .Socket; npublic class ep10_7 npublic static void main(String args) nServerSocket server = null; ntry nserver = new ServerSocket(4700); n/创建一个ServerSocket在端口4700监听客户请求 n catch (IOException e) nSystem.out.println(“can not listen to :“ + e); n nSocket socket = null; ntry nsocket = server.accept(); n/accept()是一个阻塞的方法,一旦有客户请求,它就会返回一个Socket对象用 于同客户进行交互 n catch (IOException e) nSystem.out.println(“Error:“ + e); n n n n以上的程序是Server的典型工作模式,只不过 在这里Server只能接收一个请求,接受完后 Server就退出了。实际的应用中总是让它不停 的循环接收,一旦有客户请求,Server总是会 创建一个服务线程来服务新来的客户,而自己 继续监听。程序中accept()是一个阻塞函数,所 谓阻塞性方法就是说该方法被调用后,将等待 客户的请求,直到有一个客户启动并请求连接 到相同的端口,然后accept()返回一个对应于客 户的socket。这时,客户方和服务方都建立了用 于通信的socket,接下来就是由各个socket分别 打开各自的输入/输出流。 10.4.6打开输入/出流 n类Socket提供了方法getInputStream ()和 getOutStream()来得到对应的输入/输出流 以进行读/写操作,这两个方法分别返回 InputStream和OutputSteam类对象。为 了便于读/写数据,我们可以在返回的输入 /输出流对象上建立过滤流,如 DataInputStream、DataOutputStream或 PrintStream类对象,对于文本方式流对象 ,可以采用InputStreamReader和 OutputStreamWriter、PrintWirter等处理 。 10.4.7关闭Socket n每一个Socket存在时,都将占用一定的资源,在Socket 对象使用完毕时,要其关闭。关闭Socket可以调用 Socket的Close()方法。在关闭Socket之前,应将与 Socket相关的所有的输入/输出流全部关闭,以释放所有 的资源。而且要注意关闭的顺序,与Socket相关的所有 的输入/输出该首先关闭,然后再关闭Socket。 nos.close(); nis.close(); nsocket.close(); n尽管Java有自动回收机制,网络资源最终是会被释放的 。但是为了有效的利用资源,建议读者按照合理的顺序 主动释放资源。 10.4.8简单的Client/Server程 序设计 n下面我们给出一个用Socket实现的客户和 服务器交互的典型的C/S结构的演示程序 ,读者通过仔细阅读该程序,会对前面所 讨论的各个概念有更深刻的认识。程序的 意义请参考注释。 10.4.9支持多客户的client/server 程序设计 n前面提供的Client/Server程序只能实现Server和 一个客户的对话。在实际应用中,往往是在服 务器上运行一个永久的程序,它可以接收来自 其他多个客户端的请求,提供相应的服务。为 了实现在服务器方给多个客户提供服务的功能 ,需要对上面的程序进行改造,利用多线程实 现多客户机制。服务器总是在指定的端口上监 听是否有客户请求,一旦监听到客户请求,服 务器就会启动一个专门的服务线程来响应该客 户的请求,而服务器本身在启动完线程之后马 上又进入监听状态,等待下一个客户的到来。 n客户端的程序和上面程序是完全一样的,读者 如果仔细阅读过上面的程序,可以跳过不读, 把主要精力集中在Server端的程序上。 10.5 UDP数据

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论