网络典型例题Java提供了两个不同层次的网络支持机制:利用URL访问网络资源利用Socket通信一、统一资源定位符URL类1、URL用来网络资源定位,它的值由5部分组成,格式如下所示传输协议://主机名:端口号/文件名#引用其中传输协议(protocol)指明获取资源所使用的传输协议,如http、ftp、file等。http表示通过HTTP访问网络资源。ftp表示通过网络协议FTP访问网络资源。file表示本机上文件,是所指定的资源。news表示通过NNTP访问指定新闻地址的资源。主机名(hostname)指定资源所在的计算机,可以是IP地址,如127.0.0.1,也可以是主机名或域名,如。一个计算机中可能有多种服务(应用程序),端口号(port)用来区分不同的网络服务,如http服务的默认端口号是80,ftp服务的默认端口号是21等。理论上有0-65535个端口,其中1024号以下端口一般都给定了用途,例如HTTP使用80端口;FTP默认21端口;Telnet使用23端口。平常我们使用1024号以上端口。文件名(filename)包括该文件的完整路径。在http协议中,缺省的文件名是index.html,因此,。引用(reference)为资源内的某个引用,用来定位显示文件内容的位置,如。但并非所有的URL都包含这些元素。对于多数的协议,主机名和文件名是必需的,但端口号和文件内部的引用则是可选的。2、URL类位于java.net包中,是指向互联网资源的指针,使用URL可以通过给定的URL地址访问到需要的资源。资源可以是简单的文件和目录,也可以是对象的引用、对数据库或搜索引擎的查询。URL类的对象代表一个URL地址。URL对象的创建示例:其构造方法:1)通过指定的URL字符串创建URL对象URLgamelan=newURL();2)通过指定的协议、主机地址、路径字符串创建URL对象URLgamelan=newURL(http,);3)通过指定的协议、主机地址、端口号、路径字符串创建URL对象URLgamelan=newURL(http,);上两种方法将一个URL地址分解,按不同部分分别指定协议、主机、端口、文件。4)通过指定的上下文中对指定的协议的解析创建对象:URL(URLcontext,Stringspec)这种方法基于一个已有的URL对象创建一个新的URL对象,多用于访问同一个主机上不同路径的文件,例如:URLu1=newURL(u,”tutorial.intro.html”);创建URL后,可以对其操作:publicintgetDefaultItPort();获取与此URL关联的默认端口号publicStringgetFile();获取此URL的文件名publicStringgetHost();获取此URL的主机名publicStringgetPath();获取此URL的路径部分publicintgetPort();获取此URL的端口号publicStringgetProtocol();获取此URL的协议名称publicStringgetQuery();获取此URL的查询部分publicInputStreamopenStream();打开到此URL的连接并返回一个用于从该连接读入的InputStream。3、URLConnection抽象类该抽象类代表应用程序和URL之间的通信链接。创建一个到URL的连接步骤:1)对影响到远程资源连接的参数操作,通过在URL上调用openConnection方法创建连接对象。2)除了设置参数和一般请求属性。3)使用connect方法建立到远程对象的实际连接,与资源交互;查询头字段和内容。4)远程对象变为可用。远程对象的头字段和内容变为可访问。建立到远程对象的连接后,可以使用以下方法对头字段和内容进行访问。publicObjectgetContent()throwsIOException;获取此URL链接的内容publicStringgetHeaderField(intn);获取指定头字段的值publicInputStreamgetInputStream()throwsIOException;获取输入流,如果读超时,会抛出SockeTimeoutException。publicOutputStreamgetOutputStream()throwsIOException;获取输出流publicStringgetContentEncoding();获取content-encoding的值publicintgetContentLength();获取content-length的值publicStringgetContentType();获取content-type的值publiclonggetDate();获取date的值publiclonggetLastModified();获取last-modified的值,结果为距离格林威治标准时间的毫秒数。以下是测试一例。importjava.io.*;importjava.net.*;importjava.util.*;//写URL的测试类,获取网站的信息,并将网站主页下载到本地磁盘上publicclassURLTest{//主方法publicstaticvoidmain(String[]args){try{//定义urlName的字符串,如果args数组长度大于0,则将args[0]的值赋给urlNameStringurlName=(args.length0){urlName=args[0];}URLurl=newURL(urlName);//创建URL对象System.out.println(打印url的一些信息:);System.out.println(getProtocol:+url.getProtocol());//获取协议名称System.out.println(getthost:+url.getHost());//获取主机名称System.out.println(gettfile:+url.getFile());//获取此URL的文件名System.out.println(getPath:+url.getPath());//获取路径System.out.println(getPort:+url.getPort());//获取端口号,未设置返回-1System.out.println(getDefaultPort:+url.getDefaultPort());//返回默认端口号URLConnectionconnection=url.openConnection();//打开远程对象的连接,返回连接值connection.connect();//连接到服务器,打开此URL引用的资源的通信链接//获取并打印头字段的值System.out.println(打印头字段信息:);intn=1;Stringkey;while((key=connection.getHeaderFieldKey(n))!=null){Stringvalue=connection.getHeaderField(n);//返回第n个头字段的值System.out.println(key+:+value);//打印头字段的键、值n++;}//打印引用资源的一些属性System.out.println(打印引用资源的一些属性);System.out.println(getContentType:+connection.getContentType());//返回引用资源的内容类型System.out.println(getContentLength:+connection.getContentLength());//返回引用资源的内容长度System.out.println(getContentEncoding:+connection.getContentEncoding());//返回引用资源的内容编码//返回引用资源的发送日期,为距离格林威治标准时间1970年1月1日的毫秒数。System.out.println(getDate:+connection.getDate());//返回引用资源上次的修改日期,若未知返回0System.out.println(getLastModifed:+connection.getLastModified());//下载引用文件到本地磁盘,读取文件BufferedReaderin=newBufferedReader(newInputStreamReader(connection.getInputStream()));////打印输出源文件前10行//Stringline;//n=1;//while((line=in.readLine())!=null&&n=10)//{//读出文件并输出//System.out.println(line);//n++;//}//if(line!=null)//System.out.println(......);//创建输出流,并指定目标文件BufferedWriterbw=newBufferedWriter(newFileWriter(e://URLTest.html));//对输出流做进一步进行封装PrintWriterpw=newPrintWriter(bw);//声明临时字符串引用Stringtemps=null;//从输入流中获取资源并测试是否读取完毕while((temps=in.readLine())!=null){//将获取的数据写如目标文件pw.println(temps);}//打印提示信息System.out.println(您好,网站主页已经下载完毕,已经写入了URLTest.html);pw.close();//关闭输出流in.close();//关闭输入流}catch(IOExceptionexception){exception.printStackTrace();}}}二、Socket编程传统的C/S模式的网络程序主要通过服务器端和客户端的网络连接来实现数据传输。服务器端和客户端的网络连接主要是TCPSocket连接。在java.net包中提供了Socket和ServerSocket类来实现连接。在Socket编程中发送方和接收方的两个Socket之间必须先连接,再才能在TCP协议的基础上进行通信。服务器的任务就是等候建立一个连接,然后用那个连接产生的Socket创建一个InputStream以及一个OutputStream。之后,从InputStream读入的所有东西都会反馈给OutputStream,直到接收到行中止(END)为止,最后关闭连接。客户机连接与服务器的连接,然后创建一个OutputStream。文本行通过OutputStream发送。客户机也会创建一个InputStream,用它收听服务器说些什么。服务器与客户机(程序)都使用同样的端口号,而且客户机利用本地主机地址连接位于同一台机器中的服务器(程序),所以不必在一个物理性的网络里完成测试。注意,ServerSocket只要一个端口编号,不需要IP地址(因为它就在这台机器上运行)。调用accept()时,方法暂时陷入停顿状态,直到某个客户尝试同它建