补充课件10171章网络通信_第1页
补充课件10171章网络通信_第2页
补充课件10171章网络通信_第3页
补充课件10171章网络通信_第4页
补充课件10171章网络通信_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

|海有|壁无|抬起头做人,埋下头做事。|纳容|立欲|岂能事事如意,但求无愧于心。|百乃|千则|人不可有傲气,但不可无傲骨。|川大|仞刚|把微笑留给世界,让世界因你微笑!Java网络编程本章学习目标:理解计算机网络编程的概念,掌握如何使用Java在一台或多台计算机之间进行基于TCP/IP协议的网络通讯。在网络上,计算机通过IP(InternetProtocol,网际协议,也称为互联网协议)地址标识,使得位于不同地理位置的计算机有可能互相访问和通信。每台计算机都可以存放一定数量的资源,并通过网络共享。现在网络上的资源非常丰富。统一资源定位地址/器(UniformResourceLocator,URL)可以指向网络上的各种资源。通过统一资源定位地址(URL)可以获取网络上的资源。在网络上进行通信通常要遵循一定的规则,这些规则常常称为协议。常用的网络通信协议有TCP(传输控制协议〉、UDP(UserDatagramProtocol,用户数据报协议)和SSL(SecureSocketsLayer,安全套接层)安全网络通信协议等。10.1使用URL访问网络资源网络上的资源非常丰富。学校、公司或行政部门等各个单位都可以通过网络发布消息。在网络上还有各种各样的软件、电子书籍和歌曲等。这些网络资源都可以通过统一资源定位器定位。

URL(UniformResourceLocator)是一致资源定位器的简称,它表示Internet上某一资源的地址。通过URL我们可以访问Internet上的各种网络资源,比如最常见的WWW,FTP站点。浏览器通过解析给定的URL可以在网络上查找相应的文件或其他资源。在获取各种网络资源之前一般需要知道网络资源所在的网络地址。

(1)网络地址在网络上,计算机是通过网络地址标识的。网络地址:通常有两种表示方法。第一种表示方法通常采用4个整数组成。例如:166.111.4.100是清华大学主页网站服务器的网络地址。另外一种方法是通过域名表示网络地址。例如:

是清华大学主页网站的域名。该域名与"00"表示的是同一个网络地址。如果在网页浏览器(如IE或Netscape)的地址栏中输入域名"’’或输入"00",则打开的是同一个网页,即清华大学的主页。在网络程序中,可以用类.InetAddress的实例对象来记录网络地址,并获取­些相关的信息。因为类.InetAddress的构造方法的访问属性是默认模式,所以通常不能通过类.InetAddress的构造方法来创建其实例对象。要创建InetAddress的实例对象,可以通过它的成员方法。类.InetAddress的成员方法publicstaticInetAddressgetLocalHost()throwsUnknownHostException创建本地计算机所对应的类.InetAddress的实例对象,本地计算机的网络地址:可以表示成""或"localhost"。类.InetAddress的成员方法publicstaticInetAddressgetByAddress(byte[]addr)throwsUnknownHostException创建类.InetAddress的实例对象,其中,参数addr指定它所对应的网络地址。例如:当方法参数addr为包含166、111、4和100这4字节的数组时,该成员方法所创建的实例对象网络地址为"00"。在IPv4(InternetProtocolVersion4,第4版网际协议)中,网络地址由4字节组成:在IPv6(InternetProtocolVersion6,第6版网际协议)中网络地址由16字节组成。目前使用的网际协议一般采用4字节。类.InetAddress的成员方法publicstaticInetAddressgetByName(Stringhost)throwsUnknownHostException创建类.InetAddress的实例对象,其中,字符串参数host指定它所对应的网络地址,例如:"00"或""。程序:网络地址程序,J_InetAddress.java。

//J_InetAddress.javaimport.InetAddress;import.UnknownHostException;publicclassJ_InetAddress{publicstaticvoidmain(Stringargs[]){Strings="";InetAddressts=null;try{ts=InetAddress.getByName(s);}catch(UnknownHostExceptione){System.err.println("发生异常:"+e);e.printStackTrace();}//try-catch结构结束

if(ts!=null){System.out.println("清华大学的网络地址是:"+ts.getHostAddress());System.out.println("清华大学网站的主机名是:"+ts.getHostName());}elseSystem.out.println("无法访问网络地址:"+s);}//方法main结束}//类J_InetAddress结束(2)统一资源定位器(URL)与URL类统一资源定位器(UniformResourceLocator,URL),也称作网络资源定位器或统一资源定位地址,它一般指向网络上的资源。网络资源不仅可以包括网络上各种简单对象,例如,网络上的路径和文件等,还可以是一些复杂的对象,如数据库或搜索引擎(searchengine)。统一资源定位地址(URL)通常是由若干个部分组成,其中,常用的有协议(Protocol)、主机(Host)、端口号(Port)、文件(File)和引用(Reference)等。协议:(Protocol)指的是获取网络资源的网络传输协议。例如,HTTP(HypertextTransferProtocol,超文本传输协议)是在网络上进行超文本数据传输的一种协议,FTP(FileTransferProtocol,文件传输协议〉是在网络上进行文件传输的协议。这两种协议都是常用的网络协议。主机:(Host)指的是网络资源所在的主机。它可以用网络地址表示(例如,“00”或者“”)。端口号:指的是与主机进行通信的端口号。端口号是一个整数,通常范围在0"'-'65535之间(即16位二进制整数)。小于1024的端口号一般是分配给特定的服务协议(例如:TELNET(远程登录)、SMTP(SimpleMailTransferProtocol,简单邮件传输协议〉、HTTP或FTP等等)。如果没有注明端口号,则统一资源定位地址(URL)将使用默认的端口号。

