第16章 网络编程_第1页
第16章 网络编程_第2页
第16章 网络编程_第3页
第16章 网络编程_第4页
第16章 网络编程_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

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

文档简介

第16章

Java网络编程1本章主要内容16.1网络基础16.2URL编程16.3用Java语言实现底层网络通信216.1网络基础16.1.1TCP/IP协议16.1.2通信端口16.1.3URL概念16.1.4Java语言的网络编程316.1.1TCP/IP协议Internet的主要协议有:网络层的IP协议;传输层的TCP和UDP协议;应用层的FTP、HTTP、SMTP等协议。TCP/IP网络参考模型包括四个层次:应用层、传输层、网络层、链路层。每一层负责不同的功能,416.1.1TCP/IP协议1.链路层链路层也称为数据链路层或网络接口层。通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其它任何传输媒介)有关的物理接口细节。2.网络层网络层对TCP/IP网络中的硬件资源进行标识。主要完成IP地址的管理。516.1.1TCP/IP协议3.传输层在TCP/IP网络中最常用的传输协议是传输控制协TCP和用户数据报协议UDP(UserDatagramProtocol)。主要用来完成数据的传输。TCP协议是通过在端点与端点之间建立持续的连接而进行通信的。是一种有序传输。UDP协议是一种无连接的传输协议。但效率比较高。4.应用层大多数基于Internet的应用程序都被看做TCP/IP网络的最上层协议——应用层协议。例如:FTP、HTTP、SMTP、POP3、Telnet等协议。616.1.2

通信端口Internet上传输的数据都带有标识目的主机与端口号的地址信息,主机的地址由32位的IP地址标识,IP协议通过该地址把数据发送到正确的目的主机;端口号由一个16位的数字标识,TCP与UDP协议根据端口号把数据传送给正确的应用程序。端口号的范围是0~65535,其中1~1023之间的端口号是为HTTP、FTP等系统应用保留的,FTP协议的端口号是21,HTTP协议的端口号是80,Telnet协议的端口号是23,用户应用程序只能使用1024以上的端口号,其中1024~4999可任意被用户用作客户端套接字端口,5000~65535可任意被用户用作服务端套接字端口。716.1.2

通信端口816.1.3

URL概念URL是统一资源定位器(UniformResourceLocator)的英文缩写,它表示Internet上某一资源的地址。Internet上的资源包括HTML文件、图像文件、声音文件、动画文件以及其他任何内容(并不完全是文件,也可以是对数据库的一个查询等)。916.1.3

URL概念URL的基本结构由5部分组成,其格式如下:传输协议://主机名:端口号/文件名#引用1.传输协议(protocol):传输协议是指所使用的协议名,如HTTP、FTP等。2.主机名(hostname):主机名是指资源所在的计算机。可以是IP地址,也可以是计算机的名称或域名。3.端口号(portnumber):一个计算机中可能有多种服务,如Web服务、FTP服务或自己建立的服务等。为了区分这些服务,就需要使用端口号,每一种服务用一个端口号。1016.1.3

URL概念4.文件名(filename):文件名包括该文件的完整路径。在HTTP协议中,有一个默认的文件名是index.html,因此,下列两个地址是等价的。/index.html5.引用(reference):引用就是资源内部的某个参考点。如/index.html#chapter1说明:对于一个URL并不是要求它必须包含所有的这5部分内容。1116.1.4Java语言的网络编程Java语言的网络编程分为三个层次。最高一级的网络通信就是我们前面章节中所讲的从网络上下载小程序。次一级的通信,就是前面介绍的通过类URL对象指明文件所在位置,并从网络上下载声音和图像文件,然后对声音播放和图像显示。最低一级的通信是利用包中提供的类直接在程序中实现网络通信。1216.1.4Java语言的网络编程借助HTML从网上下载applet在程序中通过URL访问网上资源通过包中的类直接在程序中实现网络通讯1316.1.4Java语言的网络编程针对不同层次的网络通信,Java语言提供的网络功能有四大类:URL、InetAddress、Socket、Datagram。InetAddress面向的是IP层,用于标识网络上的硬件资源。URL面向的应用层,通过URL,Java程序可以直接送出或读入网络上的数据。Sockets和Datagram面向的则是传输层。Sockets使用的是TCP协议,这是传统网络程序最常用的方式,可以想象为两个不同的程序通过网络的通信信道进行通信。Datagram则使用UDP协议,是另一种网络传输方式,它把数据的目的地记录在数据包中,然后直接放在网络上。1416.1.4Java语言的网络编程包中的主要的类面向IP层的类:InetAddress面向应用层的类:URL、URLConnection面向传输层的类:TCP协议相关类:Socket、ServerSocketUDP协议相关类:DatagramPacket、DatagramSocket、MulticastSocket可能产生的异常:BindException、ConnectException、MalformedURLException、NoRouteToHostException、ProtocolException、SocketException、UnknownHostException、UnknownServiceException1516.2

