JAVA语言项目11JAVA网络编程课件_第1页
JAVA语言项目11JAVA网络编程课件_第2页
JAVA语言项目11JAVA网络编程课件_第3页
JAVA语言项目11JAVA网络编程课件_第4页
JAVA语言项目11JAVA网络编程课件_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

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

文档简介

1、Java语言和计算机网络紧密相连,Java语言就是伴随着互联网的发展而不断成熟的。Java最出色的一个特点就是对网络编程提供了强大的支持。网络上计算机之间的通信实质上就是计算机上的应用程序之间进行通信。网络程序设计的目的就是直接或间接地通过网络协议与其他计算机的相关程序进行数据传输,从而实现网络通信。网络程序设计通常涉及一个服务器和一个或多个客户机。客户机向服务器发送请求,服务器响应请求。因此,本帝通过一个Server - Client模型的网络聊天程序的项日案例开发,来了解Java的网络编程知识。下一页项目11 Java网络编程第1页,共75页。项目11 Java网络编程11.1 项目概述1

2、1.2 项目目的11.3 项目支撑知识11.4 项目实施11.5 项目总结11.6 扩展演练第2页,共75页。11.1 项目概述本项目说明如何利用Socket开发一个Server-Client模型的网络聊天程序。客户端向服务器发送请求,尝试服务器建立连接,服务器可能接受或拒绝请求。一旦建立连接,客户端和服务器就可以进行通信。返回第3页,共75页。11.2 项目目的.了解网络编程原理。.理解TCP/IP体系结构。.掌握InetAddress类、Socket类及ServerSocket类等的使用。.掌握基于TCP协议的Socket网络编程。返回第4页,共75页。11.3 项目支撑知识11.3.1项

3、目开发背景知识1 网络编程概述网络编程中有两个主要的问题,一个是如何准确地定位网络上一台或多台主机及在主机上运行的应用程序,另一个就是找到主机及应用程序后如何可靠高效地进行数据传输。1.网络通信基础下一页返回第5页,共75页。11.3 项目支撑知识网络通信是采用网络协议实现计算机之间的数据交换。所谓网络协议是指通信双方约定好的规则集合,通常使用TCP/IP协议。在TCP/IP体系结构中网络层主要负责网络主机的定位和数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机。而传输层则提供面向应用的可靠的或非可靠的数据传输机制,来保证应用程序的正常运行。先了解以下几个概念。上一页下一页

4、返回第6页,共75页。11.3 项目支撑知识IP地址:即给每个连接在Internet上的主机分配一个在全世界范围唯一的32bit地址。IP地址的结构使在Internet上寻址很方便。IP地址通常用更直观的、以圆点分隔号的4个十进制数字表示,每一个数字对应于8个二进制的比特串。端口号(Port Number):网络通信时同一机器上的不同进程的标识,其中11024为系统保留的端口号。每一项标准的Internet服务都有自己独特的端口号,该端口在所有的计算机上均相同。例如,ftp具有默认端口21, http具有默认端口80。服务类型(Service):网络的各种服务。例如,超文本传输协议(HTTP)

5、,文件传输协议(FTP),远程登录(Telnet),简单邮件传输协议(SMTP)。上一页下一页返回第7页,共75页。11.3 项目支撑知识套接字(Socket):当一台主机上有多个进程同时进行通信,如何区别从网络中传递来的数据是一个问题,解决的方法就是在传输层提供向上服务的端口号。端口号其实标识了运行在某台计算机上的某个进程,所以一个在Internet上运行的应用程序可以用IP地址和端口号进行标识,这就是套接字(Socket)。传输层以实现计算机系统端到端的通信为日的,该层提供了两种实现端到端通信的方法,即面向连接方法和无连接方法。这两种方法对应着两个主要协议,一个是TCP ( Transfe

6、r Control Protocol)协议,另一个是UDP ( User Datagram Protocol)协议。上一页下一页返回第8页,共75页。11.3 项目支撑知识TCP是一种面向连接的保证可靠传输的协议。通过TCP协议实现的传输,得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个socket之间必须建立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送或接收操作。UDP是一种无连接的协议,每个数据报都

