您好,欢迎访问三七文档
《Java程序设计之网络编程》计算机学院电子邮件:lizhx@126.com教学课件第15章网络通信主要内容15.1网络通信简介15.2URL通信15.3Socket通信15.4Datagram通信15.5远程方法调用(RMI)15.1网络通信简介网络通信的核心是协议。协议是指进程之间交换信息已完成任务所使用的一系列规则和规范。它主要包含两个方面的定义:1定义了进程之间交换消息所必需遵循的顺序。2定义进程之间所交换的消息的格式。通过定义协议,可以看出,两个进程只要遵循相同的协议,就可以相互交换信息,而这两个进程可以用不同的编程语言编写,可以位于两个完全不同的计算机上。国际标准化组织给出了一个通用的参考协议,称为开放式系统互连参考模型(ISO/OSIRM)。15.1网络通信简介应用层表示层会话层传输层网络层数据链路层物理层应用层表示层会话层传输层网络层数据链路层物理层开放式系统互连参考模型Java提供的网络功能有三大类:URL,Socket,Datagram.1)URL是三大功能中最高级的一种,通过URLJava程序可以直接送出或读入网络上的数据.2)Socket是传统网络程序最常用的方式,可以想象为两个不同的程序通过网络的通信信道.(传输层接口)3)Datagram是更低级的网络传输方式,它把数据的目的纪录在数据包中,然后直接放在网络上.两类传输协议:TCP;UDP尽管TCP/IP协议的名称中只有TCP这个协议名,但是在TCP/IP的传输层同时存在TCP和UDP两个协议。TCP与UDPTCP是TranferControlProtocol的简称,是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个socket之间必须建立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是serversocket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送或接收操作。UDP是UserDatagramProtocol的简称,是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。下面我们对这两种协议做简单比较:使用UDP时,每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接。对于TCP协议,由于它是一个面向连接的协议,在socket之间进行数据传输之前必然要建立连接,所以在TCP中多了一个连接建立的时间。使用UDP传输数据时是有大小限制的,每个被传输的数据报必须限定在64KB之内。而TCP没有这方面的限制,一旦连接建立起来,双方的socket就可以按统一的格式传输大量的数据。UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。而TCP是一个可靠的协议,它确保接收方完全正确地获取发送方所发送的全部数据。TCP在网络通信上有极强的生命力,例如远程连接(Telnet)和文件传输(FTP)都需要不定长度的数据被可靠地传输。相比之下UDP操作简单,而且仅需要较少的监护,因此通常用于局域网高可靠性的分散系统中client/server应用程序。为什么还要非可靠传输的UDP协议呢?主要的原因有两个。一是可靠的传输是要付出代价的,对数据内容正确性的检验必然占用计算机的处理时间和网络的带宽,因此TCP传输的效率不如UDP高。二是在许多应用中并不需要保证严格的传输可靠性,比如视频会议系统,并不要求音频视频数据绝对的正确,只要保证连贯性就可以了,这种情况下显然使用UDP会更合理一些。15.2URL通信15.2.1URL简介15.2.2URL类15.2.3通过字节流访问资源15.2.4通过URLConnection实现双向通信URL(UniformResourceLocater)是统一资源定位器的简称,URL的值表示网络上某个资源(如打印机、文件)的地址,因此只要按URL规则定义某个资源,那么网络上的其他程序就可以通过URL来访问它URL用来网络资源定位,它的值由5部分组成,格式如下:传输协议://主机名:端口号/文件名#引用15.2.1URL简介其中传输协议(protocol)指明获取资源所使用的传输协议,如http、ftp、file等。主机名(hostname)指定资源所在的计算机,可以是IP地址,如127.0.0.1,也可以是主机名或域名,如。一个计算机中可能有多种服务(应用程序),端口号(port)用来区分不同的网络服务,如http服务的默认端口号是80,ftp服务的默认端口号是21等。文件名(filename)包括该文件的完整路径。在http协议中,缺省的文件名是index.html,因此,15.2.1URL简介。引用(reference)为资源内的某个引用,用来定位显示文件内容的位置,如。但并非所有的URL都包含这些元素。对于多数的协议,主机名和文件名是必需的,但端口号和文件内部的引用则是可选的。15.2.2URL类java中定义了URL类。URL类有六个构造函数,其中最常用的有以下四种:1)URL(Stringspec)例:URLu=newURL(“”);2)URL(Stringprotocol,Stringhost,Stringfile)3)URL(Stringprotocol,Stringhost,intport,Stringfile)上两种方法将一个URL地址分解,按不同部分分别指定协议、主机、端口、文件。例如:URLu=newURL(“http”,”java.sun.com”,80,“docs/books/tutorial.intro.html”);4)URL(URLcontext,Stringspec)URLu=newURL(“”);URLu1=newURL(u,”tutorial.intro.html”);URLu2=newURL(u,”tutorial.super.html”);15.2.3通过字节流访问资源URL对象创建后,就可以通过它来访问指定的资源。这时需要调用URL类的openStream()方法,该方法与指定的URL建立连接并返回一个InputStream类的对象,这样访问网络资源的操作就变成了我们熟悉的I/O操作,接下来就可以用字节流的方式读取资源数据。15.2.3通过字节流访问*;importjava.net.*;publicclassURL2{publicstaticvoidmain(String[]args)throwsIOException{URLurl=newURL(“”);InputStreamReaderisr=newInputStreamReader(url.openStream());BufferedReaderbr=newBufferedReader(isr);Strings;while((s=br.readLine())!=null)System.out.print(s);br.close();}}JDK5.0java.net.URL类15.2.4URLConnection实现双向通信实际应用中,只能读取数据是不够的,很多情况下,我们都需要将一些信息发送到服务器中去,这就要求我们能够实现同网络资源的双向通信,URLConnection类就是用来解决这一问题的。类URLConnection也是定义在包java.net里,它表示Java程序和URL在网络上的通信连接。当与一个URL建立连接时,首先要在一个URL对象上通过方法openConnection()生成对应的URLConnection对象。URLConnection是以HTTP协议为中心的类,其中很多方法只有在处理HTTP的URL时才起作用。抽象类URLConnection是所有类的超类,它代表应用程序和URL之间的通信链接。此类的实例可用于读取和写入此URL引用的资源。通常,创建一个到URL的连接需要几个步骤:1)通过在URL上调用openConnection方法创建连接对象。2)操作设置参数和一般请求属性。3)使用connect方法建立到远程对象的实际连接。4)远程对象变为可用。远程对象的头字段和内容变为可访问。1.建立连接URLurl=newURL(“”);URLConnectioncon=url.openConnection();2.向服务器端送数据PrintStreamps=newPrintStream(con.getOutputStream());ps.println(string_data);3.从服务器读数据DataInputStreamdis=newDataInputStream(con.getInputStream());dis.readLine();使用URLConnection的例子/ComWithCgi.javaimportjava.io.*;importjava.net.*;publicclassComWithCgi{publicstaticvoidmain(String[]args)throwsException{URLurl=newURL(http:/java.sun.com/test.cgi);//建立指向本地磁盘上cgi的URL对象URLConnectionconnection=url.openConnection();connection.setDoOutput(true);PrintStreamps=newPrintStream(connection.getOutputStream());ps.println(0123456789);ps.close();//向服务器输出数据DataInputStreamdis=newDataInputStream(connection.getInputStream());StringinputLine;while((inputLine=dis.readLine())!=null){System.out.println(inputLine);}dis.close();//从服务器读数据}}socket是指在一个特定编程模型下,进程间通信链路的端点。因为这个特定编程模型的流行,socket这个名字在其他领域得到了复用,包括Java技术。当进程通过网络进行通信时,Java技术使用它的流模型。一个socket包括两个流:一个输入流和一个输出流。如果一个进程要通过网络向另一个进程发送数据,只需简单地写入与socket相关联的输出流。一个进程通过从与socket相关联的输入流读来读取另一个进程所写的数据。建立网络连接之后,使用与socket相关联的流和使用其他流是非常相似的。10.3SocketSocket的概念如果要建立连接,一台机器必须运行一个进程来等待连接,而另一台机器必须试图到达第一台机器。这和电话系统类似;一方必须发起呼叫,而另一方在此时必须等待电话呼叫。你发起电话呼叫时,你
本文标题:TP14-网络通信
链接地址:https://www.777doc.com/doc-310203 .html