URL编程在Java中,包里面的类是进行网络编程的,其中.URL类和.URLConnection类使编程者能很方便的利用URL在Internet上进行网络通信。1616.2.1

创建URL对象类URL提供了很多构造方法来生成一个URL对象:publicURL(String

spec)publicURL(URLcontext,Stringspec)publicURL(String

protocol,String

host,String

file)publicURL(String

protocol,String

host,int

port,String

file)以下是一些具体的构造实例:URLurl1=newURL(“”);URLbase=newURL(“”);URLurl2=newURL(base,“/mywork1.html”);URLurl4=newURL(“http”,“”,“/lyw/test.html”);URLurl5=newURL(“http”,“”,8080,“/java/network.html”);1716.2.1

创建URL对象一个URL对象生成后,其属性是不能被改变的,但可以通过它给定的方法来获取这些属性:getDefaultport():

返回缺省的端口号。getFile():

获得URL指定资源的完整文件名getHost():

返回主机名。getPath():

返回指定资源文件目录和文件名getPort():

返回端口号,默认-1getProtocol():

返回表示URL中协议的字符串对象。getRef():

返回URL中的HTML文档标记,即#号标记。getUserInfo():

返回用户信息。toExternalForm():

返回完整的URL字符串。toString():

返回完整URL字符串。1816.2.1

创建URL对象在构造URL对象而使用其构造方法时会抛出MalformedURLException非运行时异常,因此生成URL对象时,必须对这一异常进行处理。例如: try { URLmyURL=newURL(“/”); } catch(MalformedURLExceptione) { e.printStackTrace(); }1916.2.2

使用URL类访问资源【例16.1】通过URL直接读取网上服务器中的文件内容。本例是利用URL访问/index.html文件,即访问教育网上的index.html文件。读取网络上文件内容一般分3个步骤。一是创建URL类的对象;二是利用URL类的openStream()方法获得对应的InputStream类的对象;三是通过InputStream对象来读取文件内容。20App16_1.java21App16_1.java2216.3用Java语言实现底层网络通信用Java语言实现计算机网络的底层通信,就是用Java程序实现网络通信协议所规定的功能的操作,这是Java语言网络编程的一部分。2316.3.1InetAddress程序设计类InetAddress可以用于标识网络上的硬件资源,它提供了一系列方法以描述、获取及使用网络资源。InetAddress类没有构造函数,因此不能用new来构造一个InetAddress实例。通常是用它提供的静态方法来获取:

publicstaticInetAddressgetByName(String

host)

:host可以是一个机器名,也可以是一个形如“%d.%d.%d.%d”的IP地址或一个DSN域名。

publicstaticInetAddressgetLocalHost() publicstaticInetAddress[]getAllByName(String

host)这三个方法通常会产生UnknownHostException例外,应在程序中捕获处理。2416.3.1InetAddress程序设计以下是InetAddress类的几个主要方法:publicbyte[]getAddress():获得本对象的IP地址(存放在字节数组中)。publicString

getHostAddress():获得本对象的IP地址“%d.%d.%d.%d”。publicString