7、是一个独立的信息,包括完整的源地址和目的地址,它通过网络上任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的,即UDP协议是不可靠的。上一页下一页返回第9页,共75页。上一页11.3 项目支撑知识使用UDP时,每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接。对于TCP协议,由于它是一个面向连接的协议,在socket之间进行数据传输之前必然要建立连接,所以在TCP中多了一个连接建立的时间。使用UDP传输数据时是有大小限制的,每个被传输的数据报必须限定在64 KB之内。而TCP没有这方面的限制,一旦连接建立起来,双方的socket

8、就可以按统一的格式传输大量的数据。UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。而TCP是一个可靠的协议,它确保接收方完全正确地获取发送方所发送的全部数据。下一页返回第10页,共75页。11.3 项目支撑知识总之,TCP在网络通信上有极强的生命力,例如远程连接(Telnet)和文件传输(FTP)都需要不定长度的数据被可靠地传输。相比之下,UDP操作简单,仅需要较少的监护,因此通常用于局域网高可靠性的分散系统client/server应用程序中。可靠的传输是要付出代价的,对数据内容正确性的检验必然占用计算机的处理时间和网络的带宽,因此在多次少量的非紧要数据的传输中

9、TCP传输的效率不如UDP高。在许多应用中并不需要保证严格的传输可靠性,比如视频会议系统,并不要求音频视频数据绝对的正确,只要保证连贯性就可以了,这种情况下显然使用UDP会更合理。上一页下一页返回第11页,共75页。11.3 项目支撑知识2.InetAddress类Java中与网络通信有关的类都存在于J包中。InetAddress类用于获得目标主机的IP地址。该类提供了通过IP主机名获得IP主机地址的方法,而主机名对于使用者远比IP地址来得方便。该类中常用的方法如下。(1) GetHostName():返回该地址的主机名。如果主机名为null ,那么,当前地址指向当地机器的任一可得网络地址,返

10、回值类型为string。(2) GetHostAddress():以“%d%d%d%d”的形式返回IP地址串。返回值类型为string。上一页下一页返回第12页,共75页。11.3 项目支撑知识(3)GelByName (stringhost):返回指定主机的IP地址。如果主机名为null ,则返回当地机器的默认地址。参数host表示指定的主机,返回值类型为InetAddress。 (4)GetAllByName (string host):返回指定主机名的所有InetAddrcss对象。参数host表示指定的主机。返回值存放于InetAddrcss数组中。(5)GetLocalHost():

11、返回本地主机的InetAddrcss对象。由于InetAddrcss类没有构造方法,它的实例对象需要过方法getByName()、getLocalHost()以及getAllByName()来建立。上一页下一页返回第13页,共75页。11.3 项目支撑知识【例11-1】源程序名GetLocalHostIP.Java,获取本机的IP地址。上一页下一页返回第14页,共75页。11.3 项目支撑知识【运行结果】如图11-1所示。【程序分析】第6行通过创建InetAddrcss类的GetLocalHost()方法来达到获取主机IP的目的。11.3.2项目开发背景知识2: Java与Socket编程So

12、cket编程是网络编程的核心内容。网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一端称为一个套接字(Socket)。套接字通常用来实现客户方和服务方的连接。上一页下一页返回第15页,共75页。11.3 项目支撑知识Socket可理解是一种用于表达两台机器之间连接“终端”的软件抽象。对于一个给定的连接,在每台机器上都有一个socket,可以想象一个虚拟的“电缆”工作在两台机器之间,“电缆”插在两台机器的socket上。当然,物理硬件和两台机器之间的“电缆”这些连接装置都是未知的,抽象的所有目的就是为了让我们不必了解更多的细节。简单地说,一台计算机上的socket同另一台计算

