java网络 编程.pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《java网络 编程.pdf》由会员分享,可在线阅读,更多相关《java网络 编程.pdf(29页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第 18 章 网 络 本章讨论支持网络应用的包。它的创建者称Java为“为网络编程”。尽管它只占Java的一小部分,与C+或FORTRAN相比,这种编程语言更有利于编写网络程序。使Java成为好的网络语言的正是包定义的类。这些类包装了由加州大学的伯克利分校的BSD引入的“套接字(socket)”范型。如果不简单介绍UNIX和BSD套接字的历史对Internet网络库的讨论就是不完整的。18.1 网 络 基 础 1969年,Ken Thompson和Dennis Ritchie在Murray Hill,New Jersey的贝尔电话实验室开发了与C语言一致的UNIX。很多年来,UNIX的发展停留
2、在贝尔实验室和一些大学及研究机构,用特意设计的DEC PDP机器运行。到了1978 年,Bill Joy在Cal Berkeley领导了一个项目,给UNIX增添新的特性,例如虚拟内存和全屏显示功能。到了1984年早期,当Bill正准备建立Sun Microsystems,它发明了4.2BSD,即众所周知的Berkeley UNIX。4.2BSD带有快速文件系统、可靠信号处理、进程间通信以及最重要的网络功能。最先在4.2中发现的网络支持后来成为了实际的Internet标准。Berkeley的TCP/IP实现保留了在Internet内通信的最初的标准。进程间和网络通信的套接字范型被Berkeley
3、以外的系统广泛采用。甚至Window和Macintosh在20世纪80年代晚期也开始和“Berkeley 套接字”谈话。18.1.1 套接字概述 网络套接字(network socket)有一点像电源插座。网络周围的各式插头有一个标准方法传输它们的有效负载。理解标准协议的任何东西都能够插入套接字并进行通信。对于电源插座,不论你插入一个电灯或是烤箱,只要它们使用60HZ,115伏电压,设备将会工作。思考一下你的用电账单是怎样生成的。在你的房子和电网支架间可能有1米的距离,经过这一米的每千瓦电都将列入账单。账单到达你的“地址”。所以,虽然电流在电源插座周围是自由流动的,你房子的所有插头都是有特定的
4、地址的。除了我们谈论的是TCP/IP包和IP地址而不是电器和街道地址外,同样的思想被应用到网络套接字。Internet Protocol(IP)是一种低级路由协议。该协议将数据分解成小包然后通过网络传到一个地址,它并不确保传输的信息包一定到达目的。传输控制协议(TCP)是一种较高级的协议,它把这些信息包有力的捆绑在一起,在必要的时候,排序和重传这些信息包以获得可靠的数据传输。第三种协议,用户数据报协议(UDP)几乎与TCP协议相当,并能够直接用来支持快速的、无连接的、不可靠的信息包传输。400 第 2 部分 Java 库 18.1.2 客户/服务器模式 你经常在与网络有关的话题中听说客户/服务
5、器(client/server)这个术语。在一些产品说明中,这个概念似乎非常复杂,其实它的含义很简单。服务器(server)就是能够提供共享资源的任何东西。现在有计算服务器,提供计算功能;打印服务器,管理多个打印机;磁盘服务器,提供联网的磁盘空间;以及Web服务器,用来存储网页。客户(client)是简单的任何有权访问特定服务器的实体。客户和服务器之间的连接就像电灯和电源插头的连接。房间的电源插座是服务器,电灯是客户。服务器是永久的资源,在访问过服务器之后,客户可以自由的“拔去插头”。在Berkeley套接字中,套接字的概念允许单个计算机同时服务于很多不同的客户,并能够提供不同类型信息的服务。
6、该种技术由引入的端口(port)处理,此端口是一个特定机器上的被编号的套接字。服务器进程是在“监听”端口直到客户连到它。尽管每个客户部分是独特的,一个服务器允许在同样端口接受多个客户。为管理多个客户连接,服务器进程必须是多线程的,或者有同步输入/输出处理多路复用技术的其他方法。18.1.3 保留套接字 一旦连接成功,一个高级的协议跟着生效,该协议与所使用的端口有关。TCP/IP 为特定协议保留了低端的1024 个端口。如果你在网络上冲浪有一些时间了,那么这中间的很多你已经很熟悉了。端口21是为FTP的,23是Telnet,25是为e-mail,79是为finger的,80是HTTP,119是为
7、网络新闻的等等。下面该轮到讲述每个协议决定客户如何与端口交互了。举例来说,HTTP是网络浏览器及服务器用来传输超文本网页和图像的协议。它是基本网页浏览服务器的一个非常简单的协议。下面是它的工作原理。当一个客户向一个HTTP服务器请求一个文件时,即一个点击动作,它仅仅以一种特定格式向预先指定的端口打印文件名然后读回文件的内容。服务器同样对状态代码编号反应,告诉客户请求是否被执行以及原因。下面是一个例子。客户请求单个文件/index.html,服务器回应它已成功找到该文件并且把文件传输到客户:服务器 客户 监听80端口 与端口80连接 接受连接 写“GET/index.html HTTP/1.0n
8、n”读取数据直到遇到第二个换行符(n)知道GET是一个命令,HTTP/1.0是有效的协议 读取名为/index.html的本地文件 写“HTTP/1.0 200 OKnn”“200”意味着“文件来了”向套接字复制文件内容 读取文件内容并显示 挂起 挂起 很明显,HTTP协议比该例显示的要复杂的多,但这是一个实际的和附近Web服务器的传输。第 18 章 网 络 401 18.1.4 代理服务器 一个代理服务器(proxy server)以客户端协议与其他服务器通信。这在客户与服务器连接受到某些限制的情况下经常是必需的。这样,客户可以连接代理服务器,代理服务器没有这些限制并且代理服务器也会依次和客
9、户通信。代理服务器具有过滤某些请求或缓存一些这样的请求的结果以备后用的额外功能。一个缓冲代理HTTP 服务器可用来减小局域网连向Internet的带宽要求。若一个流行网站的网址被成百上千个用户点击,代理服务器可以一次获得该网络服务器的流行网页,节省昂贵的Internet网络传输,同时为用户快速提供对这些网页的访问。本章的后面部分,我们将实际建立一个完整的缓冲代理HTTP服务器。这个程序有趣的是它既是客户又是服务器。为服务于某些网页,它必须像客户那样向其他服务器获取被请求内容的一个拷贝。18.1.5 Internet 编址 Internet上的每一台计算机都有一个地址。Internet地址是网络
10、上标识每台计算机的惟一定义的数。IP地址有32位,我们通常把它们分成4个从0到255的,有点号(.)隔开的序列。这使它们易于记忆,因为它们不是随机指派的它们是按层次结构指派的。最开始的字节定义了网络属于A、B、C、D或E哪个等级。多数Internet用户使用C级,因为有多于两百万的网络是在C类。C类网的开始字节从192到224,最后字节实际上标识了256之中可以上单个C类网的独立计算机。这种安排允许在C类网中可以有5亿的设备。域名服务(DNS)如果每台机器必须用数字作为它们的地址,Internet不是一个漫游的友好场所。例如,设想在广告的底部看见“http:/192.9.9.1/”,这一定使人
11、头昏脑胀。感谢上帝,存在一个与所有这些数字相伴的一个平行层次的名称的交换所,叫做域名服务(DNS)。就像IP地址中从左到右描绘网络层次的四个数字一样,Internet 地址的名称,域名,在名称空间从右到左描述了机器的地址。例如,是在COM域(为美国商业企业保留)中的,叫做osborne(公司名称)的,www是Osborne的Web服务器的特定计算机的名称。www在意义上相应于IP地址的最右边的数字。18.2 JAVA和网络 现在准备工作已经完成,让我们看看Java怎样和所有的这些网络概念相联系。Java 通过扩展第17章介绍的已有的流式输入/输出接口和增加在网络上建立输入/输出对象特性这两个方
12、法支持TCP/IP。Java支持TCP和UDP协议族。TCP用于网络的可靠的流式输入/输出。UDP支持更简单的、快速的、点对点的数据报模式。18.2.1 网络类和接口 包所包含的类如下:402 第 2 部分 Java 库 Authenticator(Java 2)JarURLConnection(Java 2)SocketPermission ContentHandler MulticastSocket URL DatagramPacket NetPermission URLClassLoader(Java 2)DatagramSocket PasswordAuthentication(Jav
13、a 2)URLConnection DatagramSocketImpl ServerSocket URLDecoder(Java 2)HttpURLConnection Socket URLEncoder InetAddress SocketImpl URLStreamHandler 包的接口如下:ContentHandlerFactory SocketImplFactoryURLStreamHandlerFactory FileNameMap SocketOptions DatagramSocketImplFactory(Java 2,v1.3中添加的)下面我们将讨论主要的网络类并且一些应
14、用例子。18.3 InetAddress类 无论你是在打电话、发送邮件或建立与Internet的连接,地址是基础。InetAddress 类用来封装我们前面讨论的数字式的IP地址和该地址的域名。你通过一个IP主机名与这个类发生作用,IP主机名比它的IP地址用起来更简便更容易理解。InetAddress 类内部隐藏了地址数字。18.3.1 工厂方法 InetAddress 类没有明显的构造函数。为生成一个InetAddress对象,必须运用一个可用的工厂方法。工厂方法(factory method)仅是一个类中静态方法返回一个该类实例的约定。这是在一个带有各种参数列表的重载构造函数完成的,当持有
15、惟一方法名时可使结果更清晰。对于InetAddress,三个方法 getLocalHost()、getByName()以及getAllByName()可以用来创建InetAddress的实例。三个方法显示如下:static InetAddress getLocalHost()throws UnknownHostException static InetAddress getByName(String hostName)throws UnknownHostException static InetAddress getAllByName(String hostName)throws Unknow
16、nHostException getLocalHost()仅返回象征本地主机的InetAddress 对象。getByName()方法返回一个传给 它 的 主 机 名 的 InetAddress。如 果 这 些 方 法 不 能 解 决 主 机 名,它 们 引 发 一 个UnknownHostException异常。在Internet上,用一个名称来代表多个机器是很常有的事。Web服务器中,也有方法提供一定程度的缩放。getAllByName()工厂方法返回代表由一个特殊名称分解的所有地址的InetAddresses类数组。在不能把名称分解成至少一个地址时,它将引发一个Unknown HostE
17、xception异常。第 18 章 网 络 403 下面的例子打印了本地机的地址和名称以及两个著名的Internet网址:/Demonstrate InetAddress.import .*;class InetAddressTest public static void main(String args)throws UnknownHostException InetAddress Address=InetAddress.getLocalHost();System.out.println(Address);Address=InetAddress.getByName();System.out.
18、println(Address);InetAddress SW=InetAddress.getAllByName();for(int i=0;i Last update of whois database:Fri,6 Oct 2000 10:03:36 EDT 0)System.out.println(=Content=);InputStream input=hpCon.getInputStream();int i=len;while(c=input.read()!=-1)&(-i 0)System.out.print(char)c);input.close();else System.out
19、.println(No Content Available);408 第 2 部分 Java 库 该程序建立了一个经过端口80通向 的HTTP 连接。然后列出了标头值并检索内容。下面是输出的前几行:Date:Fri Oct 06 14:17:10 CDT 2000 Content-Type:text/html Expires:0 Last-Modified:Tue Oct 26 01:36:57 CDT 1999 Content-Length:529=Content=Osborne/McGraw-Hill:Required Reading for the Information Age URL
20、和URLConnection类对于希望建立与HTTP服务器的连接来获取信息的简单程序来说是非常好的。对于更复杂的应用程序,你会发现学习HTTP协议规范,实现你自己的包装程序是比较好的。18.7 TCP/IP服务器套接字 如我们在前面提到的,Java具有用来创建服务器应用程序的不同的套接字类。ServerSocket类用来创建服务器,服务器监听本地或远程客户程序通过公共端口的连接。既然Web驱动着Internet中的大部分活动,本节就开发一个可运行的Web服务器(http)。ServerSocket与通常的Sockets类完全不同。当创建一个ServerSocket类,它在系统注册自己对客户连接
21、感兴趣。ServerSocket的构造函数反映了希望接受连接的端口号及你希望排队等待上述端口的时间(该项可选)。队列长度告诉系统多少与之连接的客户在系统拒绝连接之前可以挂起。队列的默认长度是50。构造函数在不利情况下可以引发IOException异常。下面是构造函数:ServerSocket(int port)在指定端口创建队列长度为50的服务器套接字。ServerSocket(int port,int maxQueue)在指定端口创建一个最大队列长度为maxQueue的服务器套接字。ServerSocket(int port,int maxQueue,InetAddress localAdd
22、ress)在指定端口创建一个最大队列长度为maxQueue的服务器套接字。在一个多地址主机上,localAddress指定该套接字约束的IP地址。ServerSocket有一个额外的accept()方法,该方法是一个等待客户开始通信的模块化调用,然后以一个用来与客户通信的常规Socket返回。第 18 章 网 络 409 18.8 缓存代理HTTP服务器 本节的剩余部分,我们讲述一个简单的缓存代理HTTP服务器,名为http,来演示客户与服务器套接字。http只支持GET操作及硬编码的MIME类型的一小部分(MIME类型是多媒体内容的类型描述符)。代理HTTP服务器是单线程的,该线程中每一个请
23、求依次被处理,其他请求等待。这是缓存的相当天真的策略它在RAM永久保存所有信息。http作为一个代理服务器时,它还拷贝每一个它获取的文件到本地缓存中。对于本地缓存,它没有用于刷新和无用单元回收的策略。除此之外,http代表了客户和服务器套接字的一个多产的例子,它是值得探究和容易扩展的。18.8.1 源代码 HTTP服务器是通过5个类和一个接口实现的。更完善的实现方案可能在主类httpd外分裂很多的方法,以使组成结构更抽象。考虑本书的容量,多数功能是在单个类中实现的,小的支持类仅作为数据结构。我们仔细学习每一个类和方法来了解该服务器怎样工作,由支持类开始,终止于主程序。MimeHeader.ja
24、va MIME是通过电子邮件系统传达多媒体内容的一个Internet标准。该标准是由Nat Borenstein在1992年创建的。HTTP协议运用并扩展了MIME标头的概念,在HTTP客户和服务器之间传输常规的属性/值对。构造函数 该类是Hashtable 的一个子类,所以它能方便的存储和检索与MIME标头有关的关键字/值对。它有两个构造函数。一个创建一个不含关键字的空的MimeHeader。另一个以一个格式化的字符串作为MIME标头,然后把它解析为对象的初始内容。参看下面的parse()。parse()parse()方法用来获取一个原始MIME格式的字符串,并使它的关键字/值对进入一个给定
25、的MimeHeader实例。它用StringTokenizer 把输入数据分解成独立的由CRLF(rn)序列标记的行。然后用规范的while.hasMoreTokens().nextToken()序列遍历每一行。对于MIME标头的每一行,parse()通过冒号(:)把该行分解成两个字符串。两个变量key和val由substring()方法设置,用来提取冒号前后的字符及后面的空隔。当两个字符串被提取后,使用put()方法存储Hashtable中的关键字和值之间的关联。toString()toString()方法(用于String 串联操作,+)只是parse()的反方法。它获取当前存储在Mime
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java网络 编程 java 网络
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内