1、第一讲Java语言概述2Java的特点*平台独立性和可移植性面向对象(OO 3OOP和POP编程思路的差别,所有计算机程序都由两类元素组成:代码和数据 程序两种写法:以代码为核心或以数据为核心进行组织编写。1.围绕“正在发生什么”编写一面向过程的编 程2.围绕“谁将被影响”编写一面向对象的编程4OOP和POP编程思路的差别,纯粹面向过程的编程(1)程序具有线性执行的特点。(2)面向过程的程序可以认为是代码作用 于数据。,面向对象的编程。(1)围绕它的数据(对象)和为这个数据严 格定义的接口来组织程序。(2)面向对象的程序实际上是用数据控制对 代码的访问。5第二讲标识符,保留字和数据类型第三讲运
2、算符、表达式和语句6第四讲类与对象1、类的基础2、对象的声明与使用3、变量与对象的生命周期4、进一步研究方法和类7类口类就是对象的模板,它定义一 类对象所能共同拥有的属性和共 同的行为。口对象就是类的实例。注:对于面向对象的程序而言,一个类可以生成 若干个类的对象,先有类的定义才有属于该类的 对象,不存在不属于某个具体类的对象。8构造方法A构造方法在对象创建时被调用;A构造方法与类同名;A构造方法没有任何返回值。9课内练习:一一 建立类模型时的思维抽象过程课本P61编写水仙花数类,要求如下:/设计该类的构造方法;,设计方法来存取类中的属性;/设计方法以判断是否水仙花数。注:将main函数写在另
3、外的Test类中实例化水仙花数类,并通过调用对象的方法来输出水仙花数。10方法重载在JAVA中,同一个类中的2个或2个 以上的方法可以有同一个名字,只要它 们的参数声明不同即可。该方法就被称为重载(overload),这个过程称为方法重载(method overload)。11static关键字类中被static修饰的属性或方法,完全 独立于该类的任何对象,能够在类的任 何对象被创建之前访问。当声明一个对象时,并不产生static变 量的copy,所有对象共享同一个static变O12static关键字声明为static的方法有以下几条限缶U:,它们仅能调用其他的static方法;/它们只能访
4、问static属性;/它们不能以任何方式引用this或super;13命令行参数可以通过命令行参数将信息传递给main()0命令行参数是程序执行时在命令行中 紧跟在程序名后的信息。命令行参数作为字符串存储在传递给 main。的String数组中。14练习:课本P108利用static变量设计实例计数器。该计数器可以统计并判断该类创建的 对象的次数是否大于3。15第五讲数组与字符串P134第11题16第六讲继承1、继承的基本概念2、关键字super的使用3、重载与改写4、创建多级类层次5、何时调用构造方法6、深入探讨Father f=new Son();7、关键字final的使用171、继承的基
5、本概念被继承的类叫超类或父类(superclass),继承超类的类叫子类(subclass)使用关键字extends继承一个类例如:A是一个类,使用关键字extends来创建 A的子类Bclass A.class B extends A 181、继承的基本概念-成员的访问和继承A子类可以继承父类中的所有成员(包括 父类中所有静态与动态的属性与方法),但是它不能访问被声明成private的成员。注:(1 构造函数不被继承!2 在java中规定:-个父类可以有多个 子类,一个子类只能有一个父类。192、关键字super的使用关键字super允许在子类中调用父类的构 造函数。202、关键字super
6、的使用一一子类中构造方法的调用顺序A调用子类的构造方法时,无论子类的 构造方法中是否用到了super。,每个父 类默认的(或无参数的)构造方法都将 执行。nside As constructor,nside BJs constructor,nside Cs constructor.213、改写(Override)与重载(Overload)子类中某个方法的名字与父类中的某I个方法名字一样,但二者的参数不同。这时子类重载了父类中的某个方法。22子类中某个方法的名字与父类中的某 个方法名字一样,参数也一样。这时子类 改写(或覆盖)了父类中的某个方法。父 类中定义的方法将被隐藏。关键字supe允许在子
7、类中调用父类中被 子类覆盖的成员。237、关键字final的使用关键字final有三个用途:(1)创建一个常量。如:final int NUM=100;(2)使用final阻止方法被子类覆盖。如:final void meth();247、关键字final的使用使用final阻止类被继承。如:final class A.253、继承的意义和用途A继承是面向对象的一块基石,它允许 创建分等级层次的类。继承可以大大提高程序代码的可重用 性,并可缩短软件的开发周期。同时,继承又对程序的删改和增添提供了方便,从而大大提高了程序的可扩展性和可维 护性。26课内练习A某高等院校中的学生可以分为两类:本科生
8、(Undergraduate)和研究生(Graduate)。凡是学生都有名字,年龄和学位。其中本科生拥 有专业,研究生拥有研究方向。请编写一段程序,可以用于输出学生信息。注:该程序应具备一定的扩展性,如其他院校可能 拥有专科生,博士生,本科生也可能分为工学方向 和理学方向等。27第七讲接口与程序包1、抽象类的概念2、接口3、程序包4、访问控制28抽象类与接口抽象类或接口位于类层次结构中的 顶层。抽象类或接口中所定义的抽象方法 决定了类层次结构是否能顺利地通过 继承来解决问题域中的问题。29抽象类 使用关键字abstract描述一个抽象类或 抽象方法。如:abstract class A.abs
9、tract void callme();30接口 使用关键字interface定义一个接口如:interface interfaceA void callbackQ;使用关键字implements可以让一个类实 现一个接口或同时实现多个接口(多继承)O31程序包(package)包的引入增加了访问控制的另一个维度。类成员访问表private 蕨 J默认械员protected 颇public 定员,同一耕可如1?1?B、正。B.封 同一包中再候可见否B 1 EBA8、旧同一包中甜日凑可如否B筌B 正。B 正。)洞包中对子类可如否。否日、正。B.无。福包中林子类魏辱和否B 正+32课内练习:1.创
10、建Rodent(啮齿动物):Mouse(老鼠),Gerbil(沙鼠),Hamster(大颊鼠)等的一个继亲分级结构。在基础类中,提供适用于所有Rodent的方法,并在衍生类中覆盖它们,从而根据不同类型的 Rodent采取不同的行动。创建一个Rodent数组,在 其中填充不同类型的Rodent,然后调用自己的基础 类方法,看看会有什么情况发生。33第,饼异母*t理8.1 异常处理基础8.2 异常类型8.3 异常处理8.3.1 运行时异常(隐式处理)8.3.2 非运行时异常(显式处理):try-catch-finally8.3.3 非运行时异常(显式处理):throw与throws34异常处理基础
11、异常处理可以有以下几种:/对运行时异常(P208)可以不做显式的处理;/对非运行时异常必须做显式的处理:使用try-catch-finally语句捕获异常;(2)通过throws子句将异常抛出给上一级处理。35异常处理下面是显式的异常处理的通常形式:try/被监视的可能会产生错误的代码块)catch(Exception exOb)/捕捉到某个异常对象exOb后对该异常的处理)finally/无论try代码块中的异常是否存在,绝对都要执行的代码。36异常处理1、通过throw关键字手动抛出明确的异常2、利用throws子句将异常抛出给上一级处 理37异帘左健系关系中的特殊健父类抛出的异常范围应比
12、子类大。38第夕耕Java的输入输出流9.1流概念9.2 Java用于输入输出流的类9.3数 据流的使用39输入流1.输入流通过打开一个连接到数据源(文件、内存或网 络端口上的数据)的输入流,程序可以从数据 源上顺序读取数据。40输出流2.输出流通过打开一个连接到目标的输出流,程序可以 向外部目标顺序写数据。A stream41Java用于输入输出流的类java.io中的基本流类:Byte Streams Character StreamsJInputStream ReaderOutputStre:un Writer说明:它们是抽象类,不能直接创建对象。42File 类File类的对象主要用来
13、获取文件本身的一些信息,如:文件所在的 3录、文件的长度、文件读写权F艮等,但是不涉及对文件的揍写操作。43课后练习:字符流的使用使用文件流实现简单的留言板:留言信息由作者,标题与留言内容三个部分组 成。A通过标准输入流System,in获取用户输入的三 部分信息,使用BufferedWriter将留言信息保 存在d:message.txt文件中。A使用B u ff e red Re a d e将留言信息逐行读出。44课后练习:提示:1、存入文件的每条留言的结构为:author&title&contentn2、jS:BufferedReaderreadLine()ii$取出留言后,使用Stri
14、ngTokenizer类g1中的留言结构进行分析,通过 三个部分,分别显示。1字符析取出留言的3、如何为每条留言编号?如何将新留言插入文件 尾部(追加记录)?45RandomAccessFile 类 InputStream类和Outputstream类 都是对 文件进 行顺序读/写操作。RandomAccessFile类允许对 文件的内参进行随机读/写操作。RandomAccessFile流的指向既可以作为源也可 以作为月的地。46课内练习使用RandomAccessFile类实现留言板中的用户注册功能:A用户信息由用户名,密码与性别三个部分组成。通过标准输入流Sy ste mJn获取用户输入
15、的三 部分信息,使用RandomAccessFile类将用户 信息追加到d:u se r.txt文件中。保证新追加的用户与之前每个用户的用户名不 籍同47课后练习使用RandomAccessFile类实现留言板中的用户登录 功能:通过标准输入流System,in获取用户输入的用户名与密 码;征用 RandomAccessFile 类将用户信息从 d:user.txt 文件中逐条取出,用StringTokenizer分析每一条user 信息的用户名与密码是否与用户输入的一致。A登录成功后,该用户发表的所有留言的用户名为登录的 理户名。没有登录的用户,默认使用“guest”名字留具岩将登录,注册,
16、添加留言,查看留言和退出系统功 能整合在一起。48第7。锦囹形用户界面10.1 Applet 基础10.2 Applet 的执行10.3简单的Applet显示方法4910.1 Applet 基础Applet与Application的主要区别在于它们的执行方式 不同:A Application是使用命令行命令直接运行,从其main()方法开始运行的;AApplet则是在浏览器中运行的,首先必须创建一个 HTML文件,通过编写HTML语言代码告诉浏览器载 入何种Applet以及如何运行。5010.1 Applet 基础Applet的生存周期方法5110.1 Applet 基础-Applet的生存周
17、期 Applet的生命周期-;-初始态(瞬态)第一次装入,构造applet类,调用init()方法 调用start。方法y运行态离开Web页面:最小 化或装入其他页面,调用stop。方法 停止态关闭浏览器,调用stop。、destroy。方法消亡态重新装入或改变页面 大小或返回Web页面,调用start。方法52课内练习编写一个Applet,要求如下:利用Color的构造函数Color(float redjloat green,float blue)产生随机颜色的字符串;在HTML窗口中使用4Pmet输出随机颜 色的字符串“欢迎崔用留詈板 字 符串的字体为宋体,类型为加粗,大 小为30镑。每当
18、窗口改变时,字符串的颜色都会改变。510.7 AWT事件类型o低级事件ComponentEvent(组件事件:组件尺寸的变化,移动)ContainerEvent(容器事件:组件增加,移动)WindowEvent(窗口事件:关闭窗口,窗口闭合,图标化)FocusEvent(焦点事限焦点的获得和丢失)KeyEvent(键盘事件:键按下、释放)MouseEvent(鼠标事件:鼠标单击,移动)O高级事件(语义事件)ActionEvent(动作事件:按钮按下,TextField中按Ente键)AdjustmentEvent(调节十件:在滚动条上移动滑块以调节数 值)ItemEvent(项目事件:选择项目
19、,不选择“项目改变”)TextEvent(文本事件,TextFiled中文本对象改变)5410.7 AWT事件处理模型组件(事件发生者)触发一个相应类型的事件此事件由相应类型的Listene(事件监听者)接收并处理事件监听者、按下Button 触发 ActionEvent e事件发生者ActionListener、并做处理,551019 布局(Layout Java.awt包中共定义了 5种布局管 理器类,它彳门分另I是FlowLayout、BorderLayout CardLayout Grid Layout和Grid Bag Layout。每个布局管理器类对应一种布局策 略。当一个容器选定
20、一种布局策略 时,它应该创建该策略对应的布局 管理器类的对象,并将此对象设置 为自己的布局管理器。5610.9 布局(Layout 没有指明布局管理器,贝Upanel与applet 都使用磁省的FlowLayout希局策略。而 Window,Frame,Dialog 使用 BorderLayout 布局策略。没有布局管理器的容器,其中的对象会 互相覆盖、遮挡,影响使用,所以必须 为每个容器设置一个合适的布局管理器。容器设置布局使用方法:setLayout(布 局对象)57课后练习A使用applet的布局策略分别实现留言板的用 户登录,用户注册,发表留言和查看留言四个 界面。A通过处理各个界面中
21、的Button,TextField,TextArea上的事件,分别实 现留言板中的用户登录,用户注册,发表留言和 查看留言功能。本次课后练习只需分别实现4个功能即可,不 要求整合功能。5810-10 使用Frame窗口一关闭Frame窗口 关闭窗口事件:WindowEvent 窗口事件监听器:windowListener 窗口关闭事件处理方法:windowClosing()!、关闭窗口Frame 窗 口 触发 WindowEvent e事件发生者事件监听者WindowListener做处理5910-10 使用Frame窗口一关闭Frame窗口关闭Frame窗口步骤:L使用WindowListe
22、ner监听器截获窗口关闭事件;2.在监听器接口中的windowClosing(WindowEvent e)方法中通过 Frame 对象的setVisible(false)方或或 dispose。方法来将窗口从屏幕中移除。注:WindowListener接口中还定义了其他窗口事件,如果没有用到Adapter类则必须覆盖所有接口中定 义的事件处理方法。6010-10 使用Frame窗口使用Ada pter类适配器Adapter类本身是一个抽象类,但它的内部 实现并提供了一个事件监听器中所有的方法,但这 些方法都是空方法。如果只想实现某个事件监听器接口中我们感兴趣的 事件处理方法时,可以使用Adap
23、ter类。WindowAdapter类对应 WindowListener接口MouseAdapter类 对应 MouseListene接口MouseMotionAdapter类对应 MouseMotionListener接口6110-10 使用Frame窗口使用Adapter类编写一个Adapter类的步骤如下:L声明一个myWindowAdapter类,它是相应的Adapter类 的子类;class my W i n d o w Ad a pte r extends WindowAdapter2.(可选步骤)在myWindowAdapter类中定义一个构造 函数,参数为某个容器对象:myWi
24、ndowAdapter(Frame f)3.为相应的Frame窗口对象添加监听器时,将监听器的参数设置为 my WindowAdapter 对象:f.addWindowListener(new myWindowAdapter(f)10.10 使用 Frame窗口 使用内嵌类A类中还可以再定义类,称为内嵌类。何时使用内嵌类?当某个Slave类完全只服务于一个Master类时,可以 将之设定为内嵌类。使用内嵌类有何好处?内嵌类可以直接存取其所在类中的私用成员。注:内嵌类作为所在类的成员,二者是一个整体 的关系。6310-10 使用Frame窗口一将Frame作为容器使用 Frame是Compone
25、nt类的子类,它继承了 Component类的所有能力。尸81116的默认布局方式为80131_8丫0戊。6410-10 使用Frame窗口-将Frame作为容器使用课内练习:L创建一个属于你自己的窗口类MyFrame,该类是 Frame类的子类,它有一个MyFrame(String title)的 构造函数,默认的布局方式为GridLayout(2,1)。MyFrame中能够处理窗口关闭事件。2.这个窗口从属于某个名为LiuYan的applet,当该applet 中一个名为“登录”的按钮被点击时,MyFrame窗口 会出现。MyFrame窗口中有登录界面相关的表单元素:10-10 使用Fra
26、me窗口一关闭Frame窗口关闭窗口事件:WindowEvent窗口事件监听器:windowListener窗口关闭事件处理方法:windowClosing()!、关闭窗口Frame 窗 口 触发 WindowEvent e事件发生者事件监听者WindowListener做处理6610-10 使用Frame窗口一关闭Frame窗口关闭Frame窗口步骤:L使用WindowListener监听器截获窗口关闭事件;2.在监听器接口中的windowClosing(WindowEvent e)方法中通过 Frame 对象的setVisible(false)方或或 dispose。方法来将窗口从屏幕中移
27、除。注:WindowListener接口中还定义了其他窗口事件,如果没有用到Adapter类则必须覆盖所有接口中定 义的事件处理方法。6710-10 使用Frame窗口使用Ada pter类适配器Adapter类本身是一个抽象类,但它的内部 实现并提供了一个事件监听器中所有的方法,但这 些方法都是空方法。如果只想实现某个事件监听器接口中我们感兴趣的 事件处理方法时,可以使用Adapter类。WindowAdapter类对应 WindowListener接口MouseAdapter类 对应 MouseListene接口MouseMotionAdapter类对应 MouseMotionListen
28、er接口6810-10 使用Frame窗口使用Adapter类编写一个Adapter类的步骤如下:L声明一个myWindowAdapter类,它是相应的Adapter类 的子类;class my W i n d o w Ad a pte r extends WindowAdapter2.(可选步骤)在myWindowAdapter类中定义一个构造 函数,参数为某个容器对象:myWindowAdapter(Frame f)3.为相应的Frame窗口对象添加监听器时,将监听器的参数设置为 my WindowAdapter 对象:f.addWindowListener(new myWindowAda
29、pter(f)10.10 使用 Frame窗口 使用内嵌类A类中还可以再定义类,称为内嵌类。何时使用内嵌类?当某个Slave类完全只服务于一个Master类时,可以 将之设定为内嵌类。使用内嵌类有何好处?内嵌类可以直接存取其所在类中的私用成员。注:内嵌类作为所在类的成员,二者是一个整体 的关系。7010-10 使用Frame窗口一将Frame作为容器使用 Frame是Component类的子类,它继承了 Component类的所有能力。尸81116的默认布局方式为80131_8丫0戊。7110-10 使用Frame窗口-将Frame作为容器使用课内练习:L创建一个属于你自己的窗口类MyFram
30、e,该类是 Frame类的子类,它有一个MyFrame(String title)的 构造函数,默认的布局方式为GridLayout(2,1)。MyFrame中能够处理窗口关闭事件。2.这个窗口从属于某个名为LiuYan的applet,当该applet 中一个名为“登录”的按钮被点击时,MyFrame窗口 会出现。MyFrame窗口中有登录界面相关的表单元素:10.11使用对话框Dialog一 将Dialog作为容器使用 Dialog是Component类的子类,它继承了 Component类的所有能力。Dialog的默认布局方式为BorderLayout。7310.10使用对话框Dialog
31、一将Dialog作为容器使用课内练习:L创建一个属于你自己的模式化的对话框类MyDialog,该类是Dialog类的子类,它有一个MyDialog(Frame parent,String title)的构造函数,默认的布启方式为 FlowLayouto2.这个窗口从属于某个名为FL_logon的Frame,当该 Frame中一个名为“提交”的按钮被点击时,MyDialog窗口会出现。MyDialog窗口中有确认界面相确认 区I当点击按钮“取消”时,对话框消夕旧?国我Java Applet Window课后练习 为留言板的用户登录,用户注册,发表留言和 查看留言四个界面定一个主界面,其它界面为
32、从属界面。主界面使用applet构造,从属界面 使用Frame或Dialog对豪构造。将留言板整合为完整的系统。75第许多俵程编程11.1 线程的基本概念11.2 线程的生命周期11.3 线程的创建7611-2线程的生命周期线程的生命周期:一个线程从创建到消亡的过程线程的生命周期可分为四个状态:1.创建状态2.可运行状态3.不可运行状态4.消亡状态7711-2线程的生命周期线程的状态转换图:7811-2线程的生命周期1.创建状态I当用new操作符创建一个新的线程对象时,该线程 处于创建状态。处于创建状态的线程只是一个空的线程对象,系统不为它分配资源 通过调用start方法启动该线程。7911.
33、2线程的生命周期2.可运行状态执行线程的start()方法将为线程分配必须的系统资 源,安排其运行,并调用线程体中的rim()方法,这 样就使得该线程处于可运行(Runnable)状态。这一状态并不是运行中状态(Running),因为线程也许实际上并未真正运行。8011.2线程的生命周期3.不可运行状态当发生下列事件时,处于运行状态的线程会转入到 不可运行状态:调用了sleep()方法;线程调用wait方法所等待的特定条件的满足;线程输入/输出阻塞;试图获取某个对象的同步锁;调用了某个线程对象的join()方法。8111.2线程的生命周期返回可运行状态:处于睡眠状态的线程在指定的时间过去后;如
34、果线程在等待某一条件,另一个对象必须通过 notify()或notifyAll()方法通知等待进程条件的 改变;如果线程是因为输入/输出阻塞,输入/输出完成8211.2线程的生命周期4.消亡状态当线程的run方法执行结束后,该线程自然消亡。8311-3线程的创建在Java中通过run方法为线程指明要完成 的任务,有两种技术来为线程提供un方 法。/继承Thread类并重写run方法。,通过定义实现Runnable接口的类进而实现 run方法。84课内练习:1、用两种方法分别编写属于自己的线程,要求能够输出对线程本身的描述,并分别 以不同时间延迟在屏幕上输出5,4,3,2,lo2、在主线程中创建
35、三个子线程,并确保主 线程最后结束。8511-4线程的优先级排程器通过线程优先级来判定何时运行哪个 线程;理论上,相同优先级的线程有同等机会使用 CPU;优先级高的线程比优先级低的线程获 得更多的CPU时间。注:为了保障在无优先级的系统中多数线程仍有机 会运行,线程的调度偶尔不受优先级控制。8611.5多线程的同步 同步(synchronization)当两个或两个以上线程需要共享资源,它们需要某种方法来确定资源在某一时刻 仅被一个线程序占用。达到上述目的的过程称为同步。8711.5多线程的同步synchronize语句同步语句当一个线程需要独占锁定某个资源的时候,该资源的处理过程需要用syn
36、chronized语句来 描述:1.锁定某个资源synchronized(someResource)/statement to be sychonized 8811.5多线程的同步synchronize语句2.锁定调用某个方法的对象synchronized someMethod()/statement to be sychonized注:所有其他试图访问已经锁定的资源的线程 必须挂起直到第一个线程退出管程。8911-5多线程的同步一线程间的通信线程间的通信方法:final void wait()throws InterruptedException 调用该方法的程序放弃synchronize,
37、直接进入睡眠 直到其它线程调用notify。final void notify()叫醒相同对象中第一个调用wait()的线程。final void notifyAll()叫醒相同对象中所有调用wait。的线程。具有最高 优先级的线程最先运行。9011-5多线程的同步一线程间的通信例:生产/消费者的问题(序列问题),一个线程产生数据,一个线程消费数据。,假设数据产生器必须等待消费者完成工作才 能产生新的数据。91第化讲网络通信编程(一,12.1 网络基础12.2 InetAddress类12.3 URL类与URLConnection类9212.2 InetAddress类工厂方法InetAddr
38、ess类封装了域名和相应的IP。如: 202.130.223InetAddress类没有构造函数。为生成一个InetAddress对象,必须调用一 个可用的工厂方法:工厂方法(factory method)是一个类 的静态方法,该方法可以返回一个该类的12.2 InetAddress类课内练习编写一段程序实现域名解析的功能。具体要求如下:1、用户通过第一个命令行参数向程序传入一个 域名,程序对该域名进行解析,分析出相应 的工P地址。2、如果不存在该Host,给出相应提示。I:JavaMietjava Test wu.nba.con主帼:wu.nba.con IPft:209.107.214.9
39、7主楠:uw.nba.coA 碱;209.107.214.1059412.3 URL类与URLConnection类,URL 简介 URL(Uniform Resource Locator)统一资源定位 符:用于表示Internet中信息资源所在的位置。URL的表达形式如下:,协议标识符:/主机名:端口号/文件路径http:/localhost:8080/web/edu/index,jsp注:URL中的路径采用UNIX系统的命名规范,其耳12.3 URLConnection 类 URLConnection类可以用于访问远程资源属性。使用URLConncetion类的对象,我们可以在远程 资源(
40、如某个WEB页面)传输到本地之前就可以 查看它的属性。URLConncetion类对象的创建依赖于URL类:public final URLConnection openConnection()throws lOException9612.4使用TCP连接的套接字进行通信-Socket套接字I Socket(套接字)是20世纪80年代初由美国加 州大学伯克利分校提出的的一种通信标准。I从Socket的角度,C/S模式可以这样理解:(1)“服务器”程序总在监听某个特定的端口,等待“客户”程序的Socket连接请求;(2)“客户”程序向“服务器”程序所在的主机和端口发出Socket连接请求。9712.4 使用TCP连接的套接字进行通信总结9812.5 使用无连接的数据报(UDP)进行通信 UDP(User Datagram Protocol):用户数据报 协议。UDP不保证每个数据报是否到达目的地,而 且不保证数据报的到达时间和到达顺序。J.*包中用于UDP通信的类是:DatagramPacket:用于创建数据报Datagramsocket:用于发送或接收数据报9912.5使用无连接的数据报(UDP)进行通信-利用UDP进行通信的过程