13、机通话创建一个通信信道,程序员可以用这个信道在两台机器之间发送数据。在Java环境下,套接字编程主要是指基于TCP/IP协议的网络编程。一个套接字由一个IP地址和一个端口号唯一确定。上一页下一页返回第16页,共75页。11.3 项目支撑知识1.Java中面向连接的流式Socket的通信机制无论一个Socket的通信功能多么齐全,程序多么复杂,其基本结构都是一样的,具体过程如图11-2所示。server端首先在某个端口创建一个监听Client请求的监听服务并处于监听状态,当Client向server端的这个端口提出连接请求时,server端和Client端就建立了一个连接和一条传输数据的通道,通

14、信结束时,这个连接通道将被拆除。具体来说,所有的客户端程序都必须遵守下面的基本的步骤。(1)建立客户端socket连接。(2)得到socket的读和写的流。上一页下一页返回第17页,共75页。11.3 项目支撑知识(3) 利用流。(4)关闭流。(5)关闭socket。所有的服务器都要有以下的基本的步骤。(1)建立一个服务器socket并开始监听。(2)使用accept()方法取得新的连接。(3)建立输入和输出流。(4)在已有的协议上产生会话。(5)关闭客户端流和socket。上一页下一页返回第18页,共75页。11.3 项目支撑知识(6)回到第2步或者到第7步。(7)关闭服务器socket。2

15、.Socket类和ServerSocket类在表11-1中有两个不同的对象:Socket对象和ServerSocket对象。这两个对象就是从J中提供的两个类Socket和ServerSocket派生出来的。类Socket和类ServerSocket是两个封装得非常好的类,它们是用Java实现流式Socket通信的主要工具。创建一个Socket对象就建立了一个Client和Server之间的连接,创建一个ServerSocket对象就创建了一个监听服务。下面具体介绍这两个类。上一页下一页返回第19页,共75页。11.3 项目支撑知识构造函数中的port是用来连接的端口号。maxqueue是队列长

16、度,该参数告诉系统多少与之连接的客户在系统拒绝连接之前可以挂起,默认值是50。在一个多地址主机上,localAddr用来指定该套接字约束的IP地址。(1)Socket类。在Java中,一个Socket就代表了一个TCP连接,当客户端要与服务器端连接时,首先要创建一个Socket对象,服务器端按照上文所述过程产生另一个Socket对象与其建立一个基于流的通信信道。Socket对象创建后会自动与指定的主机和端口进行连接,这一过程也有可能发生异常,系统会抛出一个IOException异常。上一页下一页返回第20页,共75页。11.3 项目支撑知识当Client需要与Server端连接,以获取信息或服

17、务时,需要创建一个Socket对象,通常的写法如下:注意:引号中应写服务器主机的名称或地址,第二个参数是服务器端进行监i听服务的端口号,端口号通常应大于1023,以防止与常用服务的端口冲突。Socket对象创建后与服务器端进行连接,如果成功就建立了一个通信通道,就可以进行数据通信。如果要进行数据交换,还需要使用一些方法。Socket类提供了方法getInputStream和getOutStream()来得到对应的输入/输出流以进行读/写操作,这两个方法分别返回InputStream和OutputSteam类对象。上一页下一页返回第21页,共75页。11.3 项目支撑知识通信结束,可以调用Soc

18、ked对象的close方法关闭,其写法如下:cliSockct.close();(2)ServerSocket 类。当创建一个ServerSocket类,它会在系统注册自己对客户连接感兴趣ServerSocket类的构造方法如下:通常可以使用最简单的构造方法产生一个ServerSocket对象:ServerSocket listener=newServerSocket(4000);上一页下一页返回第22页,共75页。11.3 项目支撑知识这里指定的监听服务端口是4000。用户在一台计算机上可以同时建立多个ServerSocket 对象,并分配不同的端口号,实现不同的服务。这样,Client连接

19、到哪个端口,就可以接受哪种服务。ServerSocket对象建立后还需要与Client建立连接,这时需要执行如下语行。Socket linkSocket=listener.accept();accept是ServerSocket类的一个方法,用来捕捉来自客户端的连接请求,并建立一个与客户端通信的Socket类对象linkSocket,负责与客户端连接。今后,Server端程序只需要向这个Socket对象读写数据,就可以实现向远端的Client读写数据。上一页下一页返回第23页,共75页。11.3 项目支撑知识当要结束监听时,需要执行如下语行关闭ServerSocket对象,释放其占用的资源即可