getHostName():获得本对象的机器名。获得本地主机的IP地址:InetAddressaddr=InetAddress.getLocalHost();25App16_2.java编写一个Java应用程序,直接查询自己主机的IP地址和Internet上WWW服务器的IP地址。26App16_2.java2716.3.2基于连接的Socket通信程序设计Socket通信属于网络底层通信,它是网络上运行的两个程序间双向通信的一端,它既可以接受请求,也可以发送请求,利用它可以较方便地进行网络上的数据传输。Socket是实现客户与服务器(Client/Server)模式的通信方式,它首先需要建立稳定的连接,然后以流的方式传输数据,实现网络通信。Socket原意为“插座”,在通信领域中译为“套接字”,意思是将两个物品套在一起,在网络通信里的含义就是建立一个连接。2816.3.2基于连接的Socket通信程序设计1.Socket通信机制的基本概念(1)建立连接当两台计算机进行通信时,首先要在两者之间建立一个连接,也就是两者分别运行不同的程序,由一端发出连接请求,另一端等候连接请求。当等候端收到请求并接受请求后,两个程序就建立起一个连接,之后通过这个连接可以进行数据交换。此时,请求方称为客户端,接收方称为服务器端。应用在这两端的TCPSocket分别称为服务器Socket和客户Socket。基本原理类似于电话系统。2916.3.2基于连接的Socket通信程序设计(2)连接地址为了建立连接,需要有一个程序向另一台计算机上的程序发出请求,其中,能够唯一识别对方机器的,就是计算机的名称或IP地址,称为连接地址,类似于电话系统中的电话号码。计算机上的每个程序有一个唯一的端口号,通过端口号指定要连接的程序。所以一个完整的连接应该是IP+端口。两个程序进行连接之前要约定好端口号。有服务器端分配端口号并等候请求,客户端利用这个端口号发出连接请求,当两个程序所设定的端口号一致时连接成功。3016.3.2基于连接的Socket通信程序设计(3)TCP/IPSocket通信Socket在TCP/IP协议中定义,针对一个特定的连接,每台机器上都有一个“套接字”,可以想象在它们之间有一条虚拟的“线缆”,线缆的每一端都插入一个“套接字”或“插座”里。在Java语言中,服务器端套接字使用ServerSocket类,客户端套接字使用Socket类。3116.3.2基于连接的Socket通信程序设计SOCKET连接过程根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。3216.3.2基于连接的Socket通信程序设计3316.3.2基于连接的Socket通信程序设计2.客户端Socket类与服务器端ServerSocket类在Java中,通信端点由.Socket类(客户端)或.ServerSocket类(服务器端)表示。位于两台不同机器上的应用软件通过网络连接发送和接收字节流,从而实现通信。其中,Socket类代表的是客户端,它是一个连接远程服务器应用时临时创建的端点。ServerSocker类代表的是服务器端,它启动后等待来自客户端的连接请求;一旦接收到请求,ServerSocket创建一个Socket实例来处理与该客户端的通信。对于服务器应用,我们不知道客户端应用什么时候会试图连接服务器,服务器必须一直处于等待连接的状态。socket类当客户程序需要与服务器程序通讯的时候,客户程序在客户机创建一个socket对象。3416.3.2基于连接的Socket通信程序设计socket类构造方法publicSocket(String

host,int

port)

创建一个流套接字并将其连接到指定主机上的指定端口号。

publicSocket(InetAddressaddress,int

port)创建一个流套接字并将其连接到指定IP地址的指定端口号publicSocket(String

host,int

port,InetAddress

localAddr,int

localPort)创建一个套接字并将其连接到指定远程地址上的指定远程端口publicSocket(InetAddress

address,int

port,InetAddress

localAddr,int

localPort)创建一个套接字并将其连接到指定远程地址上的指定远程端口这些方法都将抛出例外IOException,程序中需要捕获处理。两个构造函数都创建了一个基于Socket的连接服务器端流套接字的流套接字。3516.3.2基于连接的Socket通信程序设计Socket类常用方法

Socket的输入/输出流管理publicInputStreamgetInputStream()publicOutputStreamgetOutputStream()这些方法都将抛出例外IOException,程序中需要捕获处理。

关闭Socketpublicvoidclose()throwsIOException3616.3.2基于连接的Socket通信程序设计Socket类常用方法设置/获取Socket数据publicInetAddressgetInetAddress():获取创建Socket对象时指定的计算机IP地址。publicInetAddressgetLocalAddress():获取创建Socket对象时客户计算机的IP地址。publicintgetPort():获取创建Socket对象时远程主机的端口号publicintgetLocalPort()publicvoidsetSoTimeout(int

timeout):设定客户端接口所需等到的时间限度

这些方法都将抛出例外SocketException。3716.3.2基于连接的Socket通信程序设计(2)ServerSocket类ServerSocket类的作用是实现客户机/服务器模式的通信方式下服务器端的套接字。构造方法:publicServerSocket(int

port)publicServerSocket(int

port,int

backlog):支持指定数目的连接publicServerSocket(int

port,int

backlog,InetAddress

bindAddr)这些方法都将抛出例外IOException,程序中需要捕获处理。3816.3.2基于连接的Socket通信程序设计(2)ServerSocket类主要方法publicSocketaccept()

:在服务器端的指定端口监听客户端发来的连接请求,并与之连接。publicvoidclose()

:关闭SocketpublicInetAddress

getInetAddress():返回服务器的IP地址publicint

