Java面向对象程序设计第7章-网络编程基础.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《Java面向对象程序设计第7章-网络编程基础.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 面向 对象 程序设计 网络 编程 基础
- 资源描述:
-
1、网络编程基础网络聊天室n范例演示n需要解决的问题1)如何与对方机器进行连接2)如何找到对应的应用程序3)对收到的信息怎样实现是广播还是一对一?网络编程基础知识解决问题1和2nInternet上互相通信的计算机采用的协议是TCP协议或者UDP协议,它们的结构类似于:应用层(HTTP FTP TELNET.)传输层(TCP UDP.)网络层(IP.)数据链路层网络编程基础知识解决问题1和2nTCP是传输控制协议,也称为“基于数据流的套接字”,根据该协议的设计宗旨,它具有高度的可靠性,而且能保证数据顺利到达目的地。换言之,它允许重传那些由于各种原因半路“走失”的数据。而且收到字节的顺序与它们发出的顺
2、序是一样的。TCP的高可靠性需要付出的代价是:高开销(需要有很多的信息用于控制信息)。n而UDP称为用户数据报协议,它并不刻意追求数据报会完全发送出去,也不能担保抵达的顺序与它们发出时一样。因此,UDP被认为是一种不可靠协议。但是,它的速度快,对于某些应用来说(例如声音),如果速度并质量更重要,就可以采用UDP协议。大多数互联网游戏也是采用UDP协议。网络编程基础知识解决问题1和2n机器标识机器标识 n为了分辨出网络上的每一台机器,必须有一种机制能独一无二地标识出网络内的每台机器。这可以通过IP地址来实现。IP地址以两种形式存在:n直接IP地址(如10.1.2.5)n域名(http:/)。网络
3、编程基础知识解决问题1和2n服务器和客户机服务器和客户机 n网络最基本的精神是让两台计算机连接在一起,并相互“沟通”。一旦两台计算机发现了对方,就可以开始沟通,但它们怎样才能“发现”对方呢?n两台计算机要发现对方,通常需要其中一台扮演“服务器”的角色,另一台扮演“客户机”的角色。n客户机用来发出连接请求,而服务器用来等待连接请求。网络编程基础知识解决问题1和2n客户机发出连接请求到服务器(通过IP地址),请求信息在网络上传输,当服务器在接到连接请求并确认后,建立与客户机的连接。n一旦连接建立好,服务器和客户机之间就变成了一种双向通信,那么无论是对服务器端还是对客户机端来说,连接就变成了一个IO
4、数据流对象。从这是开始,我们就可以象读写一个普通的文件一样来对待连接。网络编程基础知识解决问题1和2n端口端口 n有些时候,一个IP地址并不足以完整标识一个服务器。这是由于在一台计算机中,往往运行着多个服务器(即不同的网络应用程序)。为了标识是哪个服务器,就需要用到一个端口。例如,通常来说HTTP采用的是80端口,FTP采用的是21端口。n端口并不是机器上一个物理上存在的场所,而是一种软件抽象(主要是为了表达的方便)。客户程序知道如何通过机器的IP地址同服务器连接,但怎样才能同自己真正需要的那种服务连接呢(一般每个端口都运行着一种服务,一台机器可能提供了多种服务,例如HTTP、FTP)?端口在
5、这里扮演了重要的角色,它是必需的一种二级定址措施。也就是说,我们请求一个特定的端口,就是请求与那个端口编号关联的服务。n系统保留了使用端口1到端口1024的权利,所以,在我们设计网络通信程序时,一般不应站用这些端口。网络编程基础知识解决问题1和2n套接字套接字 Socket套接字也是一种软件形式的抽象。用于表达两台机器间一个连接的“通道”。针对一个特定的连接,每台机器上都有一个“套接字”,通过“套接字”,两台机器之间就形成了一条“虚拟”的通道。Java的网络编程类的网络编程类nJDK提供了1个包,在该包中,主要包含如下的几个类:1Java中IP地址的表示(InetAddress类)包中提供了一
6、个InetAddress类,该类用于表示一个IP地址。它常用的方法有:(1)public static InetAddress getByName(Stringhost)返回字符串host所表示的IP地址。(2)public static InetAddress getLocalHost()返回本机IP地址(如果你的机器设置了IP地址,则返回你自己的IP,否则返回默认的IP地址:127.0.0.1)。Java的网络编程类的网络编程类2服务器端口打开(ServerSocket类)ServerSocket类用于在服务器端打开某一个端口,等待客户端的连接请求,它常用的方法有:(1)构造器方法publ
7、ic ServerSocket(intport)用于打开服务器port端口。(2)public Socket accept()用于等待客户连接,当连接成功时,形成一个套接字对象。(3)public void close()关闭用户连接。Java的网络编程类的网络编程类3套接字建立(Socket类)Socket类用于套接字的建立。它常用的方法有:(1)构造器方法public Socket(InetAddressaddress,intport)用于客户端与指定的服务器IP地址及服务器端口进行套接字连接。(2)public void close()关闭用户连接。(3)public InputStre
8、am getInputStream()从套接字返回一个输入流(4)public OutputStream getOutputStream()从套接字返回一个输出流服务器的连接过程服务器的连接过程 服务器的工作就是侦听来自客户机的连接请求并建立连接。因此,对于服务器端来说,网络编程的步骤是:(1)创建ServerSocket对象:ServerSocket server=new ServerSocket(PORT),其中,PORT是指服务器打开哪个端口来等待和建立连接。(2)等待连接:Socket socket=server.accept(),连接形成是以套接字来表示的,一旦连接成功,就会在服务器
9、客户机之间形成一个套接字。(3)一旦连接建立好(即服务器客户机套接字建立),我 们 就 可 以 使 用 S o c k e t 类 提 供 的 两 个 方 法getInputStream()和getOutputStream()来作为输入输出设备设备,实现服务器与客户机之间的信息交互。客户端的连接过程客户端的连接过程 客户机的工作就是要向服务器发出连接请求并建立连接。对客户机来说,它需要给出要连接的服务器的IP地址(以便找到该服务器)以及服务器的端口号(以便找到需要连接的服务)。至于客户机到底用哪个端口与服务器的端口建立连接,是客户机上的Java系统决定的。因此,对于客户机来说,网络编程的步骤是
10、:(1)创建InetAddress对象,指定服务器的IP地址:InetAddress addr=InetAddress.getByName(服务器的IP地址)(2)创建与服务器的指定端口的连接:Socket socket=new Socket(addr,PORT)简单聊天系统的实现 n1、演示简单聊天系统-服务器端成员变量设计ServerSocket server=null;Socket socket=null;BufferedReader cin=null;PrintStream cout=null;简单聊天系统-服务器端事件处理1.打开服务器端口2.等待客户连接3.构建输入输出通道4.读入
11、客户端发送的信息简单聊天系统-客户端成员变量设计 Socket socket=null;BufferedReader cin=null;PrintStream cout=null;简单聊天系统-客户端事件处理1.获得服务器IP2.获得服务器端口3.与服务器连接4.构建输入输出通道5.向服务器发送一条信息简单聊天系统-运行与问题n运行程序n发现:无法收发信息。n原因:信息未发送。n解决1:客户端发送按钮简单聊天系统-运行与问题n仍然存在问题n原因:服务器未进行多次接收n解决:对服务器进行10次信息收发简单聊天系统-运行与问题n任意多次信息收发的解决?n假死问题出现?n 必须发送10条信息,才能显
12、示。n 对任意多条,必定永远假死。n 假死问题的原因?独占资源n解决办法:n 多线程。n 演示Java的多线程机制 n我们都很熟悉多任务的概念,通常来说,多任务是指通过CPU时间分片的方式,让几个程序同时运行。既然程序和程序之间可以同时运行,而程序也无非是一些代码,那么,我们可以自然而然地推理出,应该也可以通过CPU时间分片的方式,让一个程序的几段代码同时运行,这就是多线程(Multi Threads)。Java作为一种网络编程语言,支持多线程机制。n上例中出现假死的原因就是因为CPU资源独占的缘故。如果我们能够将造成“假死”的那段代码采用多线程机制来进行,那么就可以让服务器不停读套接字端口的
13、同时,原来的程序照预定方式继续运行。线程的创建线程的创建要在程序中对某些程序片段采用多线程,就必须遵照Java的多线程编程机制。1线程的运行机制 线程实际上是程序中的一条执行路径。而多线程则是指程序包含多条执行路径。这样,在“同一”时间内,程序可以存在多条执行路径,“同步”执行,以提高程序的执行效率。2线程的创建 在Java中,系统提供了一个Thread类,用户通过继承Thread类的方式,可以将需要的程序段以线程的机制来运行。其通常做法是:(1)用户自定义类,该类继承自Thread类。(2)覆盖(Override)Thread类的run方法。在该方法中实现需要与“主”程序“同步”运行的功能。
14、线程的生命周期 n对一个具体的线程对象,在其生命周期内,根据状态的不同,通常可以区分为:n1创建状态(new)n2可运行状态(Runnable)n3阻塞状态(Blocked)n4终止状态线程的实现 n目标:针对上例,我们希望服务器端能多次接收客户端发送的信息,直到接收到“QUIT”信息才终止连接。n解决办法:我们就可以采用线程的机制来实现 n在SingleServer工程的MainFrame类中,添加一个内部类,该内部类的作用是自定义线程类,主要实现服务器端对客户端信息的接收功能。内部线程类将需要循环执行的语句块在线程的run方法中实现服务器端监听按钮事件将实现收发功能的代码用线程来实现简单聊
15、天系统的实现-运行n运行,客户端可以发送多条信息,服务器端显示。简单聊天系统-实战演习 在上例中,我们已经实现服务器端不停地接收信息,请对这两个工程做修改,实现如下功能:(1)服务器在接收到来自客户端的非退出信息时,发送一条“服务器反馈信息XX”信息到客户端。(2)服务器在接收到来自客户端的退出信息时,发送一条“QUIT”信息到客户端。(3)客户端能实时接收服务器发送的信息,当接收到“QUIT”信息时,则关闭套接字连接。简单聊天系统的实现-问题n问题:多个客户端怎样同时与服务器联系?多客户多客户-服务器信息交互系统服务器信息交互系统n上例中之所以只能实现一个客户的连接,是因为服务器端的套接字打
16、开后,只允许了一个客户的连接(serverSocket.accept()只被运行了1次)。要实现多个客户的连接,最显然的方式是让“等待连接连接建立接收信息”程序段重复运行。n因此,我们就可以考虑采用多线程的机制来实现。n演示客户连接线程的实现 n由于针对多用户连接,每个用户与服务器之间都必须形成一条自己的“通道”,以进行信息的“收发”。n因此,在服务器的客户连接线程中,必须建立服务器与每个客户的套接字。在套接字建立后,通过创建收发信息线程,在收发信息线程中实现信息的接收与发送。n为实现信息的接收与发送,就必须在收发信息线程中建立套接字的输入流和输出流。因此,需要将客户连接线程中建立的套接字作为
17、参数传递到收发信息线程中。n所以,为实现多客户连接,就必须在上例中添加如下的客户连接线程类(内部类):class ConnectSocket extends Threadn public void run()/将多用户连接过程在run方法中实现nwhile(true)/多个客户连接循环ntrynsocket=server.accept();/等待客户连接ncatch(IOException e)n jT1.append(用户连接服务器出错n);nnif(socket!=null)n/创建收发信息线程对象n ReadMessageThread readThread=new ReadMessage
18、Thread(socket);n/激活线程n readThread.start();nn n 客户连接线程的实现 收发信息线程的实现 n 由于涉及到多个用户与服务器的信息收发,因此,在收发信息线程中,至少需要三个成员变量:套接字、输入流、输出流,用于构建信息收发的通道。所以,对上例中的ReadMessageThread类应做如下的更改:nclass ReadMessageThread extends ThreadnBufferedReader cin;/输入流成员变量nPrintStream cout;/输出流成员变量nSocket socket;/套接字成员变量n/*构造器方法,实现从用户连
19、接线程中获得套接字,n 并利用该套接字实现输入流和输出流的建立*/nReadMessageThread(Socket socket)nthis.socket=socket;ntryn cin=new BufferedReader(new InputStreamReader(this.socket.getInputStream();n cout=new PrintStream(this.socket.getOutputStream();n catch(IOException e)n jT1.append(输入输出流建立异常n);nnnpublic void run()nString str=;n
展开阅读全文