8 网络编程技术.docx
《8 网络编程技术.docx》由会员分享,可在线阅读,更多相关《8 网络编程技术.docx(40页珍藏版)》请在冰豆网上搜索。
8网络编程技术
第8章网络编程技术
8.1网络基础知识
1、什么是计算机网络
把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统,从而使众多的计算机可以方便地互相传递信息,共享硬件、软件、数据信息等资源。
2、计算机网络的主要功能
●资源共享
●信息传输与集中处理
●均衡负荷与分布处理
●综合信息服务(www/综合业务数字网络ISDN)
3、网络通信协议及接口
(1)什么是网络通信协议
计算机网络中实现通信必须有一些约定即通信协议,对速率、传输代码、代码结构、传输控制步骤、出错控制等制定标准。
(2)什么是网络通信接口
为了使两个结点之间能进行对话,必须在它们之间建立通信工具(即接口),使彼此之间能进行信息交换。
接口包括两部分:
●硬件装置:
实现结点之间的信息传送
●软件装置:
规定双方进行通信的约定协议
4、通信协议分层的思想
(1)为什么要分层
由于结点之间联系很复杂,在制定协议时,把复杂成份分解成一些简单的成份,再将它们复合起来。
最常用的复合方式是层次方式,即同层间可以通信、上一层可以调用下一层,而与再下一层不发生关系。
(2)通信协议的分层规定
把用户应用程序作为最高层,把物理通信线路作为最低层,将其间的协议处理分为若干层,规定每层处理的任务,也规定每层的接口标准。
(3)参考模型
(4)数据封装
(5)数据拆封
5、IP协议
IP(InternetProtocol)协议是网际层的主要协议,支持网间互连的数据报通信。
它提供主要功能有:
●无连接数据报传送
●数据报路由选择和差错控制
6、TCP协议和UDP协议
(1)TCP(transmissioncontrolprotocol)
是专门设计用于在不可靠的因特网上提供可靠的、端到端的字节流通信的协议。
它是一种面向连接的协议。
TCP连接是字节流而非报文流。
(2)UDP(userdataprotocol)
UDP向应用程序提供了一种发送封装的原始IP数据报的方法、并且发送时无需建立连接。
是一种不可靠的连接。
8.2基于Http协议的网络编程——URL类
1、URL及有关的术语
(1)什么是URL
在WWW上,每一信息资源都有统一的且唯一的地址,该地址就叫URL(UniformResourceLocator),它是WWW的统一资源定位标志。
URL由4部分组成:
资源类型、存放资源的主机域名、资源文件名和端口。
(2)与数据分布环境编程实现相关的几个术语
●URL地址:
它唯一地标识Internet环境下的某一文件的位置(如:
●URL类:
JDK中为编程访问远程主机文件所提供的类(包含在J包中)。
●URL对象:
将远程主机中的某一资源文件的URL地址转化为Java程序中的URL类对象,该对象即代表远程主机文件。
利用URL对象可以获取URL类对象的各个属性同时也可以利用URL对象可以读取指定*.HTML文件等内容。
2、URL类构造方法
URL类提供用于创建URL对象的构造方法:
●publicURL(Stringstr):
它是使用URL的字符串来创建URL对象。
●publicURL(Stringprotocol,Stringhost,Stringfile):
这个构造方法中指定了协议名“protocol”、主机名“host”、文件名“file”,端口使用缺省值。
●publicURL(Stringprotocol,Stringhost,Stringport,Stringfile):
这个构造方法与
(2)构造方法中多了一个端口号“port”。
●publicURL(URLcontent,Stringstr)方法:
这个构造方法是给出一个相对于content的路径偏移量。
3、URL类方法
URL类
功能说明
intgetPort()
获得端口号,如果端口没有设置,则返回-1
StringgetProtocol()
获得协议名,如果协议没有设置,则返回null
StringgetHost()
获得主机名,如果主机没有设置,则返回null
StringgetFile()
获得文件名,如果文件没有设置,则返回null
Booleanequals(Objectobj)
与指定的URL对象obj进行比较,如果相同返回true,否则返回false
FinalInputStreamOpenStream()
获得一个输入流。
若获取失败,则抛出一个java.io.Exception异常
StringtoString()
将此URL对象转换为字符串的形式
4、URL实例1
(1)URL类的编程步骤
●将远程文件的URL地址转化为Java程序中的URL类对象;
●调用URL类中的openStream()以打开远程文件(返回为二进制格式的InputStream类对象,逐个字节read()它,但对文本文件可以经过流格式转化为缓冲字符流格式BufferReader)。
●利用文件流类中的read()读取远程文件内容。
●关闭远程文件流。
(2)下面的代码说明URLAPI的基本使用方法
package.url;
import.MalformedURLException;
import.URL;
publicclassTestURL{
publicstaticvoidmain(String[]args){
try{
URLurl=newURL("http","",80,"/index.html");
System.out.println(url.toString());
//获得协议名
System.out.println("协议名:
"+url.getProtocol());
//获得主机名
System.out.println("主机名:
"+url.getHost());
//获得默认端口号
System.out.println("默认端口号:
"+url.getDefaultPort());
//获得端口号
System.out.println("端口号:
"+url.getPort());
//获得文件名(端口号后面的内容)
System.out.println("文件名:
"+url.getFile());
URLurl2=newURL("
System.out.println(url2.toString());
//获得路径(端口号后面?
前面的部分)
System.out.println("路径:
"+url2.getPath());
//获得查询字符串(?
后面的字符串)
System.out.println("查询字符串:
"+url2.getQuery());
}catch(MalformedURLExceptione){
e.printStackTrace();
}
}
}
运行的结果如下:
:
80/index.html
协议名:
http
主机名:
默认端口号:
80
端口号:
80
文件名:
/index.html
路径:
/index.html
查询字符串:
keyword=qq
(3)在应用程序中访问远程主机文件
import.*;
importjava.io.*;
publicclassURLReadFile{
publicstaticvoidmain(Stringargs[])throwsException{
URLmyURL=newURL("
InputStreamis=myURL.openStream();
InputStreamReaderisr=newInputStreamReader(is);
BufferedReaderin=newBufferedReader(isr);//流的格式变换
StringinputLine;
while((inputLine=in.readLine())!
=null){
System.out.println(inputLine);
}
in.close();
}
}
5、URL实例2
下面的示例说明如何利用URLAPI实现下载某个网站的网页文件——提供一个URL网页地址,然后将网页下载到工程下的test.html文件中。
(1)基本的思路
网页上的源代码都是字符,所以用字符流会比较便利。
输入流BufferedReader->InputStreamReader->url.openStream()
输出流BufferedWriter->FieWriter
(2)从URL中检索数据的主要API方法
●publicfinalInputStreamopenStream()throwsIOException
openStream()方法连接URL参考的资源,实现客户机和服务器之间所有必要的握手连接,并且从可读数据返回InputStream。
从InputStream得到的数据是URL参考文件的原始(即没有解析过的)内容。
●publicURLConnectionopenConnection()throwsIOException
openConnection()方法打开一个到指定URL的套接字并且返回一个URLConnection对象。
URLConnection代表一个到网络资源的开放连接。
●publicfinalObjectgetContent()throwsIOException
getContent()方法检索URL参考的数据,并且试图把它转换成对象的某个类型。
(3)实现的代码示例
package.url;
importjava.io.BufferedReader;
importjava.io.BufferedWriter;
importjava.io.File;
importjava.io.FileWriter;
importjava.io.IOException;
importjava.io.InputStreamReader;
import.MalformedURLException;
import.URL;
publicclassTestDownloadFile{
publicstaticvoidmain(String[]args){
StringurlPath="
downloadFile(urlPath);
}
/***下载网页,@paramurlPath网页地址*/
publicstaticvoiddownloadFile(StringurlPath){
BufferedReaderbufferedReader=null;
BufferedWriterbufferedWriter=null;
StringrootDownloadPath=System.getProperty("user.dir");
StringfileName="test.html";
try{
URLurl=newURL(urlPath);
bufferedReader=newBufferedReader(newInputStreamReader(url
.openStream()));
bufferedWriter=newBufferedWriter(newFileWriter(rootDownloadPath
+File.separator+fileName));
StringhtmlContent=null;
while((htmlContent=bufferedReader.readLine())!
=null){
bufferedWriter.write(htmlContent);
bufferedWriter.newLine();
}
bufferedWriter.flush();
System.out.println("下载完毕");
}catch(MalformedURLExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}finally{
try{
if(bufferedReader!
=null){
bufferedReader.close();
}
if(bufferedWriter!
=null){
bufferedWriter.close();
}
}catch(IOExceptione){
e.printStackTrace();
}
}
}
}
该程序的运行结果如右所示。
6、URLEncoder和URLDecoder类
(1).URLEncoder类包含一个叫encode()的单一静态方法:
publicstaticStringencode(Strings)
URLEncoder.encode()把任何非文字数字字符(除了空格、下划线、连字号、句点和星号)都转换位%序列,空格被转换为加号。
(2)URLEncoder类的主要用途
在于为使用GET的CGI程序的通信准备查询字符串,而URLDecoder类把所有的加号转换位空格,把所有的百分号转义符转换为相应的字符。
(3)decode方法
该方法的定义为:
publicstaticStringdecode(Strings)throwsException,如果字符串包含一个百分号,而其后没有两个十六进制的数字,那么就会触发一个IllegalArgumentException。
这个方法传递的是非转义字符,所以用户可以传递一个完整的URL。
8.3基于Http协议的网络编程——URLConnection类
1、URLConnection类的主要作用
使用URLConnect类不仅可以使用getInputStream()方法获得URL节点的信息,而且还可以采用getOutputSream()方法向URL节点处传输数据,这样在本机与URL节点处形成了一个数据流通道。
数据的输入和输出必须遵循HTTP协议中规定的格式,事实上,在建立URLConnection类的对象的同时就已经在本机和URL节点之上建立了一条HTTP通道。
2、URLConnection实例
package.url;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
import.URL;
import.URLConnection;
publicclassTestURLConnection{
publicstaticvoidmain(String[]args){
try{
StringurlName="";
//步骤1:
创建URL
URLurl=newURL(urlName);
URLConnectionconnection=url.openConnection();
//步骤2:
连接到服务器
connection.connect();
//步骤3:
打印头信息
intn=1;
Stringkey;
System.out.println("----头信息------");
while((key=connection.getHeaderFieldKey(n))!
=null){
Stringvalue=connection.getHeaderField(n);
System.out.println(key+":
"+value);
n++;
}
//步骤4:
得到输入流
System.out.println("----消息体------");
BufferedReaderin=newBufferedReader(newInputStreamReader(
connection.getInputStream()));
//步骤5:
从输入流中读出消息体,只读10行
Stringline=null;
n=1;
while((line=in.readLine())!
=null&&n<=10){
System.out.println(line);
n++;
}
if(line!
=null)
System.out.println("...");
System.out.println("---------------");
//API提供方法访问常用头信息
System.out.println("getContentType:
"+connection.getContentType());
System.out.println("getContentLength:
"+connection.getContentLength());
System.out.println("getContentEncoding:
"+connection.getContentEncoding());
System.out.println("getDate:
"+connection.getDate());
System.out.println("getExpiration:
"+connection.getExpiration());
System.out.println("getLastModifed:
"+connection.getLastModified());
}catch(IOExceptionexception){
exception.printStackTrace();
}
}
}
该程序的运行结果如下:
----头信息------
Server:
Sun-Java-System-Web-Server/7.0
Date:
Mon,23Feb200908:
56:
00GMT
Content-type:
text/html;charset=ISO-8859-1
Set-cookie:
JSESSIONID=00D44A0A6AAE1630E26D36BF9AEFACF5;Path=/
Transfer-encoding:
chunked
----消息体------
DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http:
//www.w3.org/TR/html4/loose.dtd">
DeveloperResourcesforJavaTechnology