首页 网络程序设计教学课件汇总整本书电子教案全套教学教程

网络程序设计教学课件汇总整本书电子教案全套教学教程

举报
开通vip

网络程序设计教学课件汇总整本书电子教案全套教学教程第*页第1章网络程序设计第*页主要内容选择JAVA语言网络常识网络程序设计简介网络程序设计技术Java支持的网络程序设计移动网络Java安全性常识本章小结实践检验第*页1-1选择JAVA语言互联网在世界上蓬勃发展,Sun公司发现Oak语言所具有的跨平台、面向对象、安全性高等特点非常符合互联网的需要,于是改进了该语言的设计,造就了一代成功的编程语言。第*页1-2网络常识网络体系结构协议OSI参考模型命名与路由Internet地址第*页1-2-1网络体系结构网络中的设备既可以在同一个房间内,又可以分布于整幢大楼。或者通...

网络程序设计教学课件汇总整本书电子教案全套教学教程
第*页第1章网络程序 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 第*页主要内容选择JAVA语言网络常识网络程序设计简介网络程序设计技术Java支持的网络程序设计移动网络Java安全性常识本章小结实践检验第*页1-1选择JAVA语言互联网在世界上蓬勃发展,Sun公司发现Oak语言所具有的跨平台、面向对象、安全性高等特点非常符合互联网的需要,于是改进了该语言的设计,造就了一代成功的编程语言。第*页1-2网络常识网络体系结构 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 OSI参考模型命名与路由Internet地址第*页1-2-1网络体系结构网络中的设备既可以在同一个房间内,又可以分布于整幢大楼。或者通过电话线、微波等类似设备,分布于更远的距离。通过使用一些远距离介质,网络甚至可以分布于整个世界。第*页1-2-2协议“协议”通常是指两个或更多的计算机之间,为交换信息所必须遵循的一组规则。它描述了计算机发送信息所应具有的格式,以及对收到的信息应作出何种响应。正是有了协议的存在,使得开发人员能够使用不同的程序设计语言,以不同的数据结构和命令代码,独立地开发和实现分布式应用程序的不同部分。第*页1-2-3OSI参考模型OSI协议层第*页1-2-3OSI参考模型应用层这一层负责发送数据给用户。它主要定义了一个到服务的接口。此层协议有:文件传输协议(FTP)、远程登录(Telnet)和简单邮件传输协议(SMTP)。表示层实现此层的协议负责在网络的表示层传输数据,它独立于底层的平台。如果要进行加密,将在此层完成。此层的协议有:XDR和ASN.1。会话层此层负责在两个进程间建立通信,以及进行错误恢复。需要注意的是,在无连接通信时,不需要此层。传输层在这一层,信息被编址到通信端口。此层既可以用于无连接的情况(如UDP),又可以用于面向连接的情况(TCP),这一点将在第2章进一步介绍。网络层两台计算机将在此层进行数据包的传递。这一层也负责进行路由(广域网中如此,局域网中不需路由)。此层协议有:IP和X.25。数据链路层此层负责两台计算机间包的容错传输。物理层此层包括驱动网络的线路及硬件等。第*页1-2-4命名与路由当一台主机要向/从处于同一个网络或不同网络中的另一台主机发送/接收包时就要用到IP地址。如果该主机向处于同一个网络中的主机发送包,那么只要用主机标识符来定位即可;如果该主机向处于不同网络中的另一台主机发送包,则要用主机标识符和网络标识符来定位此外部主机。这个定位网络和主机并发送包给它们的过程就叫做路由(Routing)。在网络中,一个路由器包含了一个IP层,来实现路径的选择,以及发送包到它们的目的地。当数据被路由后,它在网络的传输过程中有可能丢失,所以底层的协议应该能够保证数据起始点到目的地的正确传递。第*页1-2-5Internet地址Internet地址分为5类,分别是A、B、C、D和E。每类地址各不相同,各自适应不同大小组织的需要。例如,A类地址用于超过65、536台主机的大型网络,B类地址用于超过256台但少于65536台主机的中等规模的网络,C类地址用于最多256台主机的网络。D类地址被用于在一些Internet主机间进行多点传递,其范围为224.0.0.0~239.255.255.255。E类地址被预留,以便将来使用,其范围为240.0.0.0~247.255.255.255。第*页A类地址第*页1-3网络程序设计简介IP以两种形式存在着:DNS(域名服务)形式。此外,IP地址在内部都表达成一个由32个二进制位(bit)构成的数字,所以IP地址的每一组数字都不能超过255。第*页1-3网络程序设计简介该程序只在Windows95中进行了测试,但大家可以依次进入自己的“开始”、“设置”、“控制面板”、“网络”,然后进入“标识”选项卡。其中,“计算机名称”就是应在命令行中输入的内容。第*页1-3网络程序设计简介//:WhoAmI.java//Findsoutyournetworkaddresswhenyou're//connectedtotheInternet.packagec15;importjava.net.*;publicclassWhoAmI{publicstaticvoidmain(String[]args)throwsException{if(args.length!=1){System.err.println("Usage:WhoAmIMachineName");System.exit(1);}InetAddressa=InetAddress.getByName(args[0]);System.out.println(a);}}///:~第*页1-4网络程序设计技术SocketRPC网络程序设计特性第*页1-4-1Socket信息在一个进程的Socket和另一个进程的Socket间,以报文传输的形式进行交换。在发送端Socket,报文以队列的形式等待,直到网络协议传输它们。当报文到达后,它们又在接收端的Socket排队,等待接收进程以一定的系统调用来接收它们。在客户/服务器模式下,服务器是监听请求的进程,客户是发送请求的进程。一旦服务器进程接收到了请求,它就试图去处理该请求,并且将输出发送给客户。第*页1-4-2RPCRPC(远程过程调用)诞生于20世纪70年代,它将计算机间的通信,看作是一个计算机调用另一个计算机的过程。在RPC方式中,所有报文都通过网络传递,每一个既可能请求,也可能应答一个过程的动作。第*页基于RPC的客户/服务器计算示例第*页1-4-3网络程序设计特性多用户应用程序电子邮件(E–mail)是多用户应用程序的一个很好的例子。通过互联的单机系统,分布式计算使这样的应用程序成为可能。资源共享分布式计算使一个组织能够更好地利用物理资源。例如,办公人员可以共用一台价格昂贵的彩色打印机。可升级性由于分布式系统由许多组件构建而成,而且很有可能根据需要增加更多的组件,所以要具有可升级性。分布式系统可能要用于解决各种大小问题,所以要有随问题大小变化的能力。有效性在不同环境下,多平台能够得以应用,以解决每一个计算机的问题。容错性和实用性分布式应用程序的各组件,被配置为能够解决大多数的错误类型。透明性这个系统感觉上应为一个整体,而不是一系列独立组件的集合。这样,本地和远程对象可以使用同样的操作进行访问,而不需要知道它们的位置。第*页1-5Java支持的网络程序设计第*页1-5Java支持的网络程序设计Socket通过Socket通信,Java支持面向连接(TCP)和无连接(UDP)的协议。在本书的第一部分,将介绍任何使用Socket编写的分布式应用程序。RMI远程 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 调用(RMI)允许程序编写分布式应用程序,在这个分布式应用程序中,远程Java对象的方法可以被运行于网络中不同主机上的Java虚拟机所调用。在这种模式下,参与通信的所有分布的对象必须用Java语言实现。如果它们以其他语言实现的话,Java对象就无法与网络上的其他对象进行通信。本书第二部分将讨论RMI,以及任何使用它去开发分布式应用程序。有关RMI的更多信息,请浏览http://java.sun.com/products/jdk/rmi。JavaIDLJavaIDL让程序员能够用接口定义语言(IDL)定义远程接口(IDL是OMG组织定义的工业标准)。一旦程序员使用IDL定义了远程接口,那就可以使用特定的编译器编译该定义,以产生Java接口定义、客户桩(stub)和服务器构架(skeleton)。JavaIDL允许一个Java客户透明地调用驻留在远程服务器上的IDL对象,并且允许介绍CORBA,以及如何使用VisiBrokerforJava——一个完整的CORBA实现——开发分布式应用程序。有关JavaIDL的更多信息,请浏览http://java.sun.com/products/jdk/idl。第*页1-5Java支持的网络程序设计JavaSpacesJavaSpaces是一种尝试,它想要帮助分布式应用程序开发者,以方便简单、快速的统一机制,去共享、协调、传送网络中分布的资源、服务和对象。JavaSpaces有它自己的私有元组空间(tuplespaces),其建立于著名的Linda原型的元组空间之上。这一原型最初是为并行处理系统开发的,作为一个全球通信的缓冲。有关JavaSpaces的更多信息,请浏览http://java.sun.com/products/javaspaces。JiniJini是SunMicrosystems的一个R&D项目,它扩展了Java的能力,使Java能够支持更为广泛的网络设备。Sun设想使Jini成为一个系统,在此系统中,人们使用网络设备和服务,就像使用今天的电话一样简单。有关Jini的更多信息,请浏览http://java.sun.com/software/jini。JavaPCJavaPC是一个软件系统,它提供了一个简单而又灵活的移植路径到Java平台和网络计算。JavaPC允许公司企业在运行MS-DOS和Windows3.x的PC上配置使用Java应用程序第*页1-6移动网络当一个程序开始通过网络运行时,在网络和程序之间就产生一种新的关系。网络移动(NetworkMobile)代码确保最终用户有必要的软件查看和使用通过网络发送的数据变得容易。移动代理(MobileAgent),是网络程序设计的一种改进方法。由于网络的可靠性不是很重要,所以它们是非常有吸引力的。Java支持网络移动开始于平台独立性和安全性两方面。Java的这两项功能使网络移动步入使用阶段。平台独立性使开发一个网络应用程序更为容易,因为开发人员不再需要为不同的平台开发不同版本的程序。Java的安全性则使得用户从不可靠的资源下载文件时更为有信心。第*页1-7Java安全性常识Java的安全模式包括3层:Java语言本身。Java编译器和run-time(运行时)系统。SecurityManager类。第*页1-7Java安全性常识Java编译器和run-time系统安全层提供了必要的功能,以确保Java系统不会因无效代码而崩溃。它提供了一个简单的、由以下3个子层所组成的安全的运行环境:Java字节代码解释器和类格式校验。一个在运行时动态装载和检查库的机制。自动的垃圾回收机制。第*页1-7Java安全性常识第*页1-8本章小结在网络通信中,Java不仅提供了面向连接和无连接数据报的底层通信,而且还提供了高层服务,如E-mail和WWW服务等。通过Java提供的网络功能,可以以流的方式来进行网络数据的传输,而且不需要关注连网的细节问题。在因特网上,已经开发了许多服务,如WWW浏览、E-mail等,而Java也提供了相应的扩展组件,如对于E-mail应用,Java提供了JavaMailAPI,使用时只需要调用其提供的方法就可以完成如发送邮件的操作。Java对数据报的支持与它对TCP套接字的支持大致相同,使用DatagramSocket类来表示无连接的Socket,接收和发送数据报。接收和要发送的数据报内容保存在DatagramPacket对象中。第*页1-9实践检验理论巩固编程获取本机的IP地址。Java提供的网络功能有哪三大类?Socket是传统网络程序最常用的方式,他们是如何工作的?如何通过URL读取WWW服务器上的数据?URL和URLConnection的区别是什么?第*页1-9实践检验上机实战编程实现Java程序访问cgi程序,并传给它10个数据,cgi程序接收后,排序并传送回来。编写一个会话程序,要求:会话双方可以自由通话,看到对方发来“bye”则退出。第2章网络程序设计的编程基础第*页主要内容在没有网络的前提下测试程序端口套接字TCP/IP和UDP/IP通信客户/服务器通信Greetings服务器实例解析Internet地址第*页2-1在没有网络的前提下测试程序由于多种潜在的原因,我们可能没有一台客户机、服务器以及一个网络来测试自己做好的程序。我们也许是在一个课堂环境中进行练习,或者写出的是一个不十分可靠的网络应用。IP的设计者注意到了这个问题,并建立了一个特殊的地址——localhost——来满足非网络环境中的测试要求。在Java中产生这个地址最一般的做法是:InetAddressaddr=InetAddress.getByName(null);为得到本地主机地址,也可向其直接传递字串"localhost":InetAddress.getByName("localhost");或者使用它的保留IP地址(四点形式),就象下面这样:InetAddress.getByName("127.0.0.1");三种方法得到的结果是一样的。第*页2-2端口由IP表达的每台机器也包含了“端口”(Port)。我们设置一个客户机或者服务器的时候,必须选择一个无论客户机还是服务器都认可连接的端口。注意端口并不是机器上一个物理上存在的场所,而是一种软件抽象(主要是为了表述的方便)。系统服务保留了使用端口1到端口1024的权力,所以不应让自己设计的服务占用这些以及其他任何已知正在使用的端口。本书的第一个例子将使用端口8080(为追忆我的第一台机器使用的老式8位Intel8080芯片,那是一部使用CP/M操作系统的机子)。第*页2-3套接字套接字”(Socket)也是一种软件形式的抽象,用于表达两台机器间一个连接的“终端”。有两个基于数据流的套接字类:ServerSocket,服务器用它“侦听”进入的连接;以及Socket,客户用它初始一次连接。一旦客户(程序)申请建立一个套接字连接,ServerSocket就会返回(通过accept()方法)一个对应的服务器端套接字,以便进行直接通信。创建一个ServerSocket时,只需为其赋予一个端口编号。不必把一个IP地址分配它,因为它已经在自己代表的那台机器上了。但在创建一个Socket时,却必须同时赋予IP地址以及要连接的端口编号(另一方面,从ServerSocket.accept()返回的Socket已经包含了所有这些信息)。第*页2-4TCP/IP和UDP/IP通信对于Socket程序,你可以使用两种通信协议:数据报通信(DatagramCommunication)协议和流通信(StreamCommunication)协议。它们都被Java所支持。第*页2-4-1数据报通信协议数据报通信协议,如UDP,为无连接协议。这就意味着你可以在任何时候发送数据报,当然,你仍需要发送本地的Socket描述符及接收方的Socket地址。正如你所知道的,在每一次建立通信时,都要发送这些附加的数据。第*页2-4-2流通信协议流通信协议最广为人知的如TCP协议。与UDP不同,TCP是一个面向连接的协议。为了使用TCP协议进行通信,必须先在两个Socket之间建立连接。其中一个Socket监听连接请求(服务器),另一个发出连接请求。一旦两个Socket之间建立了连接,它们就能被用来双向(或单向)传递数据。第*页2-4-3UDP与TCPTCP用于实现不受传输数据长度限制的网络服务,如远程登录Telnet、FTP等。UDP的复杂程度较低,需要的开销也较小。它主要使用在构建于局域网之上的分布式系统中,客户/服务器应用程序的实现。一般情况下,你最好使用TCP,因为它提供了可靠的、面向连接的通信方式。如果应用程序协议句柄可靠,应用程序需要广播,或者应用程序不能忍受TCP的开销,那么可以使用UDP。本书此部分的大多数实例,都使用TCP协议。第*页2-5客户/服务器通信数据流TCPSocketUDPSocket(数据报)多点传送Socket第*页客户/服务器的Socket通信第*页2-5-1数据流当读写BufferedReader和BufferedWriter缓冲区数据时,就减少了对源数据的访问量。注意,具有缓冲的流比没有缓冲的流效率更高。FilterInputStream和FilterOutputStream由一个非缓存的InputStream和OutputStream实例构造而成。它们通过缓存和刷新提高性能。DataInputStream和DataOutputStream为读写原始数据类型提供高级服务。FileReader、FileWriter、FileInputStream和FileOutputStream一起用于从文件中读,或写到文件中。第*页2-5-2TCPSocket通过Socket类可以建立TCPSocket连接。使用Socket编写客户或服务器程序需要以下4步:打开一个Socket。创建一个数据输入流。创建一个数据输出流。关闭Socket。第*页设计Socket打开一个Socket如果你是编写客户程序,要打开Socket,应该如下做:SocketMyClient=null;try{MyClient=newSocket("host",PortNumber);}catch(UnknownHostExceptionuhe){uhe.PrintStackTrace();}catch(IOExceptione){e.printStackTrace();}如果你是编写服务器程序,要打开Socket,应该这样做:publicstaticfinallintPortNumber=4000;ServerSocketMyService=null;try{MyService=newServerSocket(PortNumber);}catch(IOExceptionioe){ioe.printStackTrace();}第*页设计Socket当你实现服务器程序时,还要从ServerSocket产生一个Socket对象,以便监听和接受来自客户的连接。SocketserviceSocket=null;try{serviceSocket=MyService.accept();}catch(IOExceptionioe){ioe.printStackTrace();}第*页创建一个数据输入流BufferedReaderis=null;try{is=newBufferedReader(newInputStreamReader(MyClient.getInputStream());}catch(IOExceptionioe){ioe.printStackTrace();}注意:如果你用的是JDK1.0.2,则应使用DataInputStream类创建输入流,如下所示:DataInputStreamdis=null;try{dis=newDataInputStream(MyClient.getInputStream());}catch(IOExceptionioe){ioe.printStackTrace();}第*页在服务器端创建输入流BufferedReaderis=null;try{is=newBufferedReader(newInputStreamReader(serviceClient.getInputStream());}catch(IOExceptionioe){ioe.printStackTrace();}第*页创建一个数据输出流DataOutputStremos=null;try{os=newDataOutputStrem(MyClient.getOutputStrem());}catch(IOExceptionioe){ix.printStackTrace();}第*页使用DataOutputStrem类发送数据DataOutputStremos=null;try{os=newDataOutputStrem(serviceClient.getOutputStream());}catch(IOExceptionie){ie.printStackTrace();}第*页关闭Sockettry{os.close();is.close();MyClient.close();}catch(IOExceptionio){io.printStackTrace();}而在服务器端,代码应为:try{os.close();is.close();serviceSocket.close();}catch(IOExceptionic){ic.printStackTrace();}第*页2-5-3UDPSocket(数据报)UDPSocket连接通过DatagramSocket类创建。DatagramSocket使用包发送和接收数据,它们被表示为DatagramPacket对象。为了使两个程序能够通过UDP连接相互对话,在它们的机器上,必须有到一个端口的DatagramSocket连接。这可以通过创建一个DatagramSocket对象来完成。注意:在服务器代码中使用的DatagramPacket构造成员,只需要两个参数:一个是包含指定客户的字节数组;另一个是字节数组的长度。当我们如上面所示,构造一个DatagramPacket以通过DatagramSocket发送时,还必须提供包的目的地的Internet地址和端口号。第*页2-5-4多点传送Socket多点传送组由D类(范围在224.0.0.1~239.255.255.285之间)IP地址标识。将包广播给多个接收者有些类似于收音机和电视机广播。多点传送IP的一个实际应用就是Internet网上的音频和视频广播。想要监听多点传送地址的进程首先创建一个MulticastSocket,然后通过调用JoinGroup()方法,加入多点传送的会话。第*页2-6Greetings服务器实例%javaSimpleServer&SimpleServerStarted...%javaSimpleClientpleaseinputakeyword:helloGotfromtheServer:Sorry,youdon'tspeakmyprotocol.正确运行的情况如下:%javaSimpleServer&SimpleServerStarted...%javaSimpleClientpleaseinputakeyword:GreetingsGotfromtheServer::...andsalutations...第*页Greetings服务器实例服务器程序客户程序错误第*页2-6-1服务器程序服务器程序是非常简单的。它所要做的就是:产生一个ServerSocket对象和一个Socket对象,以接受客户的连接;产生一个输入流以便从客户机读信息;产生一个输出流,以便发送响应给连接的客户机。服务器程序如例2.1所示。注意,我们选择了大于1023的端口号5000来运行服务器。端口号0~1023被预留给了系统管理员运行的服务。第*页2-6-2客户程序客户程序也是非常简单的:它打开一个端口号为5000的Socket连接,此端口为服务器运行的端口;它使用一个输出流dos,发送信息到服务器;使用一个输入流,读来自服务器的信息(即应答)。第*页2-6-3错误如果你运行上述服务器和客户程序,会发现客户只能建立一个到服务器的连接。如果你再次运行客户程序,将得到出错信息“Connectionrefused”(拒绝连接)。事实上,上述的服务器程序在接受了一个客户的请求后就中止了,这一点需要注意。在下一章中,我们将讨论多线程服务器程序的开发,它能持续运行并正确处理多个客户在同一时间的请求。第*页2-7解析Internet地址GetNameGetIPNsLookupIPtoName第*页2-7-1GetName例2.3中的源代码显示了如何获得你所工作的机器的字符名。InetAddress是java.net包中的一个类。在例2.3中,host为InetAddress类型,语句Host=InetAddress.getLocalHost()返回到InetAddress。例如,如果我的主机名为“leo”,IP地址为“134.117.5.3”,那么变量host将得到值“leo/134.117.5.3”。由于我们主要使用的是机器名,所以我们可以使用方法getHostName()去输出机器名“leo”。第*页例2.3:GetName.javeimportjava.net.*;/***@(#)GetName.java*/publicclassGetName{publicstaticvoidmain(Stringargv[])throwsException{InetAddresshost=null;Host=InetAddress.getLocalHost();System.out.println(host.getHostName());}}第*页2-7-2GetIPInternet地址是以数字表示的,通常称作IP地址。前面例子中,返回的是机器名(即主机名)。但是,你如果想返回IP地址,如134.117.5.3的话,可以修改上例,以返回你所工作主机的IP地址。第*页2-7-2GetIP方法getAddress()返回一个4字节的字节数组。例如,如果你的IP地址是134.117.5.3,那么在例2.4中定义的字节数组变量ip的值应为:ip[0]=134ip[1]=117ip[2]=5ip[3]=3第*页2-7-4IPtoName由于InetAddress类中的getHostName()方法存在一个Bug,所以使用JDK1.0.2编写一个转换IP地址到字符名的程序并不是一项容易的工作。但是,在JDK1.1中更正了这个Bug,所以例2.6中的代码应该运行于JDK1.1或更高版本环境下。第*页第3章客户和服务器程序设计第*页主要内容对现有服务编写客户程序使用线程进行编程编写新的服务器和客户程序第*页3-1对现有服务编写客户程序SMTP客户程序finger客户程序ping客户程序第*页3-1-1SMTP客户程序SMTP,即简单邮件传输协议(SimpleMailTransferProtocol),它是Internet中被广泛用于发送邮件的一种协议。SMTP服务使用了TCP协议,运行于端口25。SMTP协议不很复杂,但是仍要掌握几个命令,以便更好地理解它的工作原理。下例为使用Telnet登录到一台运行SMTP服务的、端口号为25的机器上时,屏幕所显示的内容。第*页3-1-2finger客户程序finger是Internet服务之一,它用于确定当前哪一个用户登录到一台特定的计算机。另外,它也被用于探测更多的个人用户。finger协议在RFC 规范 编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载 的1288页有定义。finger服务器使用TCP协议,运行于端口79。当一个用户调用finger客户程序时,他通过需要提供用户ID。第*页3-1-3ping客户程序ping是PacketInterNetGroper的缩写,它是一个建立在Unix系统中的程序。它的作用是,通过向远程主机发送ICMPecho请求并等待一个响应,来检查远程主机是否可到达。ICMP(InternetControlMessageProcotol)最初的设计目的是允许路由器 报告 软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载 传输错误的原因,以及允许路由器和主机发送错误或控制信息给远程的路由器和主机。在Unix系统中,ping是通过向远程主机发送一个ICMPecho请求,并等待响应来实现的。如果响应中包含了在请求时所发送的数据,并且完全一致,就说明远程主机是可到达的。相反,如果路由器网关不能发送echo请求,那么它就返回一个不可到达信息(包括错误代码)给主机。第*页3-1-3ping客户程序第*页3-2使用线程进行编程线程线程的优点创建和运行线程创建和启动线程使线程睡眠控制线程改变线程优先级同步第*页序列程序第*页具有两个线程的程序第*页3-2-1线程“线程”(Thread)一词来源于操作系统中的短语Threadofexecution。在单线程的情况下,在任一时刻,只有一个单点执行。而如果在一个程序中使用多线程,那么就意味着,在任一给定时刻,程序有多点在执行。线程能够产生新的线程并且结束它们。新产生的线程运行于同一个地址空间,并且被允许共享数据。第*页3-2-2线程的优点使用线程时,会发现它具有许多优点。首先,它使程序能够同时执行多个任务。另外,它们提供了一个充分利用多CPU计算机的方法。下面是一个如何同时进行多任务的示例:假定要去读用户通过键盘输入的一行文本,这时程序就要终止,直到用户输入完毕。如果这时程序没有其他工作要做,那么这样没有什么问题。但如果程序这时还要做一些后台工作,例如绘图或制作动画等,那么就不得不等待该行文本输入完毕,CPU空闲下来才能进行。在这种情况下,就可以利用线程,在程序等待用户输入文本时,完成后台工作。线程的其他优点还包括,它能够提高应用程序的吞吐率,加快应用程序的响应时间,以及使应用程序更有效地利用系统资源。第*页3-2-3创建和运行线程注意:如果运行例3.4代码得到的结果与本文不同,不要太诧异,因为线程是与机器相关的。在不同的机器上,线程运行的顺序并不能保证相同。参见3-2-7节有关线程运行次序和优先级的介绍。第*页3-2-4创建和启动线程创建线程有两种方法,一个方法是从一个自定义的类(例如MyThread)中创建一个对象,这个类扩展了上文所述的Thread类。MyThread类中必须替换Thread类中的run()方法,这可以通过提供一个Implementation来实现。需要注意的是,初始化MyThread类(如MyThreadt1=newMyThread(“read”);)并不能使对象t1作为一个线程开始执行,而必须调用线程的start()方法以开始线程的执行。一旦start()方法被调用,它将依顺序调用run()方法。run()方法中,包括了线程所要执行的所有操作。这种创建线程的方法有一个缺陷,即必须扩展Thread类。由于Java不支持多重继承,所以不能写一个多线程的Applet。因为如果要写多线程的Applet的话,就要扩展Applet和Thread类,而这在Java中是不允许的。由于这个原因,Java给出了另一种创建线程的方法。第*页3-2-4创建和启动线程创建线程的另一种方法是使用接口。在Java中,用于创建线程的接口是Runnable,它的定义如下:packagejava.lang;publicinterfaceRunnable{publicabstractvoidrun();}这个接口中仅定义了一个方法,即run()方法。它被声明为abstract,这意味着这个接口的执行者必须执行run()方法。使用这个接口,同样可以实现上一个例子第*页3-2-5使线程睡眠假定一个绘图的方法以单线程方式运行,并且想要控制该线程绘制一个对象的速度。为做到这一点,可以在线程要绘制对象时,通过简单的挂起(Suspend)来实现。另外,也可以使用sleep()方法,通过使该线程睡眠,来暂停其一段运行时间。sleep的参数就是线程睡眠的毫秒数。注意,sleep方法抛出一个异常(InterruptedException),应该捕获该异常。第*页3-2-6控制线程而要控制线程的执行,则可以使用Thread类中的3个方法:stop(),suspend()和resume()。这些方法作用于当前线程,所以它们没有参数。第*页3-2-7改变线程优先级优先级的范围为1~10,其中1的优先级最低,10的优先级最高。Thread类定义了3个常量,用于选择常用的优先级:MIN-PRIORITY(=1),NORM-PRIORITY(=5)和MAX-PRIORITY(=10)。当一个线程刚产生时,它继承它的父线程的优先级,通常为5,即NORM-PRIORITY。使用getPriority()方法,可以得到一个线程的优先级;通过调用setPriority()方法,可以更改一个线程的优先级。SetPriority()方法必须带有一个大于0、小于等于10的整型参数。如果该参数小于0,大于10,则运行时将抛出IllegalArgumentException。第*页3-2-8同步使用线程时会发现,数据共享可能是一个缺陷。如果两个或两个以上线程共享访问(读或写)一个变量,那么就要仔细协调和同步数据访问。第*页3-3编写新的服务器和客户程序在对线程的编写进行简单介绍后,即准备编写一些有趣的多线程服务器应用程序——能够同时为多个客户程序提供的服务器程序。第*页Socket客户程序与多线程服务器程序的通信第*页算术客户/服务器应用程序将编写的应用程序是一个数学程序。在这个分布式程序中,客户发送两个整型数组给算术(Arithmetic)服务器,算术服务器将两个数组相加,并将结果(作为一个数组)返回给客户。客户程序重复该结果数组,并将其打印出来。读/写数组到流JavaAPI中没有现成的方法能够写整型数组到Socket,所以要写一个新类,其中的方法能够完成这项工作。同样,也没有现成的方法能够从Socket中读一个整型数组。所以在新类中有两个方法;一个从Socket中读整型数组;另一个写整型数组到Socket中。第*页第4章应用程序中的Socket第*页主要内容开发一个多线程HTTP服务器HTTP的安全代理服务器通过Socket访问数据库解释JDBC第*页4-1开发一个多线程HTTP服务器HTTP是一个应用程序级的协议,它所运行的机器被称为HTTP服务器或Web服务器。Web浏览器可以与HTTP服务器进行通信,并提交服务请求。这个服务通常是一个信息资源(如文档或图像)。服务器接收请求,然后尝试定位所请求的资源,如果找到,就把它返回给Web浏览器。HTTP支持GET、POST和HEAD等请求方法,为了简单起见,这里仅实现GET方法,以便我们的服务器能对文档和图像进行服务。第*页4-1开发一个多线程HTTP服务器注意:shipDocument只包括了HTTP所需响应的头信息的部分,如Content-Length和Content-Type:text\html。此处Content-Type(内容类型)为text\html,意味着此HTTP服务器只能提供文本和HTML文档服务。如果你请求一个图像(如.gif格式),那么浏览器将显示出一些杂乱的文本。为了能够处理图像,你需要指定文档的Content-Type。例如,如果请求的文件其扩展名为.gif,那么Content-Type必须为image\gif。同理,如果扩展名为.jpeg或.gif,则Content-Type必须分别为image\gif和image\jpeg。有关内容类型(Content-Type)的更多信息,请参见HTTP规范(http://www.w3C.org)。注意:run()方法创建了Connect类的一个新实例。产生这个的原因是因为run()方法不断循环,对于客户程序的每一个连接,ServerSocket都创建一个新的Socket,而服务器则创建一个新线程。Socket被创建于Connect类中。第*页4-2HTTP的安全在一个标准的HTTP服务器中,你当然不想其他人获取你禁止他们访问的文档。Java允许你创建一个安全的环境。Java提供了SecurityManager类,你可以继承它,以便为你的应用程序创建一个安全的环境。在下面的例子中,你将禁止他人在URL中使用“..”。为了使HTTP服务器更安全,可以通过继承SecurityManager类,并且替换它的部分方法,来自定义安全管理器(SecurityManager)。SecurityManager类中有多个方法,包括:checkAccess(),checkRead(),checkWrite()和checkConnect()。作为示例,我们将禁止他人读不允许他们读的文件。根据这一要求,新的SecurityManager类构造如下:classOutHttpDecurityManagerextendsSecurityManager{publicvoidcheckAccess(Threadg){};//Herearethemethodswewanttooverride.PublicvoidcheckRead(Stringfilename)if(filename.indexOf("..")!=-1){thrownewSecurityException("Notenoughprivilegestoread:"+filename+");}}}第*页4-2HTTP的安全这是一个非常简单的安全管理器,现在可以将它安装到HTTP服务器上了。安装它非常简单,只要在程序的main()部分中增加以下即可:System.setSecurityManager(newOurHttpdSecurityManager());第*页4-3代理服务器代理服务器的工作方式代理服务器的优点第*页4-3代理服务器代理服务器的主要目的就是建立一个到Internet的单一的访问和控制点。它允许一个公司内部的人员通过网络访问Internet,而阻止外部的人访问公司的内部网。第*页网络中的代理服务器第*页4-3-1代理服务器的工作方式代理服务器的主要功能就是接收来自Web浏览器的请求,然后执行请求,并将结果返回给浏览器。需记住的是,这一请求可能要在一定的认证之后才执行。为更好地理解这一过程,假定你通过浏览器访问下面的网址:http://www.somesite.com/home.html。假定有一个代理服务器(诸如proxy.somecompany.com),浏览器将发送你的请求给它,请求为:GEThttp://www.somesite.com/home.html。这时,代理服务器proxy.somecompany.com将连接到www.somesite.com,发出请求为:GET/home.html第*页4-3-2代理服务器的优点所有到外部的访问必须通过代理服务器,这样就产生了单一的访问和控制点。代理服务器必须运行在一台较高档的机器上,以便能够快速地处理客户机的请求,并保证客户机工作“愉快”。能够限制或禁止对某一类站点的访问,这样就为孩子们提供了一个安全的Internet环境。所有传输的HTML文档,连同发送此请求的计算机的IP地址都被记入日志,任何冲突都能够被快速解决。只有代理服务器的IP地址能为外界所知,这样就防止了由于知道内部计算机的IP地址所产生的攻击。第*页4-4通过Socket访问数据库通过MsqlJava,使用下列代码段就可以建立一个到mSQL数据库的连接。PrivatesycnhronizedvoidconnDB(){Msqlmsql;try{msql=newMsql();msql.Connect("myHostName","myUserName");msql.SelectDB("myDataBase");}catch(MsqlExceptione){e.printStackTrace();}}第*页4-5解释JDBCJDBC安全模式JDBCDriverManager剖析JDBC应用程序Java对象的持久性存储器第*页4-5解释JDBC打开一个数据库连接。创建一个语句对象,通过它,可以把SQL语句传递给底层的DBMS。返回结果。注意:本节的JPBC示例均使用JDK1.1、mSQL服务器和一个mSQLJDBC驱动程序创建。第*页4-5-1JDBC安全模式它假定未签名的Applet是不可信任的。不可信任的Applet不允许访问本地数据库。不可信任的Applet只被允许打开一个到服务器的连接,并从服务器下载。应用程序和可信任的Applet没有连接限制。第*页4-5-2JDBCDriverManagerJava.spl中最顶层的类是DriverManager类。就像它的名字一样,DriverManager保持了对驱动程序信息的跟踪。当一个驱动程序被安装时,它就通过DriverManager注册。当一个Java应用程序(构建于JDBC的顶层)打开一个连接,DriverManager就根据JDBCURL为它选择合适的驱动程序。JDBCURL的形式如下:Jdbc:第*页4-5-2JDBCDriverManagerURL有3部分:jdbc、subprotocol和subname。第1部分jdbc是协议,在JDBCURL中它始终不变;第2部分是子协议,它通常是一个数据库连接机制的驱动程序,第3部分是子名字,标识了一个数据库。假定有下面的JDBCURL:jdbc:msql://machine-name.com:port#/testDB它说明了以下信息:协议是JDBC;子协议是msql,它是工作于mSQL服务器的驱动程序;子名字//machine-name.com:port#/testDB标识了数据库。其中,machine-name.com是运行mSQL服务的机器名,port#是服务器所监听的端口号,testDB是数据库名。当一个驱动程序开发商为一个特殊的RDBMS开发了一个新的驱动程序时,他就应该向Sun注册该驱动程序,以作为一个子协议。这样,当DriverManager把它加入到已注册驱动程序的列表中后,就能通过子协议名识别出该驱动程序,建立到它所标识的数据库的连接。第*页4-5-3剖析JDBC应用程序第*页一个典型的JDBC应用程序4-5-3剖析JDBC应用程序选择一个驱动程序。确定使用哪一个URL。建立一个连接。一旦装载了驱动程序,并通过DriverManager注册,就可以建立一个到数据库的连接。创建一个语句对象。获得结果。关闭连接。第*页4-5-3剖析JDBC应用程序注意:Statement提供了3种执行SQL语句的不同方法:executeQuery、executeUpdate和execute。executeQuery方法大多用于SELECT语句;executeUpdate语句用于执行SQL语句。第*页4-5-4Java对象的持久性存储器持久性存储器(PersistentStorage)是存储对象状态的一个稳定而不易丢失的地方。在编写程序时,你可能会遇到这样的情况,即:需要一个对象存在,即使创建该对象的应用程序已经关闭。例如,假定你编写的一个应用程序,需要保持对employee(职员)记录的跟踪,需要跟踪的employee记录中的内容包括:employee的name(姓名)、age(年龄)以及salary(薪水)。使用例4.1所示的Java程序即可实现。第*页第5章Socket高级编程第*页主要内容对象序列化Socket对象数字签名报文第*页5-1对象序列化对象序列化与持久性对象序列化的安全控制序列化序列化对象的版本第*页5-1-1对象序列化与持久性本节我们将回顾一个第4章中,有关保持对(职员)数据跟踪部分曾讨论过的对象持久性的问题。我们将介绍如何使用持久性存储器提供对象的序列化。第*页5-1-2对象序列化的安全有两种方法可以保证序列化一个对象,而不将敏感的数据暴露给他人。第1种方法是,将任何敏感的数据标记为transient。这样,上面的passwd可以写做:privatetransientStringpasswd;当序列化发生时,Java虚拟机将被声明为transient的所有域。但是,如果你想同其他对象一样,序列化transient数据,你就必须重写writeObject和readObject方法,以控制发送的数据,以及如何存储它们。第2种处理敏感数据的方法是实现Externalizable接口,它是Serializable接口的子类。这个接口有两个方法必须被实现,它们是writeExternal和readExternal。第*页5-1-3控制序列化到现在为止,序列化还是通过使用ObjectInputStream、ObjectOutputStream、WriteObject和ReadObject来自动执行。但是,也有一些情况,如上文的PasswordFile,你需要控制哪一个域被序列化,而哪一个不被序列化。除了我们前面使用过的Serializable接口,java.io包还包括另一个接口:Externalizable。当你想要定义一个对象,以对序列化进行完全控制时,将用到这个接口。第*页5-1-4序列化对象的版本对象序列化机制使用一个标识符跟踪所有类。这个标识符称做serialVersionUID,它是一个64位的值,由类的结构计算得出。JDK中提供了一个名为serialver的程序,通过它,你可以确定一个类是否被序列化,并获得该类的aerialVersionUID。如果你使用–show调用该程序,它将弹出一个简单的用户界面。要确定一个类是否被序列化,以及它的serialVersionUID,可以在输入文本框中输入完整的类名,然后单击show按钮。如果类被序列化,那么你将得到一个serialVersionUID值。一旦得到这个值,你就可以在该类的后续版本中包括该值,以表明这个新版本同serialVersionUID所标明的版本兼容。这可以通过在你的version类中进行如下声明实现:StaticfinallongserialVersionUID=1421746759512286392L;注意:serialver所计算出来的这个值将用于所有兼容的类。第*页5-2Socket对象java.net包中的类包含了一些方法,这些方法能够读/写(或交换)客户和服务器之间的基本数据类型。第3章中,当我们开发算术服务器时,必须编写自己的方法,以读写整型数组到Socket,因为没有现成的方法能够完成这样的操作。那时有一个很好的问题,就是是否能通过Socket传送对象。回答当然是肯定的。使用对象序列化API,就可以通过Socket来写对象。第*页在线发送对象如果你已经熟悉了分布对象技术,你可能要问,为什么使用Socket来做这项工作,而不使用分布对象系统(例如RMI)来达到这个目的呢?如果你想通过Socket发送对象,而避免使用分布式对象系统所产生的开销,那么使用Socket和对象序列化就是一个可行的方法。本节中,我们将通过第3章中开发的示例——算术服务器程序,来说明如何通过Socket发送对象。此处提示一下,该程序的功能是,接收客户发送来的两个整型数组,将它们相加后,再把结果返回给客户。开发一个序列化的类我们需要一个类,它作为一个接口,为客户和服务器提供服务。该类定义了两个方法:一个设置数组,一个显示结果。第*页5-3数字签名报文java.security包数字签名示例:通过Socket签名文件第*页5-3-1java.security包java安全API使开发者能够将低层的和高层的安全函数,结合进它们的应用程序中。它为数字签名、报文摘要、密钥管理以及访问控制列表提供了API。下面,我们将只讨论数字签名,以及如何使用它们去认证通过Socket传送的报文。第*页5-3-2数字签名它能标识出作者、数据以及签名的时间。当用于解决争议时,它能被第三方所认可。为使数字签名得到实际的应用,它们必须具有以下特性:容易产生。容易识别和认证。不可伪造。第*页5-3-3示例:通过Socket签名文件第1步:开发一个签名对象为了通过Socket发送对象,我们必须使用对象序列化。因此,我们需要序列化签名对象。通过使签名的对象实现Seralizable接口,可以很容易地做到这一点。前面曾介绍过,Seralizable接口中并没有任何方法,所以也没有方法需要覆盖。例5.7为SignedObject的实现。第2步:开发客户应用程序本例中的客户程序要执行4项任务:读文件内容,文件将在命令行中作为一个参数赋给程序。使用安全API产生一对密钥(公共和私有)。签名文件内容。通过网络发送包含前面3项的对象给服务器。第3步:开发服务器应用程序一个服务器必须保持运行以监听客户的请求。第*页5-3-3示例:通过Socket签名文件下一步用公有密钥去初始化签名对象:sig.initVerify(obj.pub);//Pleaserefertoexample5.8.然后使用update()方法提供签名的数据给要验证的签名:sig.update(obj.b);最后,我们得以验证签名并报告结果:booleanvalid
本文档为【网络程序设计教学课件汇总整本书电子教案全套教学教程】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
春哥知识店铺
暂无简介~
格式:ppt
大小:5MB
软件:PowerPoint
页数:488
分类:理学
上传时间:2022-03-06
浏览量:2