getLocalPort():取得服务器的端口号3916.3.2基于连接的Socket通信程序设计(3)Socket通信模式根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。4016.3.2基于连接的Socket通信程序设计4116.3.2基于连接的Socket通信程序设计(3)Socket通信模式无论一个Socket通信程序的功能多么齐全、程序多么复杂,其基本结构都是一样的。主要分为服务器端编程和客户端编程。服务器程序编写:①调用ServerSocket(intport)创建一个服务器端套接字,并绑定到指定端口上;②调用accept(),监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字。③调用Socket类的getOutputStream()和getInputStream获取输出流和输入流,开始网络数据的发送和接收。④最后关闭通信套接字。4216.3.2基于连接的Socket通信程序设计 ServerSocket

server

=

new

ServerSocket(9998)

这条语句创建了一个服务器对象,这个服务器使用9998号端口。当一个客户端程序建立一个Socket连接,所连接的端口号为9998时,服务器对象server便响应这个连接,并且server.accept()方法会创建一个Socket对象。服务器端便可以利用这个Socket对象与客户进行通讯。 Socketincoming=server.accept()进而得到输入流和输出流,并进行封装 BufferedReaderin=newBufferedReader(newInputStreamReader(incoming.getInputStream())); PrintWriterout=newPrintWriter(incoming.getOutputStream(),true);4316.3.2基于连接的Socket通信程序设计随后,就可以使用in.readLine()方法得到客户端的输入,也可以使用out.println()方法向客户端发送数据。从而可以根据程序的需要对客户端的不同请求进行回应。在所有通讯结束以后应该关闭这两个数据流,关闭的顺序是先关闭输出流,再关闭输入流,即使用:

out.close(); in.close();4416.3.2基于连接的Socket通信程序设计(3)Socket通信模式客户端程序编写:①调用Socket()创建一个流套接字,并连接到服务器端;②调用Socket类的getOutputStream()和getInputStream获取输出流和输入流,开始网络数据的发送和接收。

③最后关闭通信套接字。45例16_3:服务器端Socket编程46例16_3:服务器端Socket编程监听状态4748例16_3:服务器端Socket编程49例16_3:服务器端Socket编程50例16_3:客户端Socket编程51例16_3:客户端Socket编程5253例16_3:客户端Socket编程54例16_3:客户端Socket编程55例16_3:客户端Socket编程5616.3.3无连接的Socket通信程序设计

UDP协议是无连接的协议,它以数据报作为数据传输的载体。数据报是一个在网络上发送的独立信息,它的到达、到达时间以及内容本身等都不能得到保证。数据报的大小是受限制的,每个数据报的大小限定在64KB以内。由于UDP通信速度较快,所以常常被应用在某些无须实时交互、准确性要求不高、但传输速度要求较高的场合。UDP协议无需在发送方和接收方建立连接,数据报在网上可以以任何可能的路径传往目的地(分组交换)。J软件包中的DatagramSocket类和DatagramPacket类为实现UDP通信提供了支持。DatagramSocket用于在程序中间建立传送数据报的通信连接DatagramPacket则用来表示一个数据报。571.数据报方式的通信过程(1)创建数据报Socket;(2)构造用于接收或发送的数据报,并调用所创建Socket的receive()方法进行数据报接收或调用send()发送数据报。(3)通信结束,关闭Socket。16.3.3无连接的Socket通信程序设计582.DatagramSocket类DatagramSocket类的三个构造方法如下:(1)DatagramSocket():创建DatagramSocket对象并与本地主机某个可用端口相连。(2)DatagramSocket(intport):创建DatagramSocket对象并与指定端口相连。(3)DatagramSocket(intport,InetAddressiaddr):创建一个于本地地址绑定的DatagramSocket对象。16.3.3无连接的Socket通信程序设计5916.3.3无连接的Socket通信程序设计DatagramSocket类的常用方法如下:(1)voidreceive(DatagramPacketpacket)throwsIOExceptionreceive()方法将使程序中的线程一直处于阻塞状态,直到从当前socket中接收到信息时,将收到的信息存储在receive()方法的对象参数packet的存储机构中。(2)voidsend(DatagramPacketpacket)throwsIOExceptionsend()方法将其参数DatagramPacket对象packet中包含的数据报文发送到所指定的IP地址主机的指定端口。6016.3.3无连接的Socket通信程序设计(3)voidsetSotimeout(inttimeout)throwsIOException当程序调用DatagramSocket的receive方法以读取数据后,程序将处于阻塞状态,知道setSoTimeout方法所设置时间超时为止。(4)voidclose()关闭数据报套接字,它不会抛出异常对象。61基于UDP的socket编程接收端(Server)发送端(Client)DatagramSocket(intport)DatagramSocket()DatagramPacket(byte[]buf,intlength)DatagramSocket.receive(DatagramPacketp)DatagramSocket.close()DatagramSocket.close()DatagramPacket(byte[

温馨提示

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

评论

0/150

提交评论