20、。Listener. close();下面以服务器端为例,具体描述一下Socket类和ServerSocket类在服务器端程序编写的步骤。(1)打开Socked,创建ServerSocket对象。ServerSocket s s=new ServerSocket(端口号);(2)等待客户机的连接。Socket sc=s.acccpt();上一页下一页返回第24页,共75页。11.3 项目支撑知识通过ServerSocket对象的accept ()方法可以接收客户机程序的连接请求,其返回值是一个socket类型的对象。程序运行到这里将处于等待状态。(3)生成输入输出流。通过ServerSocke

21、t对象的GetOutputStream()和GetInputsream()方法可以分别获得输出、输入流。例如:上一页下一页返回第25页,共75页。11.3 项目支撑知识输入输出流是网络编程的实质性部分,具体如何构造所需要的过滤流,要根据需要而定,能否运用自如主要看读者对Java中输入输出部分掌握如何。(4)处理输人输出流。上一页下一页返回第26页,共75页。11.3 项目支撑知识通过输入流可以读取客户机程序发来的信息;通过输出流可以向客户机程序发信息。具体编程时所要考虑的是何时读取信息以及何时发送信息。类Socket提供了方法getInputStream()和getOutStream()来得到

22、对应的输入/输出流以进行读/写操作,这两个方法分别返回InputStream和OutputSteam类对象。为了便于读/写数据,可以在返回的输入/输出流对象上建立过滤流,如DataInputStream, DataOutputStream或PrintStream类对象,对于文本方式流对象,可以采用InputStreamReader和OutputStreamWriter, PrintWirter等处理。例如:上一页下一页返回第27页,共75页。上一页11.3 项目支撑知识(5)关闭Socket下一页返回第28页,共75页。11.3 项目支撑知识每一个Socket存在时,都将占用一定的资源,在So

23、cket对象使用完毕时,要将其关闭。关闭Socket可以调用Socket的Close()方法。在关闭Socket之前,应将与Socket相关的所有的输入/输出流全部关闭,以释放所有的资源。而且要注意关闭的顺序,与Socket相关的所有的输入/输出该首先关闭,然后再关闭Socket。上一页下一页返回第29页,共75页。11.3 项目支撑知识尽管Java有自动回收机制,网络资源最终是会被释放的。但是为了有效地利用资源,建议读者按照合理的顺序主动释放资源。以上过程在采用线程编程时,(1) (2)可以放在主程序的循环中,反复接收各个用户的连接请求。接收到客户机的连接请求后,(3) (4)可以交给线程处

24、理。上一页返回第30页,共75页。11.4 项目实施这里要设计两个程序。首先是服务器程序Server.Java,然后是客户端程序Client.Java。11.4.1服务器程序的实现服务器程序Server.Java使用Server Socket类监听指定端口,端口可随意指定(由于1024以下的端口通常属于保留端口,所以一般使用大于1024的端口),等待客户的连接请求。客户连接成功后,即服务器一客户端套接字建立,在服务器和客户端之间就形成了一条通道,这时站在服务器的角度看,客户端就相当于一个输入输出设备,就可以使用Socket类提供的两个方法getInputStream()和getOunputSt

25、ream()来对客户端读写信息。下一页返回第31页,共75页。11.4 项目实施上一页下一页返回第32页,共75页。11.4 项目实施上一页下一页返回第33页,共75页。11.4 项目实施上一页下一页返回第34页,共75页。11.4 项目实施上一页下一页返回第35页,共75页。11.4 项目实施上一页下一页返回第36页,共75页。11.4 项目实施上一页下一页返回第37页,共75页。11.4 项目实施上一页下一页返回第38页,共75页。11.4 项目实施上一页下一页返回第39页,共75页。11.4 项目实施【程序运行分析】 (1)首先运行服务器程序,显示界面如下图11-3,当单击监听按钮后,服

