欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    Java-核心标称技术图文课件--13.pptx

    • 资源ID:77583204       资源大小:4.63MB        全文页数:74页
    • 资源格式: PPTX        下载积分:12金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要12金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    Java-核心标称技术图文课件--13.pptx

    1%大连理工大学出版社地址:大连市软件园路80号发行:0411-84708842E-mail:DutpD(第二版)主编:张屹蔡木生新世纪应用型高等教育软件专业系列规划教材Java Java Java Java 核心编程技术核心编程技术核心编程技术核心编程技术 2 绩效概述绩效管理绩效管理实施过程KPI与BSc第 2 页第13章 多线程与网络编程13.2创建线程的方式13.1线程的概念13.3线程的生命周期13.5多线程的应用13.4线程同步 目 录 13.6网络编程的基本概念13.8UDP编程13.7TCP编程 3 第十三章 多线程与网络编程13.1线程的概念对于初学者来说,线程概念很抽象。首先,我们来观察两个简单的程序例13.1和例13.2,一个是普通的顺序执行程序,另一个是使用线程的程序。4 第十三章 多线程与网络编程13.1线程的概念对于初学者来说,线程概念很抽象。首先,我们来观察两个简单的程序例13.1和例13.2,一个是普通的顺序执行程序,另一个是使用线程的程序。5 第十三章 多线程与网络编程13.1线程的概念 6 第十三章 多线程与网络编程13.1线程的概念虽然例13.1显示的结果与例13.2所显示的结果一样,都对访问A和访问B显示五次。但运行时我们发现,例13.2的运行时间几乎只有例13.1的一半。这是为什么呢?通过对程序的分析,得知在例13.1中,先执行序列A五次后才执行序列B,而例13.2则在执行线程A休眠时,线程B使用了CPU,从而节省运行时间,提高运行效率。下面,我们来具体认识线程。7 第十三章 多线程与网络编程13.1线程的概念对于学过操作系统的读者来说,都知道进程(Process)就是程序运行时的一个实例。线程(Thread)和进程相似,都是独立的线性控制流。但线程是在进程提供的环境下执行的,线程只是程序中的一个单独的控制流,而并非程序,因为不能依靠自身单独运行,必须依赖程序,在程序中执行。因此,线程是比进程更小的单元,线程是一组指令的集合,或者是程序的特殊段,它可以在程序中独立执行。所以线程基本上是轻量级的进程,它和进程一样拥有独立的执行控制,由操作系统负责调度。13.1.1什么是什么是线程程 8 第十三章 多线程与网络编程13.1线程的概念多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立,又共同协作。通常由操作系统负责多个线程的调度和执行。使用多线程是为了使多个线程并行地工作以完成多项任务,以提高系统的效率。可以说,多线程是多任务的特殊形式。一个程序可以有多个线程,各个线程看上去像是并行地独自完成各自的工作,就像一台计算机上运行着多个处理机一样。在多处理机上实现多线程时,它们确实可以并行工作,而且采用适当的分时策略可以大大提高程序运行的效率。但是二者还是有较大的不同的,线程是共享地址空间的,也就是说多线程可以同时读取相同的地址空间,并且利用这个空间进行数据交换(这可能带来数据冲突的问题,这也是本章的主要内容之一),而处理机则不共享空间。13.1.2什么是多什么是多线程程 9 第十三章 多线程与网络编程13.1线程的概念使用多线程有什么优点呢?首先我们来看几个有关多线程的例子。比如,一个服务器程序可以同时为多个客户端提供服务;一个浏览器可以同时浏览多个页面等,都属于使用线程的现象。因此在我们接触的程序中,使用多线程的情况非常多。多线程的优点大致有以下三个方面:.加快程序的运行速度。.使用GUI界面设计,使用户界面更加吸引人。例如,用户单击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度等。.在一些等待的任务的实现上可以使用线程。例如,用户输入、文件读写和网络收发数据等,在这种情况下我们可以释放一些资源,如内存占用、CPU占用等。13.1.3多多线程的程的优点点 10 第十三章 多线程与网络编程13.2创建线程的方式13.2.1继承承Thread类创建建线程程Thread类提供了创建、运行和控制线程的相关方法,我们将会在后面的小节中逐步介绍它们的作用。通过继承Thread类,并重写其中的run()方法来定义线程体,以实现线程的具体行为,然后创建该子类的对象以创建、启动线程。其具体编程步骤为:11 第十三章 多线程与网络编程13.2创建线程的方式13.2.1继承承Thread类创建建线程程Thread类提供了创建、运行和控制线程的相关方法,我们将会在后面的小节中逐步介绍它们的作用。通过继承Thread类,并重写其中的run()方法来定义线程体,以实现线程的具体行为,然后创建该子类的对象以创建、启动线程。其具体编程步骤为:12 第十三章 多线程与网络编程13.2创建线程的方式13.2.1继承承Thread类创建建线程程 13 第十三章 多线程与网络编程13.2创建线程的方式13.2.1继承承Thread类创建建线程程 14 第十三章 多线程与网络编程13.2创建线程的方式13.2.1继承承Thread类创建建线程程下面对例13.3的代码进行详细说明:(1)程序运行时总是调用main()方法,因此main()是创建和启动线程的地方。MultiThreadExample1的main()方法中生成了三个MyThread1线程对象,并调用start()方法启动这三个线程。(2)从例13.3的运行结果可以看出,三个线程的名字是无规则显示的,这是因为三个线程是同步的,于是,三个run()方法也同时被执行。每一个线程运行到输出语句时将在屏幕上显 示自己的名字,执行到sleep语句时将休眠01000毫秒中的一个随机值。线程休眠时并不 占用CPU,其他线程可以继续执行。一旦休眠达到设定的时间长度,线程将被唤醒,继续执行下面的语句。这样,就实现了交替显示。15 第十三章 多线程与网络编程13.2创建线程的方式13.2.1继承承Thread类创建建线程程(3)Thread类创建的线程不做任何事情,因为它的run()方法是空的。所以,对于继承自 Thread的子类来说,务必要覆盖run()方法。run()是Thread类的关键方法,线程的所有活动 都是通过它来实现的。当线程实例化后系统就调用run()方法,正是通过run()方法才使创建 线程的目的得以实现。我们可以在run()方法里控制程序,一旦进人run()方法,便可执行里 面的任何语句,run()方法执行完毕,这个线程也就结束了。16 第十三章 多线程与网络编程13.2创建线程的方式13.2.2实现Runnable接口接口创建建线程程任何类都可以实现Runnable接口,而这个类的实例将用一个线程来调用,以启动这个类的run()方法。Runnable接口的run()方法,其作用和Thread类的run()方法相同。其具体 的编程步骤如下:17 第十三章 多线程与网络编程13.2创建线程的方式13.2.2实现Runnable接口接口创建建线程程 18 第十三章 多线程与网络编程13.2创建线程的方式13.2.2实现Runnable接口接口创建建线程程 19 第十三章 多线程与网络编程13.2创建线程的方式13.2.3两种两种创建建线程方式的比程方式的比较Thread类是Java已经严格封装好的类,在面向对象思想中,继承这样的类并修改或扩充它并不是十分可取的。因为可能会出现人为失误,对一个类进行继承修改或扩充,将可能导致该子类出现不可预料的错误。另外,由于Java不支持多重继承,一个继承了 Thread的类将无法再继承其他类,因此在 某些情况下只能采用实现Runnable接口的方式,例如要实现多线程的Applet则必须通过实 现Runnable接口创建线程。实现Runnable接口方式的缺点在于,在run()方法中如果要调用当前线程自身的方法,必须先通过调用Thread.currentThread()以获得对当前线程自身的引用,而采用继承Thread 类方式时,可以直接调用当前线程自身的方法。后者为代码的编写带来了 一定的便利,但这点 便利与上述可能造成的不可预料的错误相比,不具有太大的意义。因此如果没有绝对的把握 保证继承Thread类的子类的正确性和完整性,建议采用实现Runnable接口的方式创建 线程。20 第十三章 多线程与网络编程13.2创建线程的方式13.2.3两种两种创建建线程方式的比程方式的比较然而,实现Runnable接口的方式并不一定总是最好的,例如要获得拥有特殊功能的线程必须通过继承并扩充Thread接口实现,此时若对Thread类的修改或扩充并不大,并希望保证其正确性和完整性,则更应该采用继承Thread类的方式。这也正是本章多采用继承 Thread类的方式的原因。在实际应用中,应该根据实际情况,权衡两种方式带来的影响,选择最合适的方式。21 第十三章 多线程与网络编程13.3线程的生命周期13.3.1线程生命周期的状程生命周期的状态所谓线程的生命周期,是指线程从创建之初到运行完毕的整个过程,就像人的整个生命周期从出生,经历童年、少年、青年、中年、老年,直到去世一样。线程的整个生命周期就是在各种状态间切换的,其过程如图所示。线程的生命周期 22 第十三章 多线程与网络编程13.3线程的生命周期13.3.1线程生命周期的状程生命周期的状态下面介绍上图的各个状态。.新生(New):线程刚通过构造方法被创建时即处于此状态,此时线程还没有启动,无法运行。.可运行(Runnable):线程位于一个等待池中,等待被调度到CPU 运行,此时线程已启动,并做好了一切运行的准备,随时可以占用CPU运行。.运行(Running):线程占用CPU运行。.死亡(Dead):线程运行结束,结束方式可以是run()方法正常结束,或从run()方法返回,或者产生没有捕捉的异常。.阻塞(Blocked):线程由于某种原因无法继续占用CPU运行,便会转入此状态。23 第十三章 多线程与网络编程13.3线程的生命周期13.3.2各状各状态的的转换事实上,此前我们已经进行了一些线程的控制,如调用start()方法将线程从新生状态转为可执行状态,调用yield()方法将线程转为阻塞状态,也可以通过在run()方法中调用return语句将线程从运行状态转为死亡状态。在这些线程的状态间切换,从可运行状态转为运行状态只能由调度程序控制(通过设置线程优先级可以稍加干预,在14.3.3小节中将进行详细介绍),从新生状态转为可执行状态和从运行状态转为死亡状态很简单,而从运行状态到阻塞状态或可运行状态,以及从阻塞状态到可运行状态的切换,才是我们真正感兴趣的,也是线程状态转换的重点。当以下任一事件发生时,正在运行的线程将由运行状态转为阻塞状态:1.sleep()方法被调用,如 Thread.sleep(1000)。2.线程调用wait()方法,并且等待一个指定的条件被满足。3.线程在I/O处阻塞。那么,如何让处于阻塞状态的线程进人可运行状态呢?下面给出可运行状态条件:1.线程处于睡眠(sleep)状态,那么必须在指定时间内睡眠。2.线程等待一个特定条件,那么必须由其他对象通过notify()或者notifyAll()方法来通知等待线程条件已改变。3.线程由于I/O阻塞,那么I/O操作必须完成。24 第十三章 多线程与网络编程13.3线程的生命周期13.3.2各状各状态的的转换若对线程各状态进行更好的转换控制,可能会用到以下Thread对象的方法,见表13-1。25 第十三章 多线程与网络编程13.3线程的生命周期13.3.2各状各状态的的转换若对线程各状态进行更好的转换控制,可能会用到以下Thread对象的方法,见表13-1。26 第十三章 多线程与网络编程13.3线程的生命周期13.3.3线程的程的优先先级与与线程程调度度在Java语言中,对一个新建的线程,系统会分配一个默认的线程优先级:继承创建这个线 程的主线程的优先级(一般为普通优先级)。类Thread拥有三个代表线程优先级的整型静态 属性:1.NORM_PRIORITY:分配给线程的默认优先级,优先级别为5。2.MIN_PRIORITY:表示线程具有的最低优先级,优先级别为1。3.MAX_PRIORITY:表示线程具有的最高优先级,优先级别为10。它们都是公有(public)属性,可以直接访问。通过getPriority()方法可以获取线程对象的当前优先级,通过setPriority()方法可以修改线程对象的优先级。在实际应用中,一般不需要修改线程的优先级,在此不给出实例,但以下关于线程优先级的特性是应该了解的:1.线程类的默认优先级为5,线程对象的默认优先级也是5。但是,如果在启动线程或创建线程前将其所属线程类的最高优先级(MAX_PRIORITY)修改到5以下,那就相当于创建出优先级比规定的最高优先级更高的线程。2.可以降低但无法提升线程类的最高优先级。3.修改线程类的优先级,不会对已经创建的该类的线程的优先级产生影响,但此后若修改(不管是降低还是提升)这些线程的优先级,它们会自动变为修改后的线程类的优先级。27 第十三章 多线程与网络编程13.4线程同步在单线程的进程中,一个进程一次只能执行一个任务,不需要考虑两个或更多个任务同时 使用一个资源的问题,如两个任务同时修改同一个数据,或需在一台打印机上同时进行打印操作。然而在多线程环境下,多个线程试图同时使用相同且有限的资源的情况,是很有可能发生的,若不提供某种机制避免这种情况的出现,后果将不可预料且非常严重,如造成某些线程数据的不一致,使某些线程陷入无限循环,甚至破坏某些关键文件或数据库中的重要数据。事实上,在多任务操作系统中,多个进程同时使用相同且有限的资源的情况,也是时有发 生的,操作系统为此提供了解决机制,用户不用担心。然而在进程内部的多线程环境下,如何避免这种资源冲突,是编程者必须考虑的问题。28 第十三章 多线程与网络编程13.4线程同步13.4.1线程同步程同步问题我们先来看看一个典型的生产者消费者问题,生产者生产数据后,消费者才能获取数据。其模型如图所示。生产者消费者模型 29 第十三章 多线程与网络编程13.4线程同步13.4.1线程同步程同步问题 30 第十三章 多线程与网络编程13.4线程同步13.4.1线程同步程同步问题 31 第十三章 多线程与网络编程13.4线程同步13.4.1线程同步程同步问题 32 第十三章 多线程与网络编程13.4线程同步13.4.1线程同步程同步问题 33 第十三章 多线程与网络编程13.4线程同步13.4.2线程程间的的协作作通过在方法声明中加入synchronized关键字来声明synchronized()方法。如:public synchronized void put(int value)/*/synchronized()方法控制对类成员变量的访问:每个类实例对应一把锁,每个synchronized()方法都必须获得调用该方法的类实例的锁方能执行,否则线程处于阻塞状态。方法一旦被执行,就独占该锁,直到该方法返回才将锁释放,此后被阻塞的线程才能获得该锁,重新进人可执行状态。这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized的成员方法中至多只有一个处于可执行状态,从而有效避免了类成员变量的访问冲突。在Java中,不仅是类实例,每一个类也对应一把锁,这样我们也可将类的静态成员方法声 明为synchronized,以控制对类的静态成员变量的访问。synchronized()方法的缺陷:若将一个大的方法声明为synchronized()将会大大影响效率,特别是若将线程类的方法run()声明synchronized(),由于在线程的整个生命期内一直处于运行状态,将导致它对本类任何synchronized()方法的调用都不会成功。当然,我们可以通过将访问类成员变量的代码放到专门的方法中,将其声明为synchronized(),并在主方法中调用来解决这一问题,但Java为我们提供了更好的解决办法,那就是synchronized块。1.synchronized()方法 34 第十三章 多线程与网络编程13.4线程同步13.4.2线程程间的的协作作通过synchronized关键字来声明synchronized块。其语法如下:synchronized(syncObject)/访问关键数据的代码段 synchronized块用于指定一个同步代码段(即被花括号括起来的代码段)。同步代码段具有和synchronized()方法相同的同步特性,一个synchronized()方法或同步代码段在执行时,其他synchronized()方法和同步代码段都不能执行。其中,小括号里的参数用于指定同步代 码段与对象syncObject(可以是类实例或类)的锁相关联。由于它适用于任意代码块,且可任意指定上锁的对象,故灵活性较高。2.synchronized 块 35 第十三章 多线程与网络编程13.4线程同步13.4.3线程同步程同步问题的解决的解决通过同步机制实现了线程间的协作,我们再来解决例13.6中数据不一致的问题。要使得生产者线程与消费者线程同步,经分析需要达到以下两个目标:1.这两个线程不能同时对box对象进行操作。Java线程可以通过锁定一个对象来达到 此目的。2.这两个线程必须协调工作。例如:生产者线程必须通知消费者线程当前数字已产生,消 费者取走数字之后,通知生产者可以重新写人数字。线程类提供wait()、notify()、notifyAll()方 法来完成这些工作。对例13.6的类Box、生产者、消费者类进行修改。2.synchronized 块 36 第十三章 多线程与网络编程13.5多线程的应用多线程在界面设计(Applet或GUI设计)和网络中都有较多的应用,一些系统开销很大 的并发进程程序也可以修改为多线程程序,以节省系统资源。下面给出一个在小程序中使用 多线程的例子,它可以动态显示文字。例13.8是一个Java小程序。在屏幕上显示一串字符“Hello,Java!”,起点坐标(400,100),每隔0.1秒往左移动10个像素点,当移动到边界时,返回起点,依次循环。为使小程序 不影响其他程序的运行,我们使用线程进行控制。37 第十三章 多线程与网络编程13.6网络编程的基本概念所谓网络协议,是指网络中进行通信的程序之间一种通用的约定,它规定了数据如何进行 发送、传输和接收。TCP与UDP就是同一体系中两个不同的网络协议,而IP协议是它们的 基础,这三者共同组成了 TCP/IP协议的核心TCP/IP,它是目前Internet上普遍使用的 协议,也是最成功的协议,为Internet的发展做出了卓越贡献。TCP(Transfer Control Protocol,传输控制协议)是面向连接 的,即在客户端和服务器之间建立一条实际的连接线路,数据在这 条线路中传输,就像电话与电话之间通过实际的连接线路通话一 样。TCP这种面向连接的传输机制,提高了数据在传输过程中的安 全性和正确性,是TCP提供可靠数据传输的基础。在TCP协议下,数据接收端会对接收到的数据进行正确性和完整性的检测,以及重新排序由于网络状况的复杂性,接收到的数据可能并不是按其发送顺序接收的,若检测到数据损坏或丢失,数据接收端会要求发送端重传损坏或丢失的数据。图13-4为TCP/IP协议的分层结构图,在网络编程中,网络协议通常分为不同的层次,并对各层进行开发,每一层分别负责不同的通信功能。13.6.1网网络编程基程基础 38 第十三章 多线程与网络编程13.6网络编程的基本概念13.6.1网网络编程基程基础.应用层应用层负责处理特定的应用程序。如:HTTP、Telnet、FTP等。.传输层传输层主要为两台主机上的应用程序提供端到端的通信。包括两个互不相同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。.网络层网络层处理分组在网络中的活动,例如分组的选路。.链路层链路层通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。39 第十三章 多线程与网络编程13.6网络编程的基本概念13.6.2URL类URL(Uniform Resource Locator,统一资源定位器)是一种在 Internet 的 WWW 服务程序上用于指定资源位置的表示方法,这个资源可能只是一个简单的文件或目录,也可能是复杂对象,如数据库或搜索引擎,常见的网址就是一个典型的URL,如Oracle公司官方网站的首页网址 http:/ 务器获取网页数据使用的协议。“J”是服务器主机名,也可以使用IP地址,它们之间通过DNS一一对应;在服务器主机名或IP地址之后可以带有端口号,若没有端口号,将使用默认的端口号,HTTP协议默认的端口号为80。服务器中都会指定一个目录作为访问网站时的默认根目录,而“index.html”就是相对于根目录的文件,“chapter1”表示在“index.html”文件中的一个区域。40 第十三章 多线程与网络编程13.6网络编程的基本概念13.6.2URL类Java提供了一个用于表示URL的类URL,位于J包(Java网络编程技术所用的 类都包含在这个包中,下同,不再一一说明)。URL类最常见的构造方法有三个:1.public URL(String spec):根据 String 表示形式创建 URL 对象。2.URL(String protocol,String host,String file):根据指定的 protocol 名称、host 名称 和file名称创建URL。3.URL(String protocol,String host,int port,String file):根据指定 protocol、host、port号和相对于访问根目录的文件file创建URL对象。通过 URL 对象的 getFile()、getHost()、getPort()和 getProtocol()等方法可以取得 URL 的各个部分,使用sameFile()方法可以将一个URL对象与另一个URL对象进行比较,看看 两者是否引用相同的远程对象。通过openStream()方法可以获得数据源为该URL所指资源 的InputStream对象;通过toExternalForm()方法和toSting()方法可以获得URL的字符串表示。关于URL的更多信息,请参阅Java API文档。41 第十三章 多线程与网络编程13.6网络编程的基本概念13.6.3InetAddress 类在网络中识别一台计算机,常用域名或IP地址,例如:或192.18.19.103。在Java语言中,可以使用InetAddress来获取远程系统的IP地址,其中包含有与Java网 络编程相关的许多变量和方法,它们经常在实际应用中使用。InetAddress类有两个子类 Inet4Address和Inet6Address,分别用于表示IPv4地址和IPv6地址,它们与InetAddress差 别不大,一般应用中只需要使用InetAddress即可。InetAddress类没有构造方法,创建类的 实例可以使用以下的静态(static)方法。创建实例的几个常用方法如下。1.static InetAdress getLocalHost()getLocalHost()方法获得本机的InetAddress对象,其表示的是本机器真实的IP地址而 不是回送IP地址127.0.0.1。42 第十三章 多线程与网络编程13.6网络编程的基本概念13.6.3InetAddress 类2.static InetAdress getByName(String host)getByName()方法根据主机名或字符串型IP地址生成InetAddress对象。所谓字符串型 IP地址,是指IP地址的字符串形式,如IP地址:127.0.0.1的字符串形式是字符串“127.0.0.1”字符串型IP地址必须遵循IP地址的格式,若该字符串型IP地址不是有效的IP地址或主机 名,在网络中并不存在,则在使用该InetAddress对象时可能产生UnknownHostException异常。3.static InetAddress getAllByName(String host)getAllByName()方法可以生成多个InetAddress对象,其中每个InetAddress对象代表 的IP地址都可以通过DNS与主机名或字符串型IP地址host对应,用于一个主机名对应多 个IP地址的情况。43 第十三章 多线程与网络编程13.6网络编程的基本概念13.6.3InetAddress 类常用的InetAddress对象的方法有以下几个:(1)String getHostAddress()getHostAddress()方法获取InetAddress对象的字符串型IP地址。(2)String getHostName()getHostName()方法获取InetAddress对象的主机名,若InetAddress对象通过主机名生 成,则直接返回该主机名;若InetAddress对象通过IP地址生成,则通过DNS找到与该IP地 址对应的主机名并返回,若找不到对应的主机名,则返回字符串型IP地址。(3)byte getAddress()getAddress()方法返回InetAddress对象的IP地址到一个字节数组中,对于该数组中的 负数,加上256可以得到正确的IP地址中的数字。(4)boolean isMulticastAddress()isMulticastAddress()方法判断InetAddress对象是否是一个IP多点传送地址。44 第十三章 多线程与网络编程13.7TCP编程Java中的网络通信都是通过socket(套接字)完成,socket是指程序间通信连接的端点,两个程序之间通过socket进行数据传输。socket之间的通信线路是双向的,即每个socket都 可以从对方socket中读取数据,也可以向对方socket写人数据。Java在TCP的socket中封 装了一个输人流和一个输出流,用于实现数据的双向传输。图显示socket在TCP连接 上的通信。socket在TCP连接上的通信 45 第十三章 多线程与网络编程13.7TCP编程socket是程序进程间的数据交换机制。当程序需要建立网络连接时,必须有一台机器运行一个程序,随时等待连接,而另一端的程序则对其发出连接请求。1.建立连接当程序建立网络连接时,需要知道地址或主机名称。另外,网络连接还需要一个端口号(可以将其当作扩展号码),连接到正确的主机之后,需要对该连接确认特定口令。2.连接地址在TCP/IP系统中,端口号由16 bits组成,范围为065535。实际应用中,前1024个端口号已经预定义为特定服务器。TCP和UDP有各自的65535个端口号。只有客户端和服务器指定端口号一致时连接才会建立。如果系统中两个程序所用端口号不一致,则连接无法建立。3.端口号在Java中,TCP/IP接口的连接是由J包中的类实现的。4.网络连接模式 46 第十三章 多线程与网络编程13.7TCP编程13.7.1socket 类该构造方法没有参数,创建未连接的socket对象。1.socket()该构造方法以主机名(或字符串型IP地址)和整型端口号为参数,创建一个指定主机名和 端 口 的 socket 对象。2.socket(String host,int port)该构造方法以InetAddress对象和整型端口号为参数,创建一个与该InetAddress对象表示的主机和指定端口号的socket对象。3.socket(Inet Address address,int port)该构造方法创建的socket对象与localAddr表示的本机IP地址和端口 localPort绑定,并与主机名或字符串型IP地址为host的机器的端口 port连接。4.socket(String host,int port,InetAddress localAddr,int localPort)5.socket(InetAddress address,int port,InetAddress localAddr,int localPort)该构造方法创建的socket对象与localAddr表示的本机IP地址和端口 localPort绑定,并与address表示的主机的端口 port连接。47 第十三章 多线程与网络编程13.7TCP编程 48 第十三章 多线程与网络编程13.7TCP编程 49 第十三章 多线程与网络编程13.7TCP编程13.7.2Serversocket 类该构造方法没有参数,生成一个未绑定的Serversocket对象。1.Serversocket()该构造方法以整型端口号为参数,生成与该端口号绑定的 Serversocket 对象,该 Serversocket对象监听该端口的连接请求,若端口号为0,表示任意端口。2.Serversocket(int port)该构造方法以整型端口号和整型最大连接数为参数,生成的Serversocket对象最多只允 许指定数量的客户端连接,若连接队列已满,则此后到达的连接请求将被拒绝。3.Serversocket(int port,int count)该构造方法以整型端口号、整型最大连接数和一个InetAddress对象为参数,拥有多个网卡且处于多个网络中的机器同时拥有多个IP地址,在只允许客户端对其中的一个IP地址提 出连接请求时,使用该InetAddress对象指定生成的Serversocket对象绑定本机器IP地址。4.Serversocket(int port,int count,InetAddress bindAddr)50 第十三章 多线程与网络编程13.7TCP编程 51 第十三章 多线程与网络编程13.7TCP编程13.7.3TCP通信的基本模式通信的基本模式TCP/IP协议下Java socket连接过程如图所示,它们实际上是Server端与Client端 建立连接的过程。Server端和Client端的socket连接过程由上可知,使用socket方式进行网络通信的四个主要步骤:1.服务器端Serversocket绑定于特定端口,服务器侦听socket等待连接请求。2.客户端向服务器的特定端口提交连接请求。3.服务器接收连接,产生一个新的socket,绑定到另一端口,由此socket来处理和客户端 的交互,服务器继续侦听原socket来接收其他客户端的连接请求。4.连接成功后客户端也产生一个socket对象,并通过它来与服务器端通信(注意:客户端 socket并不与特定端口绑定)。52 第十三章 多线程与网络编程13.8UDP编程UDP是一种无连接的协议,每个数据包都是一个独立的信息单元,包括完整的源地址或 目的地址及其端口,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达 目的地的时间以及内容的正确性都不能被保证。下面对TCP与UDP做简单比较:1.TCP协议设计的目的是为网络通信的两端提供可靠的数据传送,是一个面向连接的 协议,该协议可以很好地解决网络通信中的数据丢失、损坏、重复、乱序以及网络拥挤等问题,但在socket之间进行数据传输之前必然要建立连接,所以TCP比UDP多一个连接建立的时间。UDP协议提供一种最简单的协议机制,实现了快速的数据传输。它定义了数据报 传送模式,每个数据报都给出了完整的地址信息,因此无法建立发送方和接收方的连接,因 此它的可靠性较差,不保证数据报的传送顺序、丢失和重复。UDP协议是无连接的,可以用来实现组播、多播和广播等。2.使用UDP传输数据有大小的限制,每个被传输的数据报限定在64KB之内。而TCP 没有此限制,一旦连接建立起来,双方的socket就可以按统一的格式传输大量的数据。UDP 是一个不可靠的协议,发送方所发送的数据报并不一定按相同的次序到达接收方。而TCP 是一个可靠的协议,它确保接收方完全正确地按先后顺序获取发送方所发送的全部数据。Java 有两个数据报类:Datagramsocket 类和 DatagramPacket 类。Datagramsocket 类用 于在程序直接按建立传送数据报的通信连接DatagramPacket类则用来表示一个数据报。53 第十三章 多线程与网络编程13.8UDP编程13.8.1Datagramsocket 类先看一下Datagramsocket的构造方法:1.Datagramsocket()该构造方法没有参数,生成的Datagramsocket对象绑定本机器上所有可用的端口。2.Datagramsocket(int port)该构造方法以整型端口号为参数,生成的Datagramsocket对象与该端口绑定。3.Datagramsocket(int port,InetAddress laddr)该构造方法以整型端口号和InetAddress对象为参数,生成的Datagramsocket对象与 该InetAddress对象表示的IP地址和端口号绑定。4.Datagramsocket(socketAddress bindaddr)该构造方法以socketAddress对象为参数,生成的Datagramsocket对象绑定该 socketAddress对象表示的IP地址和端口号。54 第十三章 多线程与网络编程13.8UDP编程 55 第十三章 多线程与网络编程13.8UDP编程13.8.2DatagramPacket 类1.DatagramPacket(byte buf,int length)这是最常用的一个构造方法,生成以字节数组buf的前length个元素作为数据接收缓 冲区的DatagramPacket对象,length不能大于buf的长度,一般等于buf的长度,即将整个字节数组buf作为数据缓冲区。最常用的是通过以下代码生成一个DatagramPacket对象:byte buf=new byte1024;DatagramPacket dataPacket=new DatagramPacket(buf,buf.length);2.DatagramPacket(byte buf,int offset,int length)该构造方法生成的DatagramPacket对象,以字节数组buf的第offset个元素起共length 个元素作为数据接收缓冲区。DatagramPacket(byte buf,int length,InetAddress address,int port)该构造方法生成的DatagramPacket对象,从字节数组buf的前length个元素作为数据发送缓冲区,发送的目的地为address表示的机器的port端口。byte data=“近来好吗?”getByte();56 第十三章 多线程与网络编程13.8UDP编程13.8.2DatagramPacket 类3.InetAddress addr=InetAddress.getByName(localhost);DatagramPacket pack=new DatagramPacket(data,data,length,addr,2345);4.DatagramPacket(byte buf,int offset,int length,InetAddress address,int port)该构造方法生成的DatagramPacket对象,从字节数组buf第offset个元素起共length个元素作为数据发送缓冲区,发送的目的地为address表示的机器的port端口。5.DatagramPacket(byte buf,int length,socketAddress address)该构造方法生成的DatagramPacket对象,以字节数组buf的前length个元素作为数据发 送缓冲区,

    注意事项

    本文(Java-核心标称技术图文课件--13.pptx)为本站会员(可****阿)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开