文件:(File)指的是广义的文件,即除了可以是普通的文件之外,还可以是路径。

引用:(Reference)是指向文件内部的某一节的指针,其所对应的英文单词常用的还有section和anchor。这几个部分在统一资源定位地址(URL)中的书写格式及排列顺序通常为:协议://主机:端口号/文件#引用例如:

的网络协议为http,主机是,端口号为8080,文件为/demoweb/urlprimer.html,引用为INSTALL。下面给出统一资源定位地址(URL)的其他示例:

在网络程序设计中,统一资源定位地址(URL)对应类.URL.(4)URL类的声明publicfinalclassURLimplementsjava.io.Serializable{publicURL(Stringspec)throwsMalformedURLException//参数指定一个包含协议、主机名、端口号、文件名的完成URL地址

publicURL(Stringprotocol,Stringhost,Stringfile)throwsMalformedURLException//协议名、主机名、文件名

publicURL(Stringprotocol,Stringhost,Stingport,Stringfile)throwsMalformedURLException//协议名、主机名、端口号、文件名

publicStringgetProtocol()//返回在该URL中记录的协议名称

publicStringgetHost()//返回在该URL中记录的主机名

publicStringtoString()//返回完整URL地址字符串

publicintgetDefaultPort()//返回在该URL中记录的默认端口号

publicintgetPort()//返回在该URL中记录的端口号

publicStringgetFile()//返回在该URL中记录的文件名publicStringgetRef()//返回在该URL中记录的引用}程序:统一资源定位器程序。最后执行的结果是在控制台窗口中输出如下的信息:在URL:)当中:协议是http,主机名,文件名是Ichn/index.htm端口号是-1引用是null(5)获得URL对象属性//J_Url.javaimport.URL;import.MalformedURLException;publicclassJ_Url{publicstaticvoidmain(Stringargs[]){try{URLu=newURL("");System.out.println("在URL("+u+")当中:");System.out.println("协议是"+u.getProtocol());System.out.println("主机名是"+u.getHost());System.out.println("文件名是"+u.getFile());System.out.println("端口号是"+u.getPort());System.out.println("引用是"+u.getRef());}catch(MalformedURLExceptione){System.err.println("发生异常:"+e);e.printStackTrace();}//try-catch结构结束

}//方法main结束}//类J_Url结束(6)使用流获得URL资源内容统一资源定位地址(URL)指向在网络上的资源。通过类.URL的成员方法publicfinalInputStreamopenStream()throwsIOException可以将类URL的实例对象与它所指向的资源建立起关联,从而可以将该网络资源当作一种特殊的数据流。这样可以利用处理数据流的方法获取该网络资源。常用的读取网络资源数据的步骤如下:(1)创建类URL的实例对象,使其指向给定的网络资源:(2)通过类URL的成员方法openStream建立起URL连接,用,以便读取数据:(3)可选步骤,通过java.io.BufferedInputStream或java.io.BufferedReader封装输入流;(4)读取数据,并进行数据处理:(5)关闭数据流。其中,步骤(3)是可选步骤(即不是必要的步骤)。当网络不稳定或速度很慢时,通过步骤(3)可以提高获取网络资源数据的速度。程序:通过统一资源定位器获取网络资源。//J_UrlReadData.javaimportjava.io.BufferedReader;importjava.io.InputStreamReader;import.URL;publicclassJ_UrlReadData{publicstaticvoidmain(Stringargs[]){try{URLu=newURL("");BufferedReaderr=newBufferedReader(newInputStreamReader(u.openStream()));Strings;while((s=r.readLine())!=null)//获取网络资源信息

