1.32k likes | 1.53k Views
网络编程( java ). 什么是网络编程. 网络编程 又称为网络程序设计 . 广义的说 , 所有涉及网络 ( 规划 , 设计 , 实施 , 测试 , 运行 , 应用 , 维护 , 管理 ) 的编程都是 网络编程 狭义来说 , 网络编程 是指所有涉及到利用网络进行交互 / 通信的编程 ( 同一主机内进行数据通信的一般是指进程间通信 ) 本课程中以介绍狭义的 网络编程 为主. 什么是 网络编程.
E N D
什么是网络编程 • 网络编程又称为网络程序设计.广义的说,所有涉及网络(规划,设计,实施,测试,运行,应用,维护,管理)的编程都是网络编程狭义来说,网络编程是指所有涉及到利用网络进行交互/通信的编程(同一主机内进行数据通信的一般是指进程间通信)本课程中以介绍狭义的网络编程为主
什么是网络编程 • 从狭义角度考虑,我们把网络编程分成以下几类:接口通信编程计算机的接口包括串口,并口,USB口,网卡口等.通过接口的编程实现数据的传递.这是一种底层的通信方式套接字编程什么是套接字 就是socket,原意是插座.套接字是应用程序基于TCP/IP协议进行交互的接口.套接字编程适合于网络上链路层之上的各种网络通信程序.这是一种处于中层的通信方式.Web编程Web全称为World Wide Web,缩写WWW,中文称万维网.Web是一种基于超链接(Hyper Link)的超文本(Hyper Text)系统,因提供媒体信息的多样性,也称为超媒体环球信息网.通过Web可以访问遍布于互联网主机上的链接文档.Web是一种处于上层的通信方式.
本课程与相关课程的关系 • 网络编程技术中会用到C,C++,Java,PHP等多种语言.学生在学习本课程前,必需已经学过java语言程序设计.在学习本课程前,学生最好已经学过计算机网络,至少对计算机网络的七层OSI模型有一定的了解.此外,操作系统,分布式系统,网络计算的知识对于学习本课程是很有帮助的:学习网络编程技术的目的是为了操作系统,分布式系统及其应用的开发,这些课程的基本原理有助于应用网络编程技术开发出高效有用的网络程序和软件.
概 述 • 1 网络技术基础 • Internet上的计算机之间采用TCP/IP协议进行通信,下图是TCP/IP协议体系的层次结构。TCP/IP没有对OSI参考模型中的物理层和数据链路层作出规定,只是定义了网络接口,使得TCP/IP协议可以运行在各种硬件设备上。TCP/IP协议的互联网层负责相邻结点之间的数据传送,处理网络的路由选择、流量控制和拥塞控制等问题。
使用Java语言编写网络通信程序通常是在应用层,对某些特殊的应用可能需要直接基于传输层协议编程,一般无需关心网络通信的具体细节,特别是互联网层和网络接口层。使用Java语言编写网络通信程序通常是在应用层,对某些特殊的应用可能需要直接基于传输层协议编程,一般无需关心网络通信的具体细节,特别是互联网层和网络接口层。 • 传输层提供在源结点和目标结点的两个进程实体之间提供可靠的端到端的数据传输,TCP/IP模型提供了两种传输层协议,即传输控制协议TCP和用户数据报协议UDP。
TCP协议是面向连接的,在传送数据之前必须与目标结点建立连接,数据传输结束后关闭连接。而UDP是一种无连接协议,可直接传输数据,无需事先建立连接,直接发送带有目标结点信息的数据报。不同的数据报可能经过不同的路径到达目标结点,到达时的顺序与出发时的顺序也可能不同。
采用哪种传输层协议是由应用程序的需要决定的,如果可靠性更重要的话,用面向连接的协议会好一些。比如文件服务器需要保证数据的正确性和有序性,如果一些数据丢失了,系统的有效性将会失去。而有一些服务器是间歇性地发送一些数据块的,如果数据丢失,服务器并不需要再重新发送,因为当数据到达的时候,它可能已经过时了。确保数据的有序性和正确性需要额外的操作和存储空间,这将会降低系统的响应速率。采用哪种传输层协议是由应用程序的需要决定的,如果可靠性更重要的话,用面向连接的协议会好一些。比如文件服务器需要保证数据的正确性和有序性,如果一些数据丢失了,系统的有效性将会失去。而有一些服务器是间歇性地发送一些数据块的,如果数据丢失,服务器并不需要再重新发送,因为当数据到达的时候,它可能已经过时了。确保数据的有序性和正确性需要额外的操作和存储空间,这将会降低系统的响应速率。
传输层的上一层是应用层,应用层包括所有的高层协议。早期的应用层有远程登录协议(Telnet)、文件传输协议(File Transfer Protocol ,FTP)和简单邮件传输协议(Simple MailTransfer Protocol ,SMTP)等。目前使用最广泛的应用层协议是用于从Web服务器读取页面信息的超文本传输协议(Hyper Text Transfer Protocol,HTTP)。
端口(Port)与IP地址一起为网络通信的应用程序之间提供一种确切的地址标识,IP地址标识了发送数据的目的计算机,而端口标识了将数据包发送给目的计算机上的哪一个应用程序,如图所示。应用层协议通常采用客户/服务器模式,应用服务器启动后监听特定的端口,客户端需要服务时请求与服务器该端口建立连接。一些常用的应用服务都有缺省的端口(称为熟知端口),例如Web服务器缺省的端口号为80。端口(Port)与IP地址一起为网络通信的应用程序之间提供一种确切的地址标识,IP地址标识了发送数据的目的计算机,而端口标识了将数据包发送给目的计算机上的哪一个应用程序,如图所示。应用层协议通常采用客户/服务器模式,应用服务器启动后监听特定的端口,客户端需要服务时请求与服务器该端口建立连接。一些常用的应用服务都有缺省的端口(称为熟知端口),例如Web服务器缺省的端口号为80。
2 网络编程的基本方法 • Java语言专门为网络通信提供了软件包java.net。采用java.net包提供的API可以快速方便地开发基于网络的应用。 • java.net包对http协议提供了特别的支持。只需通过URL类对象指明图像、声音资源的位置,无需额外的工作,就可以轻松地从Web服务器上获取图像、声音,或者通过流操作获取HTML文档及文本等资源,并可以对获得的资源进行处理。使用这种方法下载图像是相当简单的。
java.net包还提供了对TCP、UDP协议套接字(Socket)编程的支持,可以建立用户自己的服务器,实现特定的应用。Socket是一种程序接口,最初由California大学Berkeley分校开发,是用于简化网络通信的一种工具,是UNIX操作系统的一个组成部分。现在Socket的概念已深入到各种操作环境,包括Java。
2 URL 编 程 • 1 URL的概念 • URL(Uniform Resource Locator,统一资源定位器)用来标识Internet上的资源,指明取得资源采用的协议和地址,通过URL可以访问Internet上相应的文件和其他资源。 • 典型的URL格式为 • 协议名://主机名:端口号/资源路径
协议名用于指明获取资源所用的传输协议,例如http、ftp、gopher等;主机名指明资源所在的计算机,端口号指明服务器的端口号,对于常用的一些协议(如http、ftp等),如果不指明端口号,则使用该协议缺省的熟知端口;资源路径指明该资源在服务器上的虚拟路径。例如:协议名用于指明获取资源所用的传输协议,例如http、ftp、gopher等;主机名指明资源所在的计算机,端口号指明服务器的端口号,对于常用的一些协议(如http、ftp等),如果不指明端口号,则使用该协议缺省的熟知端口;资源路径指明该资源在服务器上的虚拟路径。例如: • http://java.sun.com/j2se/1.4.2/download.html • http为协议名,java.sun.com为主机名称,使用缺省的端口80,/ j2se/1.4.2/download.html为服务器上文件的虚拟路径。
资源路径还可以包含HTML文件中的参考位置(或称为参考点),例如: http://home.netscape.com:80/home/white_paper.html#intro_1 • 这里,intro_1为white_paper.html中的一个位置。
上面定义的URL形式包含访问网络资源的完整路径,通常称为绝对URL。在HTML文档中通常还会使用相对URL。一个相对URL不包括协议或主机信息,用于指定与当前文档处于相同主机的HTML文档。相对URL可能包括相对路径的成员,也可能是URL片断。例如,在http://java.sun.com/j2se/1.4.2/download.html文档中相对URL:上面定义的URL形式包含访问网络资源的完整路径,通常称为绝对URL。在HTML文档中通常还会使用相对URL。一个相对URL不包括协议或主机信息,用于指定与当前文档处于相同主机的HTML文档。相对URL可能包括相对路径的成员,也可能是URL片断。例如,在http://java.sun.com/j2se/1.4.2/download.html文档中相对URL:
system-configurations.html • 表示资源http://java.sun.com/j2se/1.4.2/system- configurations.html。同样,相对URL: • /j2se/1.4.2/system-configurations.html • 也表示该资源。
2 URL类 • 1.URL对象的创建 • 用Java语言访问Web资源是通过URL类来实现的,URL类定义了一个Web资源的统一资源定位器和可以对其进行的一些操作。URL类的对象指向Web资源(如Web页、文本文件、图形图像文件、音频视频文件等等),创建URL对象后可取得URL的各个部分的信息和获取URL内容。 • URL类的构造方法有多种形式,下面是常用的几种形式:
(1) public URL(String spec) throws MalformedURLException:简单地用一个字符串生成URL对象,如: • URL url0=new URL("http://java.sun.com/j2se/1.4.2/download.html");
(2) public URL(String protocol,String host,String file) throws MalformedURLException: • 分开指定URL的各个部分,包括协议、主机名、资源路径,采用缺省端口构成URL对象,如: • URL url1=new URL("http","java.sun.com" ,"/j2se/1.4.2/download.html");
(3) public URL(String protocol,String host,int port,String file) throws Malformed • URLException:分开指定的URL各个部分构成URL对象,如: • URL url2=new URL("http"," java.sun.com",80, "/j2se/1.4.2/download.html "); • (2)、(3)两种构造方法不能构造含有“# 参考点”的URL地址。
(4) public URL(URL context,String spec):构造相对URL对象,如: • URL base1=new URL("http:// java.sun.com/j2se/1.4.2/" ); • URL url3=new URL( base," download..html");
这种方法常用于Java Applet。Applet类提供了方法getDocumentBase和getCodeBase,分别用于获得当前Applet所在页面的目录路径和Applet所在的目录路径,关于这一点程序4.1中已介绍过,本章不再详述。在Applet中可采用类似下面的代码来构造URL对象: • URL url1=new URL(getDocumentBase(),"file1.txt"); • URL url2=new URL(getCodeBase(),"file2.txt");
URL类的构造方法都抛出MalformedURLException异常,生成URL对象时,必须对这一异常进行处理。例如: • try{ • URL myURL=new URL("http://java.sun.com/"); • } catch (MalformedURLException e){ • System.out.println("MalformedURLException:"+e); • }
URL对象创建后,不再可以修改该对象所表示的URL地址,但可以通过URL类提供的方法成员来获取其属性,如协议、主机名、端口号、文件名等。常用的方法有: • ● public int getPort():得到URL对象的端口号; • ● public String getProtocol():得到URL对象的协议名;
● public String getHost():得到URL对象的主机名; • ● public String getFile():得到URL对象的文件名; • ● public String getRef():得到URL对象的参考点; • ● public boolean equals(Object obj):比较两个URL,不包括参考点。
2.从网络上获取图像 • Java Applet可以使用getImage方法直接从Web服务器获取图像资源,目前支持的图像文件格式为GIF和JPEG两种。
【程序】 使用相对URL从Web服务器获取图像。 • import java.applet.*; • import java.awt.*; • public class downImage extends Applet{ • Image image; • public void init() • { • image=getImage(getDocumentBase(),"test.gif");
} • public void paint(Graphics g) • { • g.drawImage(image, 0, 0,this); • } • } • 程序获取并显示了图像test.gif。在该例中,首先用语句 • getImage(getDocumentBase(), "test.gif");
从HTML文档所在位置下载图像test.gif,并创建一个Image类型的对象image,然后在paint方法中用语句从HTML文档所在位置下载图像test.gif,并创建一个Image类型的对象image,然后在paint方法中用语句 • g.drawImage(image, 0, 0,this); • 在屏幕上将图像显示出来。 • Applet类提供的getImage方法有两种形式: • ● Image getImage(URL url,String name); • ● Image getImage(URL url)。
程序采用了第一种形式,图像资源的完整路径由第一个参数表示的路径目录与第二个字符串参数表示的相对URL构成。第二种形式直接使用完整的URL给出图像资源的路径。采用第二种形式代码段形式通常像下面这样:程序采用了第一种形式,图像资源的完整路径由第一个参数表示的路径目录与第二个字符串参数表示的相对URL构成。第二种形式直接使用完整的URL给出图像资源的路径。采用第二种形式代码段形式通常像下面这样:
String url = "图像资源URL"; • Image image; • try { • image = getImage(new URL(url)); • }catch(Exception e){ • System.out.println("Can't open the URL "); • }
不过,在Java Applet中一般很少采用绝对URL,因为出于安全性的考虑,浏览器只允许Java Applet访问与Applet同一主机的资源。如果采用绝对URL,则当Applet放到其他的Web服务器上运行时,必须修改程序。
【程序】 使用绝对URL从Web服务器获取图像。 • import java.applet.*; • import java.net.*; • import java.awt.*; • public class getImage extends Applet{ • Image image; • public void init() { • String url = "http://java.sun.com/images/v4_java_logo.gif";
try { • image = getImage(new URL(url)); • } catch(Exception e){} • } • public void paint(Graphics g) { • g.drawImage(image, 0, 0,this); • } • }
程序采用绝对URL,试图显示http://java.sun.com/images/v4_java_logo.gif,除非该Applet被放置在服务器java.sun.com上,否则是不能看到正确结果的。在Visual J++下使用WJView.exe调试时,可以在控制台看到如下信息: • com.ms.security.SecurityExceptionEx[Host]: cannot access "java.sun.com":80 atcom/ms/security/permissions/NetIOPermission.check (NetIOPermission.java)
该信息表明getImage方法无法访问java.sun.com,引发了安全性异常SecurityExceptionEx。如果使用JDK的appletviewer运行该程序,输出信息有所不同,getImage方法失败,image对象为null,Graphics类的drawImage方法无法正确绘制图像,从而引发异常。该信息表明getImage方法无法访问java.sun.com,引发了安全性异常SecurityExceptionEx。如果使用JDK的appletviewer运行该程序,输出信息有所不同,getImage方法失败,image对象为null,Graphics类的drawImage方法无法正确绘制图像,从而引发异常。
getImage方法在调用后立即返回,并不等待图像全部载入。因此有时会出现drawImage方法在图像没有载入之前就开始执行了,导致程序刚执行时图像不能正确显示。为解决这个问题,Java提供了MediaTracker类,用于跟踪图像及声音等媒体的载入。 • MediaTracker使用方法如下: • (1) 构造一个MediaTracker对象; • (2) 在下载图像(getImage)之后,使用addImage方法添加需要跟踪的图像; • (3) 在显示图像(drawIamge)之前,使用waitForAll方法跟踪图像状态。
例如,程序1的init方法可改为: • public void init() • { • try{ • image=getImage(getDocumentBase(),"test.gif"); • MediaTracker tracker = new MediaTracker(this); • //构造一MediaTracker对象 • tracker.addImage(image,0); //添加需要跟踪的图片
tracker.waitForAll(); • }catch(Exception e){} • } • init方法等待图像载入完毕后才返回,以确保paint方法被调用时图像已全部载入。 • MediaTracker类的构造函数为 • public MediaTracker(Component comp) • 即为给定组件创建一个跟踪媒体的MediaTracker对象。
下面是MediaTracker类的几种常用方法: • ● public void addImage(Image image, int id):将图像添加到被跟踪的图像组。参数image为需跟踪的图像,参数id为图像组指定标识。 • ● public boolean checkAll():检查所有图像是否下载完毕。 • ● public boolean checkAll(boolean load):检查所有图像是否下载完毕。参数load若为true,且图像尚未开始下载,则立即开始下载。
● public boolean checkID(int id)。 • ● public boolean checkID(int id,boolean load)。 • 以上两种方法用于检查指定id的图像是否完成下载,参数load的含义同checkAll方法。 • ● public Object[] getErrorsAny():返回出错的媒体组 。 • ● public Object[] getErrorsID(int id):返回带有给定标识号的出错的媒体组。 • ● public boolean isErrorAny():检查所有图像的错误状态 。
● public boolean isErrorID(int id):检查所有带有给定标识号的图像的错误状态。 • ● public void waitForAll() throws InterruptedException:开始下载所有的图像,直到下载完毕后返回。 • ● public boolean waitForAll(long ms) throws InterruptedException:开始下载所有的图像,直到下载完毕或参数ms指定的时间(毫秒数)到达后返回。
● public void waitForID(int id) throws InterruptedException。 • ● public boolean waitForID(int id,long ms) throws InterruptedException:等待载入指定标识的图像,参数ms的含义同waitForAll方法。 • ● public int statusAll(boolean load)。 • ● public int statusID(int id,boolean load)。
以上两种方法用于返回所有图像或指定id图像的载入状态,状态取值可以为:ABORTED(下载失败)、COMPLETE (下载成功)、ERRORED(下载时发生错误)、LOADING(正在下载)。参数load若为true,则表示如果图像尚未开始下载,立即启动下载过程。
3.从网络上获取声音 • 与获取图像类似,Java也提供了从Web服务器获取声音资源并播放的方法。Java 2以前的版本只能处理单声道8 kHz的采样频率的AU文件,Java 2增加了对AIFF,WAV以及三种MIDI文件类型的支持。可以利用Applet类的方法play直接播放网络上的声音文件,或使用getAudioClip方法先从网络上获取声音资源,生成AudioClip类型的对象,然后对该对象进行操作。
play方法有两种形式: • ● void play(URL url):使用绝对URL表示声音资源的访问路径。 • ● void play(URL url,String name):使用相对URL表示声音资源的访问路径。
类似地,getAudioClip方法也有两种形式: • ● AudioClip getAudioClip(URL url) • ● AudioClip getAudioClip(URL url,String name)