JAVA讲义第9章.docx
- 文档编号:6617291
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:23
- 大小:90.75KB
JAVA讲义第9章.docx
《JAVA讲义第9章.docx》由会员分享,可在线阅读,更多相关《JAVA讲义第9章.docx(23页珍藏版)》请在冰豆网上搜索。
JAVA讲义第9章
第9章网络编程技术
9.1网络技术基础
Java语言能够风靡全球的重要原因之一就是和网络的紧密结合。
这不仅体现在用Java可以很方便地在网络的主页中嵌入Applet,还体现在Java专门为网络通信提供的软件包。
软件包为当前最常用的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协议只能将数据发送到主机,而UDP可以将数据发送到一台主机的多个应用程序。
IP协议为网络上每台计算机定义了一个惟一的标识,称为IP地址。
一个IP地址是一个32位的整数。
根据IP地址,传送的信息就可以通过路由找到目标计算机。
TCP和UDP都提供了端口的概念。
端口(Port)和IP地址一起为网络通信的应用程序之间提供了一种确切的地址标识作用,IP地址标识了发送数据的目的计算机,而端口标识了将数据包发送给目的计算机上的具体应用程序上,其工作原理如图9.2所示。
端口号的范围从0到65535,1024以下的端口号由系统使用。
来自网络的数据包
图9.2端口与IP地址的标识作用
9.2使用URL类
J提供了利用URL实现服务器访问的类,在此基础上,可以实现客户端和服务器端的通信,并可以实现多客户的通信。
9.2.1URL的基本概念
【引例】在Internet网络上欲查找美国微软公司的信息资源,需要在浏览器中输入如下格式的字符序列:
于是微软公司的主页信息就会出现在个人计算机屏幕上。
那么这些字符序列代表什么含义,遵循了什么原则呢?
实际上它使用了URL的基本概念。
URL又称为统一资源定位器(UniformResourceLocator)。
IP地址定位了在互联网上的一台计算机,端口定义了在这台计算机上提供的服务,而URL提供了网上资源的一个指针。
该资源可以是一个简单的文件,或者一个目录,也可以是一个复杂的对象。
通过URL,可以访问Internet服务器,浏览器通过解析给定的URL可以在网络上查找相应的文件和网络资源。
一般地,一个URL的语法格式如下:
<应用协议>:
//<主机名[:
端口号]>[/<文件或目录名>][#<锚链指针>]
应用协议:
指与某个服务相关的协议。
例如,http,ftp,telnet等。
主机名:
可以是某台计算机的主机域名或IP地址。
例如,引例中的是一个主机域名,而207.46.197.101则是该主机的IP地址。
端口号:
指出与服务相关的端口号,可以省略。
如果需要,则在端口号前要加“:
”。
例如,引例中的“:
80”就是指定的端口号。
文件或目录名:
可以是以html(或htm)为后缀的文件名,也可以是目录名。
例如,引例中的ms.htm。
锚链指针:
指出文件中的某个起始入口点,可以省略。
如果需要,则在锚链指针前要加“#”。
例如:
,ftp:
//,telnet:
//都是URL常用的地址形式。
9.2.2URL类
【引例】利用URL类读取网络资源的程序示例如下。
importjava.io.*;
import.*;
publicclassgetURL
{
publicstaticvoidmain(String[]args)throwsException
{
//创建一个URL对象
URLmyURL=newURL("http:
//www.:
80/index.html#ach1");
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地址http:
//www.:
80/index.html#ach1中的协议名称、主机名、文件名、端口号及锚链指针,它是通过URL类来完成的。
引例中import.*是Java语言进行网络编程时必须引用的程序包,本节中所涉及的类大都在该程序包中。
Java语言提供的.URL类,目的是利用URL进行网络编程。
URL类给程序员提供了一个强大的工具来编写一个客户应用程序,以便从Internet上获取各种信息。
1.构造方法
URL类提供了几个构造方法,以便创建URL对象,其目的就是为了在Internet/Intranet上确定资源的位置,这也是操作这些资源的前提,引例中的newURL("http:
//www.:
80/index.html#ach1")就是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("http:
//www.
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对象的锚链指针。
(6)publicURLConnectionopenConnection()throwsjava.io.IOException
功能:
得到一个URLConnection对象实例,它代表了与远程对象的连接。
(7)publicfinalInputStreamopenStream()throwsjava.io.IOException
功能:
打开与URL的一个连接,返回一个从该连接读到的InputStream对象实例。
(8)publicfinalObjectgetContent()throwsjava.io.IOException
功能:
得到URL的内容。
【9.1】使用URL类的简单程序实例。
importjava.io.*;
import.*;
publicclassgetURL
{
publicstaticvoidmain(String[]args)throwsException
{
//创建URL对象
URLmyURL=newURL("http:
//www.:
80/ttt.html#aaa");
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=http
host=
filename=/ttt.html
port=80
ref=aaa
【9.2】使用URL类直接读取信息的示例。
import.*;
importjava.io.*;
publicclassmyURLRead
{
publicstaticvoidmain(String[]args)throwsException
{
URLmyPage=newURL("//创建URL对象
//打开myPage的连接,建立相关的缓冲输入流。
BufferedReaderinBuf=newBufferedReader(newInputStreamReader(
myPage.openStream()));
StringinputLine;
inputLine=inBuf.readLine();//读取一行数据
while(inputLine!
=null)//数据未读完
{
System.out.println(inputLine);//输出一行数据
inputLine=inBuf.readLine();//继续读一行数据
}
inBuf.close();//关闭缓冲输入流
}
}
需要注意的是,为了得到正确的结果,在运行本章的一些程序之前,必须确保程序所在的计算机已与Internet网正确连接。
上例程序中的主机是假设的,如果将主机名改为,那么,程序运行结果如图9.3所示。
本程序具体思路如下:
首先创建一个URL对象,然后调用方法openStream读取网络信息的字节位。
为了提高它的灵活性,将该方法加入类BufferedReader创建的inBuf对象中,这样就可以通过类BufferedReader的readLine方法一次读取一行数据,直到文件空。
最后关闭inBuf对象,以释放系统资源。
图9.3例9.2程序运行结果
9.2.3URLConnection类
【引例】利用URLConnection类读取网络资源的程序示例如下。
import.*;
importjava.io.*;
publicclassmyURLConnectionRead
{
publicstaticvoidmain(String[]args)throwsException
{
URLmyPage=newURL("//创建URL对象
URLConnectioncon=myPage.openConnection();//创建URLConnection对象
System.out.println(con.getURL());//获得指定URL的域名
System.out.println(con.getContentLength());//获得信息长度
System.out.println(con.getContentType());//获得资源类型
System.out.println(con.getContentEncoding());//获得信息码
System.out.println(con.getExpiration());//获得终止日期
System.out.println(con.getDate());//获得信息发送日期
System.out.println(con.getLastModified());//获得信息修改的最后日期
}
}
该引例的功能:
得到指定URL资源的域名、信息长度、资源类型、信息编码、信息终止日期、信息发送日期、信息修改的最后日期,它是通过URLConnection类来完成的。
Java语言提供了两种方法读取数据,一种是通过URL对象直接得到相关的网络信息,如例9.2所示;另一种是先得到一个URLConnection实例,再得到InputStream或InputStream对象,然后读取数据。
前者是一种简单、直接的方法,但缺乏灵活性,并且只能读取只读信息,后者提供了更加灵活有效的方法来读取网络资源。
URLConnection类是一个抽象类,是实现应用程序和URL之间通信连接的所有类的超类,该类的实例可以用来读写URL所指的资源。
在创建了URL对象之后,可以使用URL对象的openConnection()方法来创建URLConnection对象实例,然后就可以使用下面的方法完成各种各样的操作。
1.获取网络信息的方法
获取网络资源信息的方法如表9-1所示。
表9-1URLConnection类获取信息的常用的方法
方法
说明
abstractpublicvoidConnect()
打开与URL所指定资源的一个通信连接,如果调用该方法时连接已经打开,则忽略该调用。
publicURLgetURL()
获得URLConnection对象实例的URL域名。
publicintgetContentLength()
获得信息长度。
publicStringgetContentType()
获得资源类型。
publicStringgetContentEncoding()
获得信息的编码。
publiclonggetExpiration()
获得信息终止日期。
publiclonggetDate()
获得信息发送日期。
publiclonggetLastModified()
获得信息修改的最后日期。
publicStringgetHeaderField(Stringname)
获得给定索引的标题字段。
publicObjectgetContent()
获得连接的资源内容。
publicInputStreamgetInputStream()
获得一个InputStream类实例。
publicOutputStreamgetOutputStream()
获得一个OutputStream类实例。
2.设置或获得相应的参数值的方法
为了获取网络资源信息,常常需要设置或获得相应的参数。
URLConnection类设置或获得相应参数值的方法如表9-2所示。
表9-2URLConnection类设置或获得参数的常用方法
方法
说明
publicvoidsetDoInput(Booleandoinput)
设置URLConnection.DoInput的值。
publicBooleangetDoInput()
获得URLConnection.DoInput的值。
publicvoidsetDoOutput(Booleandooutput)
设置URLConnection.DoOutput的值。
publicBooleangetDoOutput()
获得URLConnection.DoOutput的值。
publicvoidsetAllowUserInteraction(Booleanallowuserinteraction)
设置URLConnection.AllowUserInteraction的值。
publicBooleangetAllowUserInteraction()
获得URLConnection.AllowUserInteraction的值。
publicvoidsetUseCaches(Booleanusecaches)
设置URLConnection.UseCaches的值。
publicbooleangetUseCaches()
获得URLConnection.UseCaches的值。
publicvoidsetIfModifiedSince(longinmodifiedsince)
设置URLConnection.IfModifiedSince的值。
publiclonggetIfModifiedSince()
获得URLConnection.IfModifiedSince的值。
publicvoidsetRequestProperty(Stringkey,Stringvalue)
设置URLConnection.RequestProperty的值,key为关键字,value为与key相对应的值。
publicStringgetRequestProperty(Stringkey)
获得URLConnection.RequestProperty的值。
需要说明的是,如果使用某些设置方法(如setDoOutput、setUseCaches等)设置各种参数时,必须在URLConnection对象创建之后和连接之前进行。
9.2.4应用实例
【9.3】利用URLConnection读取数据的示例。
import.*;
importjava.io.*;
publicclassmyURLConnectionRead
{
publicstaticvoidmain(String[]args)throwsException
{
URLmyPage=newURL("//创建URL对象实例
URLConnectioncon=myPage.openConnection();//创建URLConnection实例con
InputStreamis=con.getInputStream();//建立一个输入流is
/*建立缓冲输入流*/
BufferedReaderinBuf=newBufferedReader(newInputStreamReader(is));
StringinputLine;
/*读取数据,直到文件空*/
while((inputLine=inBuf.readLine())!
=null)
System.out.println(inputLine);
inBuf.close();//关闭缓冲输入流
}
}
上例程序运行后,与例9.2有相同的功能。
但是它不是通过直接从URL对象中读取资源信息,而是创建一个URLConnection类的对象con,通过con来读取资源信息。
程序的具体思路如下:
首先创建一个URL对象,然后调用方法openConnection创建URLConnection类的一个实例con,接着调用URLConnection类的方法getInputStream建立输入流is,通过is对网络资源进行各种操作。
请读者留意本例与例9.2的区别。
【9.4】从Internet/Intranet下载HTML文件的示例。
import.*;
importjava.io.*;
importjava.util.*;
publicclassUnloadHTML
{
publicstaticvoidmain(String[]args)throwsException
{
try{
String
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 讲义