System.out.println(s);//输出网络资源信息

r.close();}catch(Exceptione){System.err.println("发生异常:"+e);e.printStackTrace();}//try-catch结构结束

}//方法main结束}//类J_UrlReadData结束当得到一个URL对象后,就可以通过它读取指定的WWW资源。这时将使用URL的方法openStream(),其定义为:InputStreamopenStream();方法openStream()与指定的URL建立连接,并返回InputStream类的对象以从这一连接中读取数据。Java.io.InputStreamReader的构造方法:publicInputStreamReader(InputStreamin)//将字节流in封装成实例对象publicBufferReader(Readerin)//实例化对象publicStringreadLine()throwsIOException//读取网络资源的数据。(7)URLConnection类一个字符串可以用于指定一个文件名,创建一个File对象表示一个文件,通过该File对象可以获得指定文件的各种属性。与此类似,一个URL地址表示在Internet上的一个文件名,那么,如何表示这个文件名对应的文件对象?如何获得文件对象的各种属性?Java提供.URLConnection类表示在Internet上的文件,URLConnection类只支HTTP协议。URLConnection类的一个对象表示Internet上的一个文件,文件名由URL地址指定,通过该文件对象可以获得指定文件的各种属性,而读取文件内容的操作仍然由流实现。URLConnection类声明publicabstractclassURLConnection{publicURLgetURL()//返回当前连接的URL对象

publicintgetContentLength()//返回资源文件的长度

publicStringgetContentType()//返回资源文件的类型

publiclonggetLastModified()//返回资源文件的最后修改日期}使用URL类的openConnection()方法创建一个URLConnection对象PublicURLConnectionopenConnection()throwsjava.io.IOException2.使用URL类的openConnection()方法创建一个URLConnection对象URLConnection类没有构造方法,创建一个URLConnection对象的操作由URL类的openConnection()方法实现。openConnection()方法声明如下:publicURLConnectionopenConnection()throwsjava.io.IOException10.2Socket通信10.2.1Socket通信原理10.2.2Java的Socket通信实现10.2.1Socket通信原理1.IP协议TCP/IP协议中网络互连层负责将数据报独立地从信源传送到信宿,解决路由选择、阻塞控制和网络互连等问题。网络互连层是TCP/IP体系结构的核心,核心协议是IP协议。IP协议提供主机间的逻辑通信。IP提供的是"尽力而为"的服务模型,即将"尽力而为"地在主机间传送段,但不做任何承诺,即网络层不保证段的交付与否、不保证段交付的时间、不保证段中数据的完整性。因此,IP服务被称为"不可靠"的服务。2.传输层协议

