《第13章 Java网络编程.ppt》由会员分享,可在线阅读,更多相关《第13章 Java网络编程.ppt(27页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Java实用教程(第3版)第第13章章 Java网络编程网络编程T13.1 网络程序设计基础网络程序设计基础T13.2 TCP网络编程网络编程T13.3 UDP网络编程网络编程T13.4 URLT13.5 综合实例综合实例Java实用教程(第3版)13.1 网络程序设计基础网络程序设计基础13.1.1 TCP和和UDP要想让处于网络中的主机互相通信,只是知道通信双方地址还是不够的,还必须遵循一定的规则。有两套参考模型:OSI参考模型,TCP/IP参考模型(或TCP/IP协议)。由于OSI参考模型过于理想化,未能在因特网上进行广泛推广。这样,TCP/IP协议就成为事实上的国际标准。这里只重点介绍
2、TCP/IP协议的运输层协议。运输层协议中有两个非常重要的协议:传输控制协议TCP(TransmissionControlProtocol),用户数据报协议UDP(UserDatagramProtocol)。传输控制协议TCP是面向连接的运输层协议。即应用进程(或程序)在使用TCP协议之前,必须先建立TCP连接,在传输完毕后,释放已经建立的连接。利用TCP协议进行通信的两个应用进程,一个是服务器进程。另一个是客户进程。用户数据报协议UDP是面向无连接的运输层协议。即应用进程(或程序)在使用UDP协议之前,不必先建立连接。自然,发送数据结束时也没有连接需要释放。因此,减少了开销和发送数据之前的时
3、延。Java实用教程(第3版)13.1.2 端口和套接字端口和套接字一般情况下,两台主机上都会运行许多进程。当主机A上的进程A1向主机B上的进程B1发送数据时,IP协议根据主机B的IP地址,把进程A1发送的数据送达主机B。接下来传输层TCP需要决定把数据发送到主机中的哪个进程。TCP和UDP都采用端口来区分进程。端口是一种抽象的软件结构(包括一些数据结构和I/O缓冲区),也称为协议端口(protocolport)。端口用一个整数型标识符来表示,即端口号。端口号跟协议相关,TCP/IP传输层的两个协议TCP和UDP是完全独立的两个软件模块,因此各自的端口号也相互独立,端口使用一个16位的数字来表
4、示,它的范围是065535,1024以下的端口号保留给预定义的服务,用于一些知名的网络服务和应用。例如,http使用80端口,FTP服务的端口号是21。应用程序通过系统调用与某端口建立连接(binding)后,传输层传给该端口的数据都被相应的进程所接收,相应进程发给传输层的数据都通过该端口输出。Java实用教程(第3版)13.2 TCP网络编程网络编程两个Java应用程序可通过一个双向的网络通信连接实现数据交换,这个双向链路的一段称为一个Socket(套接字)。Socket通常用来实现Client/Server连接。Socket的出现,使程序员可以很方便地访问TCP/IP,从而开发各种网络应用
5、程序。Java语言的基于套接字编程分为服务器编程和客户端编程,其通信模型如图13.1所示。图图13.1基于基于TCP的的Socket通信通信Java实用教程(第3版)13.2 TCP网络编程网络编程l服务器程序编写:(1)调用ServerSocket(intport)创建一个服务器端套接字,并绑定到指定端口上。(2)调用accept(),监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字。(3)调用Socket类的getOutputStream和getInputStream获取输出流和输入流,开始网络数据的发送和接收。(4)最后关闭通信套接字。l客户端程序编写:(1)调用Socket
6、()创建一个流套接字,并请求连接到服务器端。(2)调用Socket类的getOutputStream和getInputStream获取输出流和输入流,开始网络数据的发送和接收。(3)最后关闭通信套接字。Java实用教程(第3版)13.2 TCP网络编程网络编程Socket类的对象表示一个Socket。客户端使用Socket类的构造方法,创建一个Socket对象,创建的同时会自动向服务器方发起连接。Socket类的构造方法如下类的构造方法如下:lSocket(Stringhost,intport)throwsUnknownHostException,IOException:功能:向服务器(域名是
7、host。端口号为port)发起TCP连接,若成功,则创建Socket对象,否则抛出异常。lSocket(InetAddressaddress,intport)throwsIOException:功能:同上。只是根据InetAddress对象所表示的IP地址以及端口号port发起连接。lSocket(Stringhost,intport,InetAddresslocalAddr,intlocalPort)throwsIOException:功能:创建一个套接字并将其连接到指定远程主机上的指定远程端口。Socket会通过调用bind()方法来绑定提供的本地地址及端口。host表示远程主机名,po
8、rt表示远程端口号,localAddr表示要将套接字绑定到的本地地址,localPort表示要将套接字绑定到的本地端口。lSocket(InetAddressaddress,intport,InetAddresslocalAddr,intlocalPort)throwsIOException:Java实用教程(第3版)13.2 TCP网络编程网络编程功能:创建一个套接字并将其连接到指定远程地址上的指定远程端口。Socket会通过调用bind()方法来绑定提供的本地地址及端口。Socket类的常用方法如表13.1所示。方法功能InetAddressgetLocalAddress()返回对方Soc
9、ket中的IP的InetAddress对象intgetLocalPort()返回本地Socket中的端口号InetAddressgetInetAddress()返回对方Socket中IP地址intgetPort()返回对方Socket中的端口号voidclose()throwsIOException关闭Socket,释放资源InputStreamgetInputStream()throwsIOException获取与Socket相关联的字节输入流,用于从Socket中读数据。OutputStreamgetOutputStream()throwsIOException获取与Socket相关联的字
10、节输出流,用于向Socket中写数据。表表13.1 Socket类类的常用方法的常用方法Java实用教程(第3版)13.2 TCP网络编程网络编程服务器端需要创建监听特定端口的ServerSocket,ServerSocket等待客户端发起TCP连接,然后返回一个用于与该客户端进行TCP通信的Socket对象。ServerSocket类的构造方法如下:类的构造方法如下:lServerSocket(intport)throwsIOException:功能:创建绑定到特定端口的服务器套接字。连接队列的最大长度是50,当连接队列已满,又有客户端发起连接请求时,服务器将拒绝该连接请求。(连接队列是指已
11、完成TCP三次握手但还没有被accept()取走的TCP连接)lServerSocket(intport,intbacklog)throwsIOException功能:利用指定的backlog创建服务器套接字并将其绑定到指定的本地端口号。backlog表示队列的最大长度。lServerSocket(intport,intbacklog,InetAddressbindAddr)throwsIOException功能:使用指定的端口、侦听backlog和要绑定到的本地IP地址创建服务器,bindAddr表示要将服务器绑定到的InetAddress。Java实用教程(第3版)13.2 TCP网络编程
12、网络编程ServerSocket类的常用方法如表13.2所示。方法功能Socketaccept()throwsIOException等待客户端的连接请求,返回与该客户端进行通信用的Socket对象voidsetSoTimeout(inttimeout)throwsSocketException设置accept()方法等待连接的时间为timeout毫秒。若时间已到,还没有客户端连接,则抛出InterruptedIOException异常,accept()方法不再阻塞,该倾听Socket可继续使用。若timeout值为0,则表示accept()永远等待。该方法必须在倾听Socket创建后,在acc
13、ept()之前调用才有效。voidclose()throwsIOException关闭监听SocketInetAddressgetInetAddress()返回此服务器套接字的本地地址intgetLocalPort()返回此套接字在其上监听的端口号SocketAddressgetLocalSocketAddress()返回此套接字绑定的端点的地址表表13.2 ServerSocket类类的常用方法的常用方法Java实用教程(第3版)13.2.1 InetAddress类类InetAddress类的对象用于表示IP地址,该类没有明确定义构造方法,常用的方法如表11.3所示。方法功能staticI
14、netAddressgetAllByName(Stringhost)throwsUnknownHostException返回主机名host所对应的所有IP,每一个IP用一个InetAddress对象表示,结果返回的是一个一维的InetAddress数组。staticInetAddressgetByName(Stringhost)throwsUnknownHostException返回主机名host所对应的一个IP。若该主机名对应多个IP,则随机返回其中一个IP,该IP用InetAddress对象表示。staticInetAddressgetLocalHost()throwsUnknownHos
15、tException返回本地主机的IP地址。该IP用InetAddress对象表示。publicbytegetAddress()返回组成该IP地址的四个字节。按网络字节存放,即最高字节放在getAddress()0中。staticInetAddressgetByAddress(byteaddr)throwsUnknownHostException返回由该四个字节组成的IP地址的InetAddress对象。bytegetAddress()返回IP地址的四个字节组成的数组。表表13.3 InetAddress类类的常用方法的常用方法Java实用教程(第3版)13.2.1 InetAddress类类
16、【例例13.1】返回域名相应的IP地址,若没有给出域名,则返回本地主机的IP地址。运行程序,在文本框中输入新浪的域名“”,则在列表框中显示新浪的IP地址信息,如图13.2所示。图图13.2 获获取新浪的取新浪的IP地址地址Java实用教程(第3版)13.2.2 TCP通信程序通信程序【例例13.2】一个简单TCP通信程序,客户端程序向服务器程序发送任意的字符串,服务器程序收到后,显示收到的字符串。首先建立一个TCP服务器程序。在这个程序中,创建一个在8866端口上等待连接的ServerSocket对象。当接收到一个客户端的连接请求后,程序从与这个客户建立连接的Socket对象中获得输入流对象。
17、通过输入流读取客户端程序发送的字符串。再建立TCP客户端程序。由于是本地连接,TCP服务器的IP地址是127.0.0.1,客户端需要与通过服务器的8866端口建立连接完成通信,所以在客户端指定要与服务器连接的端口号为8866。同样,客户端利用创建的Socket对象来获得输出流对象。通过输出流向服务器端发送字符串。Java实用教程(第3版)13.2.2 TCP通信程序通信程序运行上面的TCP客户服务器程序。首先在客户端文本框中输入字符串,按下回车键,这些字符串将显示在客户端的窗口上。并且,这些数据将发送给服务器端,服务器端接受到从客户端发送的字符串,将显示在窗口上,如图13.3、图13.4所示。
18、图图13.3服服务务器端器端 图图13.4 客客户户端端Java实用教程(第3版)13.3 UDP网络编程网络编程UDP协议是无连接的协议。客户端的DatagramSocket与服务器端DatagramSocket不存在一一对应关系,两者无须建立连接,就能交换数据报。每个DatagramSocket对象都会与一个本地端口绑定,在此端口监听发送过来的数据报。在服务器程序中,一般由程序显式地为DatagramSocket指定本地端口。在客户程序中,一般由操作系统为DatagramSocket分配本地端口,这种端口也称为匿名端口。lDatagramSocket的构造方法如下:DatagramSock
19、et()throwsSocketException功能:构造数据报套接字并将其绑定到本地主机上任何可用的端口。套接字将被绑定到INADDR_ANY地址,IP地址由内核来选择。DatagramSocket(intport)throwsSocketException功能:创建数据报套接字并将其绑定到本地主机上的指定端口。套接字将被绑定到INADDR_ANY地址,IP地址由内核来选择。DatagramSocket类的常用方法如表13.4所示。Java实用教程(第3版)13.3 UDP网络编程网络编程方法功能voidsend(DatagramPacketp)throwsIOException发送一个U
20、DP数据包。一个UDP数据包就是一个DatagramPacket对象voidreceive(DatagramPacketp)throwsIOException接收一个UDP数据包。一个UDP数据包就是一个DatagramPacket对象voidconnect(InetAddressaddress,intport)将 该 UDPSocket变 成 一 个 连 接 型 的UDPSocketvoiddisconnect()将 该 UDPSocket变 成 一 个 非 连 接 型 的UDPSocketvoidclose()关闭UDPSocket表表13.4 DatagramSocket类类的常用方法的
21、常用方法Java实用教程(第3版)13.3 UDP网络编程网络编程DatagramPacket类的构造方法分为两类:一类是创建DatagramPacket对象用来接收数据报包。另一类是创建的DatagramPacket对象用来发送数据报包。它们的区别是,用于发送数据报包的构造方法需要设定数据报到达的目的地址,若是“连接型”UDP,则不需要设定目的地址,而用于接收数据报包的构造方法无须设定地址。l用于接收数据报包的构造方法如下:DatagramPacket(bytebuf,intlength):功能:由接收缓冲区(byte字节数组与它的长度length)生成一个DatagramPacket对象。
22、buf表示保存传入数据报的缓冲区,length表示要读取的字节数。DatagramPacket(bytebuf,intoffset,intlength):功能:构造DatagramPacket,用来接收长度为length的包,在缓冲区中指定了偏移量。Java实用教程(第3版)13.3 UDP网络编程网络编程l用于发送数据报包的构造方法如下:DatagramPacket(bytebuf,intlength,InetAddressaddress,intport)功能:构造数据报包,用来将长度为length的包发送到指定主机上的指定端口号。length参数必须小于等于buf.length。因为默认时
23、UDPSocket是非连接型,故要在每一个发送用的UDP数据包中,除了含有发送的数据外,还要有接收方的IP地址和端口号。DatagramPacket(bytebuf,intoffset,intlength,InetAddressaddress,intport)功能:构造数据报包,用来将长度为length偏移量为offset的包发送到指定主机上的指定端口号,length参数必须小于等于buf.length。DatagramPacket类的常用方法如表13.5所示。方法功能bytegetData()返回DatagramPacket对象中包含的数据intgetLength()返回发送/接收数据的长度
24、intgetOffset()返回发送/接收数据在byte中的偏移InetAddressgetAddress()返回对方的IP地址。用InetAddress对象表示intgetPort()返回对方的端口号voidsetData(bytebuf,intoffset,intlength)设置该DatagramPacket对象中包含的数据voidsetAddress(InetAddressiaddr)设置该DatagramPacket对象中包含的IP地址voidsetPort(intiport)设置该DatagramPacket对象中包含的端口号表表13.5 DatagramPacket类类的常用方法
25、的常用方法Java实用教程(第3版)13.3.1 UDP通信程序通信程序【例例13.3】一个简单UDP通信程序,客户程序向服务器程序发送任意的字符串,服务器程序收到后,计算字符串的长度并向客户程序回送相同的字符串。首先建立一个UDP服务器程序。在这个程序中,创建了一个在9777端口上等待接收数据报的DatagramSocket对象。当有数据报要接收时,创建一个DatagramPacket对象,接收此数据报。收到后分析数据报,并再次创建一个DatagramPacket对象,回送此数据报。客户端程序创建一个DatagramSocket对象,准备发送数据。创建一个DatagramPacket对象把要
26、发送的数据打包成一个数据包,并在数据包中写明要发送给远程服务器的IP地址与端口号。Java实用教程(第3版)13.3.1 UDP通信程序通信程序运行上面的UDP客户服务器程序。客户程序向服务器程序发送数据包,服务器接收此数据报包,显示收到的字符串内容,以及客户机的IP地址和端口号,如图13.5、图13.6所示。图图13.5 服服务务器端器端 图图13.6 客客户户端端Java实用教程(第3版)13.3.2组播组播组播地址只能用作目的地址。若客户端对某一个组感兴趣,则可加入该组,成为该组中的一员。以后发送到该组的UDP数据报包,都自动传送到该组中的所有成员。客户端可以随时离开所加入的组,从而不再
27、成为其中的一员,当然也就收不到发到该组的UDP数据报包了。Java对组播有良好的支持,相关的类是.MulticastSocket类。.MulticastSocket类的对象,代表一个组播Socket,可以发送和接收组播包。其实.MulticastSocket类是.DatagramSocket类的子类,只是增加了支持组播功能,因此DatagramSocket类中方法都可以使用。组播包就是一个UDP数据报包。lMulticastSocket的构造方法如下:MulticastSocket()throwsIOException功能:创建一个组播Socket。MulticastSocket(intpor
28、t)throwsIOException功能:在指定端口上创建一个组播Socket。Java实用教程(第3版)13.3.2组播组播方法功能voidjoinGroup(InetAddressmcastaddr)throwsIOException加入一个组,组地址是mcastaddrvoidleaveGroup(InetAddressmcastaddr)throwsIOException离开一个组,组地址是mcastaddrvoidsend(DatagramPacketp,bytettl)throwsIOException发送数据报包p,其生存期为ttl,通常是数据报包经过的路由器个数。voidse
29、tTimeToLive(intttl)throwsIOException设置组播数据包的生存期,0=ttl=255。若ttl为2,则表示最多经过2个路由器,否则数据报包被丢弃。表13.6列出了MulticastSocket类的常用方法。表表13.6 MulticastSocket类类的常用方法的常用方法Java实用教程(第3版)13.3.2组播组播【例例13.4】一个组播程序。程序创建一个组播组,其组播地址为226.1.1.6,接收组播包的端口号是8888。服务器不断向组发送数据报包,组中成员(客户端程序)不断接收组播包,并将内容在屏幕上显示出来。运行上面的组播程序。首先运行客户端程序,再运行
30、服务器程序。其运行结果在各自的界面上显示,如图13.7、图13.8所示。图图13.7服服务务器端器端 图图13.8 客客户户端端Java实用教程(第3版)13.4 URL13.4.1 URL类类类.URL代表一个统一资源定位符,它是指向互联网资源的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。lURL类的构造方法如下:URL(Stringspec)throwsMalformedURLException:功能:由一个表示URL地址的字符串构造一个URL对象。URL(Stringprotocol,Stringhost,intport,Stringf
31、ile)hrowsMalformedURLException功能:根据指定protocol、host、port号和file创建URL对象。URL类的常用方法如表13.7所示。方法功能URLConnectionopenConnection()throwsIOException创建并返回一个URLConnection对象,它表示到URL所引用的远程对象的连接。finalInputStreamopenStream()throwsIOException打开一个连接到该URL的InputStream的对象,通过该对象,可从URL中读取Web页面内容。finalObjectgetContent()thro
32、wsIOException获取此URL的内容。表表13.7 URL类类的常用方法的常用方法Java实用教程(第3版)13.4.1 URL类类【例例13.5】创建一个URL对象,通过URL,读取网页内容。运行程序,在地址栏中输入要访问的网址,例如谷歌的首页地址“http:/ 使用使用URLJava实用教程(第3版)13.4.2 URLConnetction类类有时,需要通过URL进行读写操作,这时使用URLConnection就比较方便了,该类的对象表示一个URL的连接,通常由URL对象调用openConnection()来获得。lURLConnection的构造方法如下:protectedUR
33、LConnection(URLurl):构造一个到指定URL的URL连接。URLConnection类的常用方法如表13.8所示。方法功能InputStreamgetInputStream()throwsIOException打开一个连接到该URL的InputStream的对象,通过该对象,可从URL中读取Web页面内容。OutputStreamgetOutputStream()throwsIOException生成一个向该连接写入数据的OutputStream对象。voidsetDoInput(Booleandoinput)若参数doinput是true,表示通过该URLConnection
34、进行读操作,即从服务器读取页面内容。默认情况是true,用时读取内容。voidsetDoOutput(Booleandooutput)若参数dooutput是true,表示通过该URLConnection进行写操作。即向服务器上的CGI程序(如ASP程序、JSP程序等)上传内容,默认是false。abstractvoidconnect()throwsIOException向URL对象所表示的资源发起连接。若已存在这样的连接,则该方法不做任何动作。StringgetHeaderFieldKey(intn)返回HTTP响应头中第n个域的“名-值”对中“名”这一部分内容,n从1开始。Stringge
35、tHeaderField(intn)返回HTTP响应头中第n个域的“名-值”对中“值”这一部分的内容,n从1开始。表表13.8 URLConnection类类的常用方法的常用方法Java实用教程(第3版)13.4.2 URLConnetction类类【例例13.6】创建URL和URLConnection对象,通过URLConnection获取网页信息。运行程序,在地址栏中输入要访问的网址,例如百度的首页地址“http:/ 使用使用URLConnectionJava实用教程(第3版)13.5 综合实例综合实例思路分析思路分析:要实现多人同时聊天,首先服务器端要使用多线程的方式,服务器端的主进程不断监听客户端发起的连接。如果监听到客户端发起的连接请求,服务器端接收此连接请求,并创建一个从属进程接受客户端发送过来的数据。接收到数据之后,再转发到所有的客户端。首先运行服务器程序ChatServer.java,接着启动两个客户端程序,出现两个客户端窗口。两个客户端之间就可以互相发送数据。在各自的窗口上显示发送的数据和接收的数据,如图13.11、图13.12所示。图图13.11 一个客一个客户户端端(1)图图13.12 一个客一个客户户端端(2)
限制150内