26、务器开始挂起等待客户的连接请求。上一页下一页返回第40页,共75页。11.4 项目实施(2)一旦连接成功,服务器即可和客户端之间发送和接收信息。运行界面如图11-4所示.11.4.2客户端程序的实现客户端程序Client.Java使用Socked类向指定服务器及端口发出连接请求,连接成功后,形成服务器一客户端之间的套接字,即在服务器一客户端之间就形成了一条通道,这时站在客户端的角度看,服务器相当于一个输入输出设备,可以通过Socket类提供的两个方法getInputStream()和getOutputStream()来对服务器读写信息。上一页下一页返回第41页,共75页。11.4 项目实施上一

27、页下一页返回第42页,共75页。11.4 项目实施上一页下一页返回第43页,共75页。11.4 项目实施上一页下一页返回第44页,共75页。11.4 项目实施上一页下一页返回第45页,共75页。11.4 项目实施上一页下一页返回第46页,共75页。11.4 项目实施上一页下一页返回第47页,共75页。11.4 项目实施上一页下一页返回第48页,共75页。11.4 项目实施上一页下一页返回第49页,共75页。11.4 项目实施【程序运行分析】(1)客户端程序初始运行界面如图11-5,当单击连接按钮后,客户端向服务器的指定端口发出连接请求。(2)一旦连接成功,客户端即可和服务器之间发送和接收信息。

28、运行界面如图11-6所示。上一页返回第50页,共75页。11.5 项目总结本帝的两个案例展示厂网络应用中典型的C/S结构,都是基于TCP的应用。通过以上的学习,应该对Java的面向流的网络编程有了一个比较全面的认识。下面介绍基于UDP协议的网络编程。前面在介绍TCP/IP协议的时候,我们已经提到,在TCP/IP协议的传输层除厂TCP协议之外还有一个UDP协议,相比而言UDP的应用不如TCP广泛,几个标准的应用层协议HTTP, FTP, SMTP二使用的都是TCP协议。但是,随着计算机网络的发展,UDP协议正越来越显示出其威力,尤其是在需要很强的实时交互性的场合,如网络游戏,视频会议等,UDP更

29、是显示出极强的威力,下面我们就介绍一下Java环境下如何实现UDP网络传输。下一页返回第51页,共75页。11.5 项目总结包J中提供了两个类DatagramSocket和DatagramPacket用来支持数据报通信, DatagramSocket用于在程序之间建立传送数据报的通信连接, DatagramPacket则用来表示一个数据报。1 .DatagramSocket类构造方法:DatagramSocket();DatagramSocket(int prot);DatagramSocket(int port,InetAddress laddr)上一页下一页返回第52页,共75页。11.5

30、 项目总结其中,port指明socket所使用的端口号,如果未指明端口号,则把socket连接到本地主机上一个可用的端口。laddr指明一个可用的本地地址。给出端口号时要保证不发生端口冲突,否则会生成SocketException类例外。注意:上述的两个构造方法都声明抛弃非运行时例SocketException,程序中必须进行处理,或者捕获、或者声明抛弃。第一个构造方法用来构造一个用于发送数据报的SocketException类,后两种构造方法用来构造一个用于接收的SocketException类。上一页下一页返回第53页,共75页。11.5 项目总结2.DatagramPacket类用数据报

31、方式编写client/server程序时,无论在客户端还是服务器端,首先都要建立一个DatagramPacket对象,用来接收或发送数据报,然后使用DatagramPacket类对象作为传输数据的载体。构造方法:上一页下一页返回第54页,共75页。11.5 项目总结其中,buf中存放数据报数据,length为数据报中数据的长度,addr和port指明日的地址,offset指明了数据报的位移量。在接收数据前,应该采用上面的第一种方法生成一个DatagramPacket对象,给出接收数据的缓冲区及其长度。然后调用DatagramSocket的方法receive()等待数据报的到来, receive()将一直等待,直到收到一个数据报为止。上一页下一页返回第55页,共75页。11.5 项目总结发送数据前,也要先生成一个新的Datagr

温馨提示

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

评论

0/150

提交评论