TCP/IP协议中传输层负责在源主机和目的主机的应用程序间提供端-端的数据传输服务,传输层协议最基本的任务就是延伸IP服务,将IP提供的在两个主机之间传递数据的服务,延伸到各主机上运行的诸多进程之间。传输层有两个协议:UDP(用户数据报协议)和TCP(传输控制协议)协议。UDP是一个无连接的协议,完成进程间通信和错误校验两项功能,提供的也是不可靠的服务;TCP是一个面向连接的协议,提供可靠的服务。3.TCP协议

TCP是在传输层定义的一个可靠的面向连接的协议。通过流控、顺序编码、应答和计时器,TCP保证将数据按序、正确地从某个主机中的一个进程传递到另一台主机的一个进程。TCP将IP所提供的主机间不可靠传递服务转换成为进程间的可靠数据传输服务。(1)通过端口指定服务一个IP地址能够唯一确定Internet中的一台主机,而一台服务器可以提供多种网络服务,即一台服务器上可以同时运行多个网络应用程序。那么,对于客户端而言,如何区别在一台服务器上运行的多个网络应用程序呢?或者说,客户端如何指定服务器所提供的服务?解决办法是,服务器为每一种网络服务约定一个端口,不同的端口提供不同的服务;客户端通过端口指定需要的服务。例如,约定端口80提供Web服务,客户端在浏览器输入的URL地址中默认端口号是80。一个端口约定一种网络服务,实际指定的是运行提供该服务的网络应用程序的一个进程。但是,如果同一台主机在同一个时刻运行相同应用程序的两个以上进程,那么该应用程序的端口号则无法在这些进程中进一步确定到底是哪个进程。(2)TCP连接TCP在一个不可靠的互连网络中为应用程序提供可靠的端点间的字节流服务。所有TCP连接都是全双工和点对点的。全双工是指数据可在连接的两个方向上同时传输,点对点意味着每条TCP连接只有两个端点,因而TCP不支持广播和组播的功能,TCP连接中传输的是字节流。一条"TCP连接"连接的两端是Internet上分别在两台主机中运行的两个进程,一个是发送进程,一个是接收进程,每个进程需要用一个IP地址加一个端口号唯一确定。所以,一条TCP连接包含一个源端口号和一个宿端口号,分别用来识别发送进程和接收进程。一个端口号和它所在的主机的IP地址构成一个48位的套接口(Socket),用来确定一个通信的端点,一对套接口就可以在互联网络中唯一标识一条TCP连接。1.Socket通讯网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。在传统的UNIX环境下,可以操作TCP/IP协议的接口不止Socket一个,Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的。在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。Socket编程是低层次网络编程并不等于它功能不强大,恰恰相反,正因为层次低,Socket编程比基于URL的网络编程提供了更强大的功能和更灵活的控制,但是却要更复杂一些。10.2.2Java的Socket通信实现1.Java的Socket通信流程Socket通信流程说明如下:·服务端创建一个ServerSocket对象,指定端口号。

.ServerSocket对象等候客户端的连接请求。

·服务端接收到客户端的连接请求,建立一条TCP连接,再创建一个Socket对象与客户端的Socket对象进行通信。·服务端和客户端分别建立字节输入/输出流,进行数据传输准备。·服务端和客户端通过各自的字节输入流获得对方发来的数据,通过字节输出流向对方发送数据。

·一方决定结束通信,向对方发送结束信息,另一方接收到结束信息后,双方分别关闭各自的TCP连接。ServerSocket对象停止等候客户端的连接请求。2.创建Socketjava在包中提供了两个类Socket和ServerSocket,分别用来表示双向连接的客户端和服务端。构造方法如下:

Socket(InetAddressaddress,intport);

Socket(Stringhost,intprot);

ServerSocket(intport);其中address、host和port分别是双向连接中另一方的IP地址、主机名和端口号。例如:

Socketclient=newSocket("127.0.01.",80);

ServerSocketserver=newServerSocket(80);注意,在选择端口时,必须小心。每一个端口提供一种特定的服务,只有给出正确的端口,才能获得相应的服务。0~1023的端口号为系统所保留,例如http服务的端口号为80,telnet服务的端口号为21,ftp服务的端口号为23,所以我们在选择端口号时,最好选择一个大于1023的数以防止发生冲突。在创建socket时如果发生错误,将产生IOException,在程序中必须对之作出处理。所以在创建Socket或ServerSocket时必须捕获或抛出异常。3.客户端的SocketpublicclassSocketextendsObject{publicSocket(Stringhost,intport)throwsUnknownHostException,IOException//构造方法,指定主机名和端口号publicSocket(InetAddressaddress,intport)throwsUnknownHostException,IOException//构造方法,指定IP和端口号

publicInputStreamgetInputStream()throwsIOException //返回TCP连接提供的字节输入流

publicOutputStreamgetOutputStream()throwsIOException//返回TCP连接提供有字节输出流

publicsynchronizedvoidclose()throwsIOException //关闭TCP连接}下面是一个典型的创建客户端Socket的过程:

try{

Socketsocket=newSocket("",4700);

//是TCP/IP协议中默认的本机地址

}catch(IOExceptione){

System.out.println("Error:"+e);

}4.服务器端的ServerSocketpublicclassServerSocketextendsObject{publicServerSocket(intport)throws IOException //构造方法,指定端口号

publicSocketaccept()throwsIOException//等待接收客户端的连接请求,连接成功后返回一个已连接的Socket对象

publicvoidclose()throwsIOException //停止等候客户端的连接请求}下面是一个典型的创建Server端ServerSocket的过程:

ServerSocketserver=null;try{server=newServerSocket(4700);//创建一个ServerSocket在端口4700监听客户请求}catch(IOExceptione){System.out.println("cannotlistento:"+e);}Socketsocket=null;try{socket=server.accept();//accept()是一个阻塞的方法,一旦有客户请求,它就会返回一个Socket对象用于同、客户进行交互}catch(IOExceptione){System.out.println("Error:"+e);}以上的程序是Server的典型工作模式,只不过在这里Server只能接收一个请求,接受完后Server就退出了。实际应用中,总是让它不停的循环接收,一旦有客户请求,Server总是会创建一个服务线程来服务新来的客户,而自己继续监听。程序中accept()是一个阻塞方法,所谓阻塞方法就是说该方法被调用后,将等待客户的请求,直到有一个客户启动并请求连接到相同的端口,然后accept()返回一个对应于客户的socket。这时,客户方和服务方都建立了用于通信的socket,接下来就是由各个socket分别打开各自的输入/输出流。5.打开输入/出流类Socket提供了方法getInputStream()和getOutStream()来得到对应的输入/输出流以进行读/写操作,这两个方法分别返回InputStream和OutputSteam类对象。为了便于读/写数据,我们可以在返回的输入/输出流对象上建立过滤流,如DataInputStream、DataOutputStream或PrintStream类对象,对于文本方式流对象,可以采用InputStreamReader和OutputStreamWriter、PrintWirter等处理。7.关闭Socket每一个Socket存在时,都将占用一定的资源,在Socket对象使用完毕时,要其关闭。在关闭Socket之前,应将与Socket相关的所有的输入/输出流全部关闭,以释放所有的资源。而且要注意关闭的顺序,与Socket相关的所有的输入/输出该首先关闭,然后再关闭Socket。

os.close();

is.close();

socket.close();TCP/IP网络数据通讯模型服务器端ServerSocket(port#

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论