-182-第9章网络编程技术9.1网络技术基础Java语言能够风靡全球的重要原因之一就是和网络的紧密结合。这不仅体现在用Java可以很方便地在网络的主页中嵌入Applet,还体现在Java专门为网络通信提供的软件包java.net。java.net软件包为当前最常用的TCP(TransmissionControlProtocol)和UDP(UserDatagramProtocol)网络协议提供了相应的类,使用户能够方便地编写出基于这两个协议的网络通信程序。那么,什么叫协议呢?协议是一组规则,它定义了计算机之间相互通信的的规程和约定,在计算机通信中起着非常重要的作用。网络协议管理着网络计算机和网络应用程序之间的信息流动,其模型如图9.1所示。在Internet/Intranet网络上的计算机之间的通信通常使用的是TCP和UDP协议。应用层(例如:HTTP,FTP,Telnet)传输层(例如:TCP,UDP)网络层(例如:IP)链路层(例如:设备驱动程序)物理层(网络的物理连接设备)图9.1计算机的网络通信协议模型TCP是一种可靠的网络通信协议,它的通信方式就像平时打电话一样,首先通话的双方必须建立一个连接(类似于打电话时拨号),然后才能接收数据(类似于打电话时的交谈),通信结束后,关闭网络连接(类似于通话的双方挂上电话)。TCP通信协议在通信双方提供了一个点对点的通道,保证了数据通信的可靠进行,否则,会提示通信出错。典型的TCP应用程序有超文本传输协议(HyperTextTransferProtocol,HTTP),文件传输协议(FileTransferProtocol,FTP)和远程登录协议Telnet。UDP提供了一种基于非连接的网络通信协议,它的通信方式非常类似于邮信,每次通信时发送一个独立数据包,发送的顺序并不重要,也无法保证。在网络通信质量不断提高的今天,UDP的应用相当广泛,它与TCP相比具有系统开销小的优点。UDP的一个典型的应用是ping,ping命令的目的是测试通过网络连接的计算机之间的通信是否畅通。实际上,除了TCP和UDP以外,还有一个常用的IP(InternetProtocol)协议,它与UDP很相似,是使用数据包进行传输的不可靠、无连接的协议。IP协议只能将数据发送到主机,通过本章的学习了解网络协议的基本概念以及网络编程的必要性,掌握在Java语言中利用URL、InetAddress等类访问网络信息的基本原理和方法,了解Socket的基本编程思想。通过技能训练,掌握Java语言中网络编程的基本技术。-183-而UDP可以将数据发送到一台主机的多个应用程序。IP协议为网络上每台计算机定义了一个惟一的标识,称为IP地址。一个IP地址是一个32位的整数。根据IP地址,传送的信息就可以通过路由找到目标计算机。TCP和UDP都提供了端口的概念。端口(Port)和IP地址一起为网络通信的应用程序之间提供了一种确切的地址标识作用,IP地址标识了发送数据的目的计算机,而端口标识了将数据包发送给目的计算机上的具体应用程序上,其工作原理如图9.2所示。端口号的范围从0到65535,1024以下的端口号由系统使用。来自网络的数据包图9.2端口与IP地址的标识作用9.2使用URL类Java.net提供了利用URL实现服务器访问的类,在此基础上,可以实现客户端和服务器端的通信,并可以实现多客户的通信。9.2.1URL的基本概念【引例】在Internet网络上欲查找美国微软公司的信息资源,需要在浏览器中输入如下格式的字符序列:或于是微软公司的主页信息就会出现在个人计算机屏幕上。那么这些字符序列代表什么含义,遵循了什么原则呢?实际上它使用了URL的基本概念。URL又称为统一资源定位器(UniformResourceLocator)。IP地址定位了在互联网上的一台计算机,端口定义了在这台计算机上提供的服务,而URL提供了网上资源的一个指针。该资源可以是一个简单的文件,或者一个目录,也可以是一个复杂的对象。通过URL,可以访问Internet服务器,浏览器通过解析给定的URL可以在网络上查找相应的文件和网络资源。应用程序(HTTP)端口(80)TCP或UDP(某台计算机)应用程序(FTP)端口(21)应用程序(Telnet)端口(23)IP地址端口号数据……-184-一般地,一个URL的语法格式如下:应用协议://主机名[:端口号][/文件或目录名][#锚链指针]应用协议:指与某个服务相关的协议。例如,http,ftp,telnet等。主机名:可以是某台计算机的主机域名或IP地址。例如,引例中的是一个主机域名,而207.46.197.101则是该主机的IP地址。端口号:指出与服务相关的端口号,可以省略。如果需要,则在端口号前要加“:”。例如,引例中的“:80”就是指定的端口号。文件或目录名:可以是以html(或htm)为后缀的文件名,也可以是目录名。例如,引例中的ms.htm。锚链指针:指出文件中的某个起始入口点,可以省略。如果需要,则在锚链指针前要加“#”。例如:,,telnet://bbs.server.edu.cn都是URL常用的地址形式。9.2.2URL类【引例】利用URL类读取网络资源的程序示例如下。importjava.io.*;importjava.net.*;publicclassgetURL{publicstaticvoidmain(String[]args)throwsException{//创建一个URL对象URLmyURL=newURL();System.out.println(protocol=+myURL.getProtocol());//输出协议名System.out.println(host=+myURL.getHost());//输出主机名System.out.println(filename=+myURL.getFile());//输出文件名System.out.println(port=+myURL.getPort());//输出端口地址System.out.println(ref=+myURL.getRef());//输出锚链指针}}该引例的功能:得到URL地址中的协议名称、主机名、文件名、端口号及锚链指针,它是通过URL类来完成的。引例中importjava.net.*是Java语言进行网络编程时必须引用的程序包,本节中所涉及的类大都在该程序包中。Java语言提供的java.net.URL类,目的是利用URL进行网络编程。URL类给程序员提供了一个强大的工具来编写一个客户应用程序,以便从Internet上获取各种信息。-185-1.构造方法URL类提供了几个构造方法,以便创建URL对象,其目的就是为了在Internet/Intranet上确定资源的位置,这也是操作这些资源的前提,引例中的newURL()就是URL的一个构造方法。URL类常用的构造方法有如下一些:(1)publicURL(Stringprotocol,Stringhost,intport,Stringfile)其中,protocol:协议名称;host:主机名或IP地址;port:端口号;file:主机目录或文件。(2)publicURL(Stringprotocol,Stringhost,Stringfile)(3)publicURL(Stringspec)其中,spec是一个当作URL对象来分析的字符串。(4)publicURL(URLcontext,Stringspec)其中,context是一个URL对象,与spec参数一起使用,通常作为spec参数的上下文,即当spec参数不完全时,提供一种补充。格式4的功能:根据一个非语法分析的字符串创建一个相对的URL。当分析了spec参数后,如果没有指定协议名,则使用context参数中的协议名;如果两者的协议名相同,context参数中的host,port,file等参数将在新创建的URL中使用。例如,创建一个格式1的URL对象如下。URLmyURL=newURL(http,,80,/);创建一个格式4的URL对象如下。URLmyURL=newURL();URLyourURL=newURL(myURL,index.html);需要说明的是,在创建URL类的对象时,常常会抛出一个MalformedURLException异常和其他异常。2.方法URL类中常用的方法有如下一些:(1)publicStringgetProtocol()功能:得到URL对象的协议名。(2)publicStringgetHost()功能:得到URL对象的主机名。(3)publicStringgetFile()功能:得到URL对象中给定主机上资源的绝对路径和文件名。(4)publicintgetPort()功能:得到URL对象的端口号,如果没有设定端口号,则返回-1。(5)publicStringgetRef()功能:得到URL对象的锚链指针。-186-(6)publicURLConnectionopenConnection()throwsjava.io.IOException功能:得到一个URLConnection对象实例,它代表了与远程对象的连接。(7)publicfinalInputStreamopenStream()throwsjava.io.IOException功能:打开与URL的一个连接,返回一个从该连接读到的InputStream对象实例。(8)publicfinalObjectgetContent()throwsjava.io.IOException功能:得到URL的内容。【9.1】使用URL类的简单程序实例。importjava.io.*;importjava.net.*;publicclassgetURL{publicstaticvoidmain(String[]args)throwsException{//创建URL对象URLmyURL=newURL();System.out.println(protocol=+myURL.getProtocol());//获得协议名称System.out.println(host=+myURL.getHost());//获得主机名System.out.println(filename=+myURL.getFile());//获得文件名System.out.println(port=+myURL.getPort());//获得端口号System.out.println(ref=+myURL.getRef());//获得锚链指针}}程序运行结果如下:protocol=httphost==/ttt.htmlport=80ref=aaa【9.2】使用URL类直接读取信息的示例。importjava.net.*;importjava.io.*;publicclassmyURLRead{publicstaticvoidmain(String[]args)throwsException{URLmyPage=ne