JAVA语言项目11JAVA网络编程.ppt
Java语言和计算机网络紧密相连,语言和计算机网络紧密相连,Java语言就是伴随着互语言就是伴随着互联网的发展而不断成熟的。联网的发展而不断成熟的。Java最出色的一个特点就是对网最出色的一个特点就是对网络编程提供了强大的支持。络编程提供了强大的支持。网络上计算机之间的通信实质上就是计算机上的应用程序之网络上计算机之间的通信实质上就是计算机上的应用程序之间进行通信。网络程序设计的目的就是直接或间接地通过网间进行通信。网络程序设计的目的就是直接或间接地通过网络协议与其他计算机的相关程序进行数据传输,从而实现网络协议与其他计算机的相关程序进行数据传输,从而实现网络通信。网络程序设计通常涉及一个服务器和一个或多个客络通信。网络程序设计通常涉及一个服务器和一个或多个客户机。客户机向服务器发送请求,服务器响应请求。因此,户机。客户机向服务器发送请求,服务器响应请求。因此,本帝通过一个本帝通过一个Server-Client模型的网络聊天程序的项日模型的网络聊天程序的项日案例开发,来了解案例开发,来了解Java的网络编程知识。的网络编程知识。下一页项目项目11 Java网络编程网络编程项目项目11 Java网络编程网络编程11.1 项目概述项目概述11.2 项目目的项目目的11.3 项目支撑知识项目支撑知识11.4 项目实施项目实施11.5 项目总结项目总结11.6 扩展演练扩展演练11.1 项目概述项目概述本项目说明如何利用本项目说明如何利用Socket开发一个开发一个Server-Client模型模型的网络聊天程序。客户端向服务器发送请求,尝试服务器建的网络聊天程序。客户端向服务器发送请求,尝试服务器建立连接,服务器可能接受或拒绝请求。一旦建立连接,客户立连接,服务器可能接受或拒绝请求。一旦建立连接,客户端和服务器就可以进行通信。端和服务器就可以进行通信。返回11.2 项目目的项目目的.了解网络编程原理。了解网络编程原理。.理解理解TCP/IP体系结构。体系结构。.掌握掌握InetAddress类、类、Socket类及类及ServerSocket类等类等的使用。的使用。.掌握基于掌握基于TCP协议的协议的Socket网络编程。网络编程。返回11.3 项目支撑知识项目支撑知识项目开发背景知识项目开发背景知识1 网络编程概述网络编程概述网络编程中有两个主要的问题,一个是如何准确地定位网络网络编程中有两个主要的问题,一个是如何准确地定位网络上一台或多台主机及在主机上运行的应用程序,另一个就是上一台或多台主机及在主机上运行的应用程序,另一个就是找到主机及应用程序后如何可靠高效地进行数据传输。找到主机及应用程序后如何可靠高效地进行数据传输。1.网络通信基础网络通信基础下一页返回11.3 项目支撑知识项目支撑知识网络通信是采用网络协议实现计算机之间的数据交换。所谓网络通信是采用网络协议实现计算机之间的数据交换。所谓网络协议是指通信双方约定好的规则集合,通常使用网络协议是指通信双方约定好的规则集合,通常使用TCP/IP协议。在协议。在TCP/IP体系结构中网络层主要负责网络体系结构中网络层主要负责网络主机的定位和数据传输的路由,由主机的定位和数据传输的路由,由IP地址可以唯一地确定地址可以唯一地确定Internet上的一台主机。而传输层则提供面向应用的可靠的上的一台主机。而传输层则提供面向应用的可靠的或非可靠的数据传输机制,来保证应用程序的正常运行。或非可靠的数据传输机制,来保证应用程序的正常运行。先了解以下几个概念。先了解以下几个概念。上一页 下一页返回11.3 项目支撑知识项目支撑知识IP地址地址:即给每个连接在即给每个连接在Internet上的主机分配一个在全世上的主机分配一个在全世界范围唯一的界范围唯一的32bit地址。地址。IP地址的结构使在地址的结构使在Internet上上寻址很方便。寻址很方便。IP地址通常用更直观的、以圆点分隔号的地址通常用更直观的、以圆点分隔号的4个个十进制数字表示,每一个数字对应于十进制数字表示,每一个数字对应于8个二进制的比特串。个二进制的比特串。端口号端口号(Port Number):网络通信时同一机器上的不同进程网络通信时同一机器上的不同进程的标识,其中的标识,其中11024为系统保留的端口号。每一项标准的为系统保留的端口号。每一项标准的Internet服务都有自己独特的端口号,该端口在所有的计算服务都有自己独特的端口号,该端口在所有的计算机上均相同。例如,机上均相同。例如,ftp具有默认端口具有默认端口21,http具有默认端具有默认端口口80。服务类型。服务类型(Service):网络的各种服务。例如,超文网络的各种服务。例如,超文本传输协议本传输协议(HTTP),文件传输协议,文件传输协议(FTP),远程登录,远程登录(Telnet),简单邮件传输协议,简单邮件传输协议(SMTP)。上一页 下一页返回11.3 项目支撑知识项目支撑知识套接字套接字(Socket):当一台主机上有多个进程同时进行通信,当一台主机上有多个进程同时进行通信,如何区别从网络中传递来的数据是一个问题,解决的方法就如何区别从网络中传递来的数据是一个问题,解决的方法就是在传输层提供向上服务的端口号。端口号其实标识了运行是在传输层提供向上服务的端口号。端口号其实标识了运行在某台计算机上的某个进程,所以一个在在某台计算机上的某个进程,所以一个在Internet上运行的上运行的应用程序可以用应用程序可以用IP地址和端口号进行标识,这就是套接字地址和端口号进行标识,这就是套接字(Socket)。传输层以实现计算机系统端到端的通信为日的,该层提供了传输层以实现计算机系统端到端的通信为日的,该层提供了两种实现端到端通信的方法,即面向连接方法和无连接方法。两种实现端到端通信的方法,即面向连接方法和无连接方法。这两种方法对应着两个主要协议,一个是这两种方法对应着两个主要协议,一个是TCP (Transfer Control Protocol)协议,另一个是协议,另一个是UDP (User Datagram Protocol)协议。协议。上一页 下一页返回11.3 项目支撑知识项目支撑知识TCP是一种面向连接的保证可靠传输的协议。通过是一种面向连接的保证可靠传输的协议。通过TCP协议协议实现的传输,得到的是一个顺序的无差错的数据流。发送方实现的传输,得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个和接收方的成对的两个socket之间必须建立连接,以便在之间必须建立连接,以便在TCP协议的基础上进行通信,当一个协议的基础上进行通信,当一个socket(通常都是通常都是server socket)等待建立连接时,另一个等待建立连接时,另一个socket可以要可以要求进行连接,一旦这两个求进行连接,一旦这两个socket连接起来,它们就可以进行连接起来,它们就可以进行双向数据传输,双方都可以进行发送或接收操作。双向数据传输,双方都可以进行发送或接收操作。UDP是一种无连接的协议,每个数据报都是一个独立的信息,是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址和目的地址,它通过网络上任何可能的路包括完整的源地址和目的地址,它通过网络上任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的,即及内容的正确性都是不能被保证的,即UDP协议是不可靠的。协议是不可靠的。上一页 下一页返回上一页11.3 项目支撑知识项目支撑知识使用使用UDP时,每个数据报中都给出了完整的地址信息,因此时,每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接。对于无需要建立发送方和接收方的连接。对于TCP协议,由于它协议,由于它是一个面向连接的协议,在是一个面向连接的协议,在socket之间进行数据传输之前必之间进行数据传输之前必然要建立连接,所以在然要建立连接,所以在TCP中多了一个连接建立的时间。中多了一个连接建立的时间。使用使用UDP传输数据时是有大小限制的,每个被传输的数据报传输数据时是有大小限制的,每个被传输的数据报必须限定在必须限定在64 KB之内。而之内。而TCP没有这方面的限制,一旦连没有这方面的限制,一旦连接建立起来,双方的接建立起来,双方的socket就可以按统一的格式传输大量的就可以按统一的格式传输大量的数据。数据。UDP是一个不可靠的协议,发送方所发送的数据报并是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。而不一定以相同的次序到达接收方。而TCP是一个可靠的协议,是一个可靠的协议,它确保接收方完全正确地获取发送方所发送的全部数据。它确保接收方完全正确地获取发送方所发送的全部数据。下一页返回11.3 项目支撑知识项目支撑知识总之,总之,TCP在网络通信上有极强的生命力,例如远程连接在网络通信上有极强的生命力,例如远程连接(Telnet)和文件传输和文件传输(FTP)都需要不定长度的数据被可靠都需要不定长度的数据被可靠地传输。相比之下,地传输。相比之下,UDP操作简单,仅需要较少的监护,因操作简单,仅需要较少的监护,因此通常用于局域网高可靠性的分散系统此通常用于局域网高可靠性的分散系统client/server应用应用程序中。程序中。可靠的传输是要付出代价的,对数据内容正确性的检验必然可靠的传输是要付出代价的,对数据内容正确性的检验必然占用计算机的处理时间和网络的带宽,因此在多次少量的非占用计算机的处理时间和网络的带宽,因此在多次少量的非紧要数据的传输中紧要数据的传输中TCP传输的效率不如传输的效率不如UDP高。在许多应用高。在许多应用中并不需要保证严格的传输可靠性,比如视频会议系统,并中并不需要保证严格的传输可靠性,比如视频会议系统,并不要求音频视频数据绝对的正确,只要保证连贯性就可以了,不要求音频视频数据绝对的正确,只要保证连贯性就可以了,这种情况下显然使用这种情况下显然使用UDP会更合理。会更合理。上一页 下一页返回11.3 项目支撑知识项目支撑知识2.InetAddress类类Java中与网络通信有关的类都存在于中与网络通信有关的类都存在于J包中。包中。InetAddress类用于获得目标主机的类用于获得目标主机的IP地址。该类提供了地址。该类提供了通过通过IP主机名获得主机名获得IP主机地址的方法,而主机名对于使用者主机地址的方法,而主机名对于使用者远比远比IP地址来得方便。该类中常用的方法如下。地址来得方便。该类中常用的方法如下。(1)GetHostName():返回该地址的主机名。如果主机名返回该地址的主机名。如果主机名为为null,那么,当前地址指向当地机器的任一可得网络地址,那么,当前地址指向当地机器的任一可得网络地址,返回值类型为返回值类型为string。(2)GetHostAddress():以以“%d%d%d%d”的形式返回的形式返回IP地址串。返回值类型为地址串。返回值类型为string。上一页 下一页返回11.3 项目支撑知识项目支撑知识(3)GelByName (stringhost):返回指定主机的返回指定主机的IP地址。地址。如果主机名为如果主机名为null,则返回当地机器的默认地址。参数则返回当地机器的默认地址。参数host表示指定的主机,返回值类型为表示指定的主机,返回值类型为InetAddress。(4)GetAllByName (string host):返回指定主机名的返回指定主机名的所有所有InetAddrcss对象。参数对象。参数host表示指定的主机。返回表示指定的主机。返回值存放于值存放于InetAddrcss数组中。数组中。(5)GetLocalHost():返回本地主机的返回本地主机的InetAddrcss对象。对象。由于由于InetAddrcss类没有构造方法,它的实例对象需要过类没有构造方法,它的实例对象需要过方法方法getByName()、getLocalHost()以及以及getAllByName()来建立。来建立。上一页 下一页返回11.3 项目支撑知识项目支撑知识【例例11-1】源程序名源程序名GetLocalHostIP.Java,获取本机,获取本机的的IP地址。地址。上一页 下一页返回11.3 项目支撑知识项目支撑知识【运行结果运行结果】如如图图11-1所示。所示。【程序分析程序分析】第第6行通过创建行通过创建InetAddrcss类的类的GetLocalHost()方法方法来达到获取主机来达到获取主机IP的目的。的目的。项目开发背景知识项目开发背景知识2:Java与与Socket编编程程Socket编程是网络编程的核心内容。网络上的两个程序通编程是网络编程的核心内容。网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一过一个双向的通信连接实现数据的交换,这个双向链路的一端称为一个套接字端称为一个套接字(Socket)。套接字通常用来实现客户方。套接字通常用来实现客户方和服务方的连接。和服务方的连接。上一页 下一页返回11.3 项目支撑知识项目支撑知识Socket可理解是一种用于表达两台机器之间连接可理解是一种用于表达两台机器之间连接“终端终端”的软件抽象。对于一个给定的连接,在每台机器上都有一个的软件抽象。对于一个给定的连接,在每台机器上都有一个socket,可以想象一个虚拟的,可以想象一个虚拟的“电缆电缆”工作在两台机器之间,工作在两台机器之间,“电缆电缆”插在两台机器的插在两台机器的socket上。当然,物理硬件和两台上。当然,物理硬件和两台机器之间的机器之间的“电缆电缆”这些连接装置都是未知的,抽象的所有这些连接装置都是未知的,抽象的所有目的就是为了让我们不必了解更多的细节。目的就是为了让我们不必了解更多的细节。简单地说,一台计算机上的简单地说,一台计算机上的socket同另一台计算机通话创建同另一台计算机通话创建一个通信信道,程序员可以用这个信道在两台机器之间发送一个通信信道,程序员可以用这个信道在两台机器之间发送数据。在数据。在Java环境下,套接字编程主要是指基于环境下,套接字编程主要是指基于TCP/IP协协议的网络编程。一个套接字由一个议的网络编程。一个套接字由一个IP地址和一个端口号唯一地址和一个端口号唯一确定。确定。上一页 下一页返回11.3 项目支撑知识项目支撑知识1.Java中面向连接的流式中面向连接的流式Socket的通信机制的通信机制无论一个无论一个Socket的通信功能多么齐全,程序多么复杂,其的通信功能多么齐全,程序多么复杂,其基本结构都是一样的,具体过程如基本结构都是一样的,具体过程如图图11-2所示。所示。server端端首先在某个端口创建一个监听首先在某个端口创建一个监听Client请求的监听服务并处于请求的监听服务并处于监听状态,当监听状态,当Client向向server端的这个端口提出连接请求端的这个端口提出连接请求时,时,server端和端和Client端就建立了一个连接和一条传输数端就建立了一个连接和一条传输数据的通道,通信结束时,这个连接通道将被拆除。据的通道,通信结束时,这个连接通道将被拆除。具体来说,所有的客户端程序都必须遵守下面的基本的步骤。具体来说,所有的客户端程序都必须遵守下面的基本的步骤。(1)建立客户端建立客户端socket连接。连接。(2)得到得到socket的读和写的流。的读和写的流。上一页 下一页返回11.3 项目支撑知识项目支撑知识(3)利用流。利用流。(4)关闭流。关闭流。(5)关闭关闭socket。所有的服务器都要有以下的基本的步骤。所有的服务器都要有以下的基本的步骤。(1)建立一个服务器建立一个服务器socket并开始监听。并开始监听。(2)使用使用accept()方法取得新的连接。方法取得新的连接。(3)建立输入和输出流。建立输入和输出流。(4)在已有的协议上产生会话。在已有的协议上产生会话。(5)关闭客户端流和关闭客户端流和socket。上一页 下一页返回11.3 项目支撑知识项目支撑知识(6)回到第回到第2步或者到第步或者到第7步。步。(7)关闭服务器关闭服务器socket。2.Socket类和类和ServerSocket类类在在表表11-1中有两个不同的对象中有两个不同的对象:Socket对象和对象和ServerSocket对象。这两个对象就是从对象。这两个对象就是从J中提供中提供的两个类的两个类Socket和和ServerSocket派生出来的。类派生出来的。类Socket和类和类ServerSocket是两个封装得非常好的类,它是两个封装得非常好的类,它们是用们是用Java实现流式实现流式Socket通信的主要工具。创建一个通信的主要工具。创建一个Socket对象就建立了一个对象就建立了一个Client和和Server之间的连接,创之间的连接,创建一个建一个ServerSocket对象就创建了一个监听服务。下面具对象就创建了一个监听服务。下面具体介绍这两个类。体介绍这两个类。上一页 下一页返回11.3 项目支撑知识项目支撑知识构造函数中的构造函数中的port是用来连接的端口号。是用来连接的端口号。maxqueue是队是队列长度,该参数告诉系统多少与之连接的客户在系统拒绝连列长度,该参数告诉系统多少与之连接的客户在系统拒绝连接之前可以挂起,默认值是接之前可以挂起,默认值是50。在一个多地址主机上,。在一个多地址主机上,localAddr用来指定该套接字约束的用来指定该套接字约束的IP地址。地址。(1)Socket类。类。在在Java中,一个中,一个Socket就代表了一个就代表了一个TCP连接,当客户端连接,当客户端要与服务器端连接时,首先要创建一个要与服务器端连接时,首先要创建一个Socket对象,服务对象,服务器端按照上文所述过程产生另一个器端按照上文所述过程产生另一个Socket对象与其建立一对象与其建立一个基于流的通信信道。个基于流的通信信道。Socket对象创建后会自动与指定的对象创建后会自动与指定的主机和端口进行连接,这一过程也有可能发生异常,系统会主机和端口进行连接,这一过程也有可能发生异常,系统会抛出一个抛出一个IOException异常。异常。上一页 下一页返回11.3 项目支撑知识项目支撑知识当当Client需要与需要与Server端连接,以获取信息或服务时,需端连接,以获取信息或服务时,需要创建一个要创建一个Socket对象,通常的写法如下对象,通常的写法如下:注意注意:引号中应写服务器主机的名称或地址,第二个参数是服引号中应写服务器主机的名称或地址,第二个参数是服务器端进行监务器端进行监i听服务的端口号,端口号通常应大于听服务的端口号,端口号通常应大于1023,以防止与常用服务的端口冲突。以防止与常用服务的端口冲突。Socket对象创建后与服务器端进行连接,如果成功就建立对象创建后与服务器端进行连接,如果成功就建立了一个通信通道,就可以进行数据通信。如果要进行数据交了一个通信通道,就可以进行数据通信。如果要进行数据交换,还需要使用一些方法。换,还需要使用一些方法。Socket类提供了方法类提供了方法getInputStream和和getOutStream()来得到对应的输来得到对应的输入入/输出流以进行读输出流以进行读/写操作,这两个方法分别返回写操作,这两个方法分别返回InputStream和和OutputSteam类对象。类对象。上一页 下一页返回11.3 项目支撑知识项目支撑知识通信结束,可以调用通信结束,可以调用Socked对象的对象的close方法关闭,其写方法关闭,其写法如下法如下:cliSockct.close();(2)ServerSocket 类。类。当创建一个当创建一个ServerSocket类,它会在系统注册自己对客户类,它会在系统注册自己对客户连接感兴趣连接感兴趣ServerSocket类的构造方法如下类的构造方法如下:通常可以使用最简单的构造方法产生一个通常可以使用最简单的构造方法产生一个ServerSocket对对象象:ServerSocket listener=newServerSocket(4000);上一页 下一页返回11.3 项目支撑知识项目支撑知识这里指定的监听服务端口是这里指定的监听服务端口是4000。用户在一台计算机上可。用户在一台计算机上可以同时建立多个以同时建立多个ServerSocket 对象,并分配不同的端口对象,并分配不同的端口号,实现不同的服务。这样,号,实现不同的服务。这样,Client连接到哪个端口,就可连接到哪个端口,就可以接受哪种服务。以接受哪种服务。ServerSocket对象建立后还需要与对象建立后还需要与Client建立连接,这时建立连接,这时需要执行如下语行。需要执行如下语行。Socket linkSocket=listener.accept();accept是是ServerSocket类的一个方法,用来捕捉来自客类的一个方法,用来捕捉来自客户端的连接请求,并建立一个与客户端通信的户端的连接请求,并建立一个与客户端通信的Socket类对类对象象linkSocket,负责与客户端连接。今后,负责与客户端连接。今后,Server端程序端程序只需要向这个只需要向这个Socket对象读写数据,就可以实现向远端的对象读写数据,就可以实现向远端的Client读写数据。读写数据。上一页 下一页返回11.3 项目支撑知识项目支撑知识当要结束监听时,需要执行如下语行关闭当要结束监听时,需要执行如下语行关闭ServerSocket对对象,释放其占用的资源即可。象,释放其占用的资源即可。Listener.close();下面以服务器端为例,具体描述一下下面以服务器端为例,具体描述一下Socket类和类和ServerSocket类在服务器端程序编写的步骤。类在服务器端程序编写的步骤。(1)打开打开Socked,创建,创建ServerSocket对象。对象。ServerSocket s s=new ServerSocket(端口号端口号);(2)等待客户机的连接。等待客户机的连接。Socket sc=s.acccpt();上一页 下一页返回11.3 项目支撑知识项目支撑知识通过通过ServerSocket对象的对象的accept()方法可以接收客户机方法可以接收客户机程序的连接请求,其返回值是一个程序的连接请求,其返回值是一个socket类型的对象。程序类型的对象。程序运行到这里将处于等待状态。运行到这里将处于等待状态。(3)生成输入输出流。生成输入输出流。通过通过ServerSocket对象的对象的GetOutputStream()和和GetInputsream()方法可以方法可以分别获得输出、输入流。例如分别获得输出、输入流。例如:上一页 下一页返回11.3 项目支撑知识项目支撑知识输入输出流是网络编程的实质性部分,具体如何构造所需要输入输出流是网络编程的实质性部分,具体如何构造所需要的过滤流,要根据需要而定,能否运用自如主要看读者对的过滤流,要根据需要而定,能否运用自如主要看读者对Java中输入输出部分掌握如何。中输入输出部分掌握如何。(4)处理输人输出流。处理输人输出流。上一页 下一页返回11.3 项目支撑知识项目支撑知识通过输入流可以读取客户机程序发来的信息通过输入流可以读取客户机程序发来的信息;通过输出流可以通过输出流可以向客户机程序发信息。具体编程时所要考虑的是何时读取信向客户机程序发信息。具体编程时所要考虑的是何时读取信息以及何时发送信息。息以及何时发送信息。类类Socket提供了方法提供了方法getInputStream()和和getOutStream()来得到对应的输入来得到对应的输入/输出流以进行读输出流以进行读/写操作,这两个方法写操作,这两个方法分别返回分别返回InputStream和和OutputSteam类对象。为了便类对象。为了便于读于读/写数据,可以在返回的输入写数据,可以在返回的输入/输出流对象上建立过滤流,输出流对象上建立过滤流,如如DataInputStream,DataOutputStream或或PrintStream类对象,对于文本方式流对象,可以采用类对象,对于文本方式流对象,可以采用InputStreamReader和和OutputStreamWriter,PrintWirter等处理。例如等处理。例如:上一页 下一页返回上一页11.3 项目支撑知识项目支撑知识(5)关闭关闭Socket下一页返回11.3 项目支撑知识项目支撑知识每一个每一个Socket存在时,都将占用一定的资源,在存在时,都将占用一定的资源,在Socket对对象使用完毕时,要将其关闭。关闭象使用完毕时,要将其关闭。关闭Socket可以调用可以调用Socket的的Close()方法。在关闭方法。在关闭Socket之前,应将与之前,应将与Socket相关相关的所有的输入的所有的输入/输出流全部关闭,以释放所有的资源。而且要输出流全部关闭,以释放所有的资源。而且要注意关闭的顺序,与注意关闭的顺序,与Socket相关的所有的输入相关的所有的输入/输出该首先输出该首先关闭,然后再关闭关闭,然后再关闭Socket。上一页 下一页返回11.3 项目支撑知识项目支撑知识尽管尽管Java有自动回收机制,网络资源最终是会被释放的。但有自动回收机制,网络资源最终是会被释放的。但是为了有效地利用资源,建议读者按照合理的顺序主动释放是为了有效地利用资源,建议读者按照合理的顺序主动释放资源。资源。以上过程在采用线程编程时,以上过程在采用线程编程时,(1)(2)可以放在主程序的循可以放在主程序的循环中,反复接收各个用户的连接请求。接收到客户机的连接环中,反复接收各个用户的连接请求。接收到客户机的连接请求后,请求后,(3)(4)可以交给线程处理。可以交给线程处理。上一页返回11.4 项目实施项目实施这里要设计两个程序。首先是服务器程序这里要设计两个程序。首先是服务器程序Server.Java,然,然后是客户端程序后是客户端程序Client.Java。服务器程序的实现服务器程序的实现服务器程序服务器程序Server.Java使用使用Server Socket类监听指定类监听指定端口,端口可随意指定端口,端口可随意指定(由于由于1024以下的端口通常属于保留以下的端口通常属于保留端口,所以一般使用大于端口,所以一般使用大于1024的端口的端口),等待客户的连接请,等待客户的连接请求。客户连接成功后,即服务器一客户端套接字建立,在服求。客户连接成功后,即服务器一客户端套接字建立,在服务器和客户端之间就形成了一条通道,这时站在服务器的角务器和客户端之间就形成了一条通道,这时站在服务器的角度看,客户端就相当于一个输入输出设备,就可以使用度看,客户端就相当于一个输入输出设备,就可以使用Socket类提供的两个方法类提供的两个方法getInputStream()和和getOunputStream()来对客户端读写信息。来对客户端读写信息。下一页返回11.4 项目实施项目实施上一页 下一页返回11.4 项目实施项目实施上一页 下一页返回11.4 项目实施项目实施上一页 下一页返回11.4 项目实施项目实施上一页 下一页返回11.4 项目实施项目实施上一页 下一页返回11.4 项目实施项目实施上一页 下一页返回11.4 项目实施项目实施上一页 下一页返回11.4 项目实施项目实施上一页 下一页返回11.4 项目实施项目实施【程序运行分析程序运行分析】(1)首先运行服务器程序,显示界面如下首先运行服务器程序,显示界面如下图图11-3,当单击监,当单击监听按钮后,服务器开始挂起等待客户的连接请求。听按钮后,服务器开始挂起等待客户的连接请求。上一页 下一页返回11.4 项目实施项目实施(2)一旦连接成功,服务器即可和客户端之间发送和接收信一旦连接成功,服务器即可和客户端之间发送和接收信息。运行界面如息。运行界面如图图11-4所示所示.客户端程序的实现客户端程序的实现客户端程序客户端程序Client.Java使用使用Socked类向指定服务器及端类向指定服务器及端口发出连接请求,连接成功后,形成服务器一客户端之间的口发出连接请求,连接成功后,形成服务器一客户端之间的套接字,即在服务器一客户端之间就形成了一条通道,这时套接字,即在服务器一客户端之间就形成了一条通道,这时站在客户端的角度看,服务器相当于一个输入输出设备,可站在客户端的角度看,服务器相当于一个输入输出设备,可以通过以通过Socket类提供的两个方法类提供的两个方法getInputStream()和和getOutputStream()来对服务器读写信息。来对服务器读写信息。上一页 下一页返回11.4 项目实施项目实施上一页 下一页返回11.4 项目实施项目实施上一页 下一页返回11.4 项目实施项目实施上一页 下一页返回11.4 项目实施项目实施上一页 下一页返回11.4 项目实施项目实施上一页 下一页返回11.4 项目实施项目实施上一页 下一页返回11.4 项目实施项目实施上一页 下一页返回11.4 项目实施项目实施上一页 下一页返回11.4 项目实施项目实施【程序运行分析程序运行分析】(1)客户端程序初始运行界面如客户端程序初始运行界面如图图11-5,当单击连接按钮后,当单击连接按钮后,客户端向服务器的指定端口发出连接请求。客户端向服务器的指定端口发出连接请求。(2)一旦连接成功,客户端即可和服务器之间发送和接收信一旦连接成功,客户端即可和服务器之间发送和接收信息。运行界面如息。运行界面如图图11-6所示。所示。上一页返回11.5 项目总结项目总结本帝的两个案例展示厂网络应用中典型的本帝的两个案例展示厂网络应用中典型的C/S结构,都是基结构,都是基于于TCP的应用。通过以上的学习,应该对的应用。通过以上的学习,应该对Java的面向流的网的面向流的网络编程有了一个比较全面的认识。下面介绍基于络编程有了一个比较全面的认识。下面介绍基于UDP协议的协议的网络编程。网络编程。前面在介绍前面在介绍TCP/IP协议的时候,我们已经提到,在协议的时候,我们已经提到,在TCP/IP协议的传输层除厂协议的传输层除厂TCP协议之外还有一个协议之外还有一个UDP协议,协议,相比而言相比而言UDP的应用不如的应用不如TCP广泛,几个标准的应用层协议广泛,几个标准的应用层协议HTTP,FTP,SMTP二使用的都是二使用的都是TCP协议。但是,协议。但是,随着计算机网络的发展,随着计算机网络的发展,UDP协议正越来越显示出其威力,协议正越来越显示出其威力,尤其是在需要很强的实时交互性的场合,如网络游戏,视频尤其是在需要很强的实时交互性的场合,如网络游戏,视频会议等,会议等,UDP更是显示出极强的威力,下面我们就介绍一下更是显示出极强的威力,下面我们就介绍一下Java环境下如何实现环境下如何实现UDP网络传输。网络传输。下一页返回11.5 项目总结项目总结包包J中提供了两个类中提供了两个类DatagramSocket和和DatagramPacket用来支持数据报通信,用来支持数据报通信,DatagramSocket用于在程序之间建立传送数据报的通信用于在程序之间建立传送数据报的通信连接,连接,DatagramPacket则用来表示一个数据报。则用来表示一个数据报。1.DatagramSocket类类构造方法构造方法:DatagramSocket();DatagramSocket(int prot);DatagramSocket(int port,InetAddress laddr)上一页 下一页返回11.5 项目总结项目总结其中,其中,port指明指明socket所使用的端口号,如果未指明端口所使用的端口号,如果未指明端口号,则把号,则把socket连接到本地主机上一个可用的端口。连接到本地主机上一个可用的端口。laddr指明一个可用的本地地址。给出端口号时要保证不发生端口指明一个可用的本地地址。给出端口号时要保证不发生端口冲突,否则会生成冲突,否则会生成SocketException类例外。注意类例外。注意:上述的上述的两个构造方法都声明抛弃非运行时例两个构造方法都声明抛弃非运行时例SocketException,程序中必须进行处理,或者捕获、或者声明抛弃。程序中必须进行处理,或者捕获、或者声明抛弃。第一个构造方法用来构造一个用于发送数据报的第一个构造方法用来构造一个用于发送数据报的SocketException类,后两种构造方法用来构造一个用于类,后两种构造方法用来构造一个用于接收的接收的SocketException类。类。上一页 下一页返回11.5 项目总结项目总结2.DatagramPacket类类用数据报方式编写用数据报方式编写client/server程序时,无论在客户端还程序时,无论在客户端还是服务器端,首先都要建立一个是服务器端,首先都要建立一个DatagramPacket对象,对象,用来接收或发送数据报,然后使用用来接收或发送数据报,然后使用DatagramPacket类对类对象作为传输数据的载体。象作为传输数据的载体。构造方法构造方法:上一页 下一页返回11.5 项目总结项目总结其中,其中,buf中存放数据报数据,中存放数据报数据,length为数据报中数据的长为数据报中数据的长度,度,addr和和port指明日的地址,指明日的地址,offset指明了数据报的位指明了数据报的位移量。移量。在接收数据前,应该采用上面的第一种方法生成一个在接收数据前,应该采用上面的第一种方法生成一个DatagramPacket对象,给出接收数据的缓冲区及其长度。对象,给出接收数据的缓冲区及其长度。然后调用然后调用DatagramSocket的方法的方法receive()等待数据报等待数据报的到来,的到来,receive()将一直等待,直到收到一个数据报为止。将一直等待,直到收到一个数据报为止。上一页 下一页返回11.5 项目总结项目总结发送数据前,也要先生成一个新的发送数据前,也要先生成一个新的DatagramPacket对象,对象,这时要使用上面的第二种构造方法,在给出存放发送数据的这时要使用上面的第二种构造方法,在给出存放发送数据的缓冲区的同时,还要给出完整的目的地址,包括缓冲区的同时,还要给出完整的目的地址,包括IP地址和端地址和端口号。发送数据是通过口号。发送数据是通过DatagramSocket的方法的方法send()实现的,实现的,send()根据数据报的日的地址来寻径,以传递数根据数据报的日的地址来寻径,以传递数据报。据报。上一页 下一页返回11.5 项目总结项目总结在构造数据报时,要给出在构造数据报时,要给出InetAddress类参数。类类参数。类InetAddress在包在包J中定义,用来表示一个中定义,用来表示一个Internet地址,我们可以通过它提供的类方法地址,我们可以通过它提供的类方法getByName()从一个表示主机名的字符串获取该主机的从一个表示主机名的字符串获取该主机的IP地址,然后再地址,然后再获取相应的地址信息。获取相应的地址信息。下面的例子说明了下面的例子说明了UDP客户端与服务器端通信的实现方法。客户端与服务器端通信的实现方法。文本文件的内容读者可以自己输入。文本文件的内容读者可以自己输入。上一页 下一页返回11.5 项目总结项目总结【例例11-2】基于基于UDP协议的客户端与服务器端通信。协议的客户端与服务器端通信。(1)基于基于UDP协议的网络聊天程序的服务器端程序协议的网络聊天程序的服务器端程序TalkUDPServer.Java。上一页 下一页返回11.5 项目总结项目总结上一页 下一页返回11.5 项目总结项目总结上一页 下一页返回11.5 项目总结项目总结上一页 下一页返回11.5 项目总结项目总结(2)基