Java编程基础知识简要回顾.ppt_第1页
Java编程基础知识简要回顾.ppt_第2页
Java编程基础知识简要回顾.ppt_第3页
Java编程基础知识简要回顾.ppt_第4页
Java编程基础知识简要回顾.ppt_第5页
已阅读5页,还剩93页未读 继续免费阅读

下载本文档

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

文档简介

1、Java编程基础知识简要回顾:,面向对象编程的基本概念 两类基本的Java程序编写及运行方式 Java语言的语法结构 在Java中如何定义类( 关键:修饰符的使用) 在Java中如何实现继承与多态 如何利用系统提供的工具类 如何设计图形用户界面(关键:将控件的事件响应与类的方法联系起来),第7章 JAVA高级编程,7.1 Java的数据库编程(重点) 7.2 输入输出流和文件处理 7.3 Java的多线程机制(难点) 7.4 Java的网络编程 7.5 Java的多媒体技术,学习要求,掌握Java数据库编程的基本技术-Jdbc 理解流的概念,掌握在Java中进行文件读、写操作的方法 理解Jav

2、a的多线程机制 了解Java网络编程的一般原理 了解Java多媒体技术的基本知识,思考:,程序中数据的存储方法有: 单个、临时的:变量 多个、同类型、临时的(退出即消失):数组 多个、不同类型、临时的:向量,若Java应用程序中需要用到大量的数据, 或需要长久保留的数据,或需要进行反复查询、 统计、维护等操作的数据, 该用什么方式进行存储和调用更有效呢?,7.1 Java的数据库编程,Java中专门设置了一个java.sql包,定义了很多用来实现SQL功能的类,使用这些类,编程人员就可以很方便地开发数据库前端的应用。 因为SQL是一种直接对数据库进行操作的非过程扫描语言,不适合整个数据库应用程

3、序的前端编程,所以需要其他语言来实现SQL语言的功能以完成对数据库的操作。,7.1.1 JDBC的概念,JDBC(Java DataBase Connectivity)是一种用于执行SQL语句的Java API,由一组用Java语言编写的类和接口组成,可以为多种关系数据库提供统一访问,即用Java实现的数据库接口技术。 辅助Java程序实现数据库功能的配套支持技术通称为JDBC。 JDBC的用途: (1)与数据库建立连接 (2)发送SQL语句 (3)处理结果,示例:,/与数据库建立连接 Connection con=DriverManager.getConnection(“jdbc:odbc:

4、student”,”user”,”pwd”); /发送SQL语句,从数据库中提取记录 Statement stmt=con.createStatement(); ResultSet rs=stmt.excuteQuery(“select id,name,score from table_student ”); /对读出的记录结果进行处理赋给变量 While (rs.next() int sid=rs.getInt(“id”); String sname=rs.getString(“name”); Float scj=rs.getFloat(“score”); ,JDBC 和数据库的通信路径,J

5、DBC API,JDBC Driver API,负责与java应用程序通信,向java应用程序提供数据,负责与具体数据环境的连接,Java 应用程序,JDBC 驱动程序管理器,数据库,JDBC/ODBC桥,供应商提供的JDBC驱动程序,ODBC驱动程序,数据库,四类JDBC驱动程序,第一类把JDBC转换成ODBC,靠ODBC驱动程序与数据库通信 第二类其源代码由两部分组成,一部分是java语言代码,另一部分是本地代码,这类驱动程序和一个数据库客户的API通信; 第三类是一个纯Java客户库,它使用一个独立于数据库的协议,把数据库请求传送给一个服务器组件,这个组件把数据库请求转换成指定数据库协议

6、接受的请求; 第四类是一个纯Java库,直接把JDBC请求转换成指定数据库协议接受的请求。 数据库厂商一般都为其数据库提供第三或第四类驱动程序。,JDBC-ODBC桥的概念,ODBC(Open Database Connectivity,开放数据库互连)是微软公司开放服务结构(WOSA,Windows Open Services Architecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC。 ODBC的最大优点是能以统一的方式处理

7、所有的数据库。,JDBC-ODBC桥是一个JDBC驱动程序,它通过将JDBC操作转换为ODBC操作来实现JDBC操作。 通过odbc子协议,使用URL打开JDBC连接即可使用桥,建立连接前必须将桥驱动程序类sun.jdbc.odbc.JdbcOdbcDriver添加到名为jdbc.drivers的java,lang.System属性中,或者用代码显示加载: Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);,7.1.2 用JDBC连接数据库,1. 建立数据源 加载Java应用程序所用的数据库的驱动程序。 以JDBC-ODBC桥为例:控制面板管理工具数据

8、源(ODBC)系统DSN添加选择后台数据库: SQL server(或MS Access Driver) 给出数据源名和服务器名选择SQL验证方式、输入用户名和密码选择需要连接的数据库确定。 例: Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”); String url=”jdbc:odbc:student”;,ODBC 数据源管理中的用户DSN和系统DSN有什么区别?,用户DSN是与用户相关的,不同用户建立的DSN相互不可见; 而系统DSN与用户无关,所有用户都可见 ; 用户DSN保存在注册表中的HKEY_CURRENT_USERSoftwareOD

9、BC项下(不包括ODBC驱动) 系统DSN保存在注册表中的HKEY_LOCAL_MACHINESoftwareODBC项下,2. 建立连接,DriverManager类用来处理驱动程序的调入,并且对新的数据库连接提供支持. 与数据库建立连接的标准方法是调用方法创建对象: Connection con= DriverManager.getConnection ( String url, String user, String password);,数据源的位置,访问数据源的密码,访问数据源的用户名,3. 执行SQL语句,JDBC提供了Statement接口来发送SQL语句,Statement接口

10、的对象由createStatement方法创建; 常用的SQL语句: SELECT语句查询记录 INSERT语句插入记录 UPDATE语句更新记录 DELETE语句删除记录 CREATE语句创建表,SQL语句发送后返回的结果通常存放在一个ResultSet接口的对象中; ResultSet可以看作一个表,这个表包含由SQL返回的列名和相应的值, ResultSet对象中维持了一个指向当前行的指针,通过一系列getxxx方法检索当前行的各个列,从而显示出来。 4. 关闭连接 statement.close(); connection.close();,7.1.3 JDBC编程,在Java中用JD

11、BC编程主要是对JDBC API的应用,在JDBC API中对数据库的应用主要是对DriverManager类、 Connection、 Statement 、PreparedStatement和 ResultSet这几个接口的应用。 DriverManager类 是JDBC的管理层,跟踪可用的驱动程序,并在数据库和应用程序之间建立连接。通过调用Class.forName()方法可显示地加载驱动程序,然后自动在DriverManager类中注册。,例:,Class.forName(sun.jdbc.odbc.JdbcOdbcDriver); String url=jdbc:odbc:CardA

12、ccess; Connection conn = DriverManager.getConnection(url,”uid”,”pwd”);,Statement接口 Statement对象用于将SQL语句发送到数据库中。 Statement接口提供了三种执行SQL语句的方法: executeQuery(String )用于执行select语句 executeUpdate(String)用于执行insert 、update、 delete语句及数据定义语句(如create table) execute()用于执行返回多个结果集、多个更新等复杂功能。 例: Statement stm= conn.

13、 createStatement() ; ResultSet rs=stm.executeQuery(“select * from xs”);,PreparedStatement接口,PreparedStatement 代表一个预编译的SQL语句,是从Statement接口继承而来的,与Statement不同之处: (1) PreparedStatement实例包含已编译好的SQL语句,执行速度比Statement快,需要多次执行的SQL语句经常创建为PreparedStatement对象; (2) 包含在PreparedStatement中的SQL语句中可以具有一个或者多个IN参数,SQL语

14、句中的参数先用 ? 号作占位符. 一般Statement用于SELECT语句,PreparedStatement用于UPDATE语句,ResultSet用于SELECT的结果集。,ResultSet接口,ResultSet包含符合SQL语句中条件的所有行,并通过一套get方法访问当前行中的不同列。 ResultSet.next()方法用于移动到记录集中的下一行,并使下一行成为当前行。 列是从左到右编号的,从列1开始。用getXXX方法输入列名时不区分大小写。 例:ResultSet rs=stm.executeQuery(“select xh,xm,nl from tb”); String n

15、o= rs.getString(“xh”); String name= rs.getString(“xm”); int age= rs.getInt(3);,用JDBC-ODBC 连接数据库示例,import java.sql.*; public class TestJDBC public static void main(String args) Statement stm; ResultSet rs; Connection conn; PreparedStatement sql2,sql3; String url = jdbc:odbc:CardAccess; String user= ;

16、 String password= ; try / 使用jdbc与odbc桥创建数据库连接 Class.forName(sun.jdbc.odbc.JdbcOdbcDriver); / 使用getConnection()方法建立连接,第2个参数定义用户名,第3个参数定义密码 conn = DriverManager.getConnection(url,user,password); stm=conn.createStatement();,sql2= conn.prepareStatement(“update STUDENT set 性别=男 where 姓名=Jane); sql3= conn

17、.prepareStatement(“insert into STUDENT(学号,姓名, 性别) values(1006,Alice,男); sql2.executeUpdate(); /执行更新 / sql3.executeUpdate(); /执行插入 String sql1=select * from STUDENT; rs=stm.executeQuery(sql1); /得到查询结果并打印数据库原始记录 System.out.print(学号 ); System.out.print(姓名 ); System.out.println(性别); while(rs.next() Syst

18、em.out.print(rs.getLong(1)+ | ); System.out.print(rs.getString(2)+ | ); System.out.println(rs.getString(3); ,rs.close(); stm.close(); conn.close(); catch(SQLException sqle) System.out.println(1+sqle.toString(); catch(Exception e) System.out.println(2+e.toString(); ,7.2 输入输出流和文件处理,7.2. 1 流的概念 流是指在计算机

19、的输入与输出之间运动的数据的序列。输入流代表从外设流入计算机的数据序列,输出流代表从计算机流向外设的数据序列。 流的最大特点是:数据的获取和发送均按数据序列顺序进行。 Java中的流分为两种(被抽象为四个类): 字节流: InputStream类和OutputStream类 字符流: Reader类和 Writer类 字符流比字节流更有效。,1. 字节流,从抽象类InputStream和OutputStream派生出来的一系列类,这类流以字节(byte)为基本处理单位。,基本输入流类InputStream的常用方法, 从流中读取数据:int read( ); /读取一个字节,返回值为所读的字节

20、 int read( byte b ); 读取多个字节,放置到字节数组b中,通常读取的字节 数量为b的长度,返回值为实际读取的字节的数量int read( byte b , int off, int len ); 读取len个字节,放置到以下标off开始字节数组b中, 返回值为实际读取的字节的数量 int available( ); /返回值为流中尚未读取的字节的数量long skip( long n ); /读指针跳过n个字节不读,返回值为实际跳过的字节数量 关闭流: close( ); /流操作完毕后必须关闭,基本输出流类OutputStream 的常用方法, 输出数据:void writ

21、e( int b ); /往流中写一个字节bvoid write( byte b ); /往流中写一个字节数组bvoid write( byte b , int off, int len ); 把字节数组b中从下标off开始、长度为len的字节写入流中 flush( ) /刷空输出流,并输出所有被缓存的字节 由于某些流支持缓存功能,该方法将把缓存中所有内容强制输出到流中。 关闭流: close( ); /流操作完毕后必须关闭,2 字符流,从抽象类Reader和Writer派生出的一系列子类,这类流以16位的Unicode码表示的字符(一个字符由两个字节组成)为基本处理单位。 常用字符流子类和功

22、能,7.2.2 基本流,1. 键盘输入和格式化输出 Java有3个内置的标准流对象: 1)标准输入流System.in: 用来读取用户从键盘的输入 2)标准输出流System.out: 用来在屏幕上显示信息 3)标准输入流System.err: 用来显示出错信息 (1)键盘输入: 使用System.in对象的read()方法 例: char c=(char)System.in.read( ); 使用InputStreamReader 、BufferReader流类 例: InputStreamReader isr=new InputStreamReader(System.in); Buffer

23、Reader br=new BufferReader(isr);,通过Java的控制台类Console类,Console类不是Java的标准类库,它属于corejava包。 使用Console类时需要加: Import corejava.Console Console类主要方法: 1)readInt(String prompt) 提示输入一个整数 2)readDouble(String prompt) 提示输入一个浮点数 3)readLine(String prompt) 提示输入一个字符串,直到行结束。 例:String s=Console.readLine(“请输入你的名字”); Syst

24、em.out.println(“你好,”+s);,(2)格式化输出,用Java的标准输出System.out,可以输出不同类型的对象: 例:Int a=20; System.out .print(a) System.out .println(“大家好”) /加换行 用java.text包中的NumberFormat类可以控制显示格式,有三种方法: NumberFormat.getNumberInstance( ) /附加逗号 NumberFormat.getCurrencyInstance( ) /货币符号 NumberFormat.getPercentInstance( ) /百分号,例:i

25、mport java.io.*; import java.text.*; Public class TestOutput Public static void main(String args ) double x=2345.123; String s1,s2,s3; NumberFormat n1=NumberFormat.getNumberInstance( ); NumberFormat c1=NumberFormat. getCurrencyInstance( ); NumberFormat p1=NumberFormat. getPercentInstance( ) ; s1=n1.

26、format(x); s2=c1.format(x); s3=p1.format(x); System.out.println(s1+” ”+ s2+” ”+ s3); 结果: 2,345.123 ¥ 2,345.12 234,512%,用户自定义输出格式 用DecimalFormat类和Format类 DecimalFormat类适合货币之类的格式化 Format类(在附带的corejava包中,要把它加到classpath中)适合科技方面格式化,和C语言的printf函数功能类似。 DecimalFormat类的范例格式串,Format的范例格式,首先加: import corejava.

27、Format; f固定格式的浮点数 Format.printf(“x的值是%10.2fn”, x); d,i 以十进制表示的整数 s字符串 c字符 g,G以一般格式表示浮点数,对小数用定点格式,对大数用指数格式 x,X以十六进制表示的整数 o以八进制表示 例:Format.printf(“你的工资是%10.2fn”, pay);,7.2.3 文件类,1. Java程序的文件与目录管理 Java.io包中的File类专门用来管理磁盘文件和目录。每个File类的对象表示一个磁盘文件或目录,对象属性中包含名称、长度、所含文件个数等信息。 (1)创建File类对象的三种方法: File(String

28、path); 指明磁盘文件或目录名及其路径 注意:目录分隔符用System.dirSep表示 如:File f1=new File(“c:”+ System.dirSep+”sj”) File(String path, String name);,文件或目录的路径,文件或目录名,File(File dir, String name); (2)获取文件或目录属性,已经存在的磁盘目录,(3)文件或目录的操作,注意:由于Java Applet程序是从网络上下载到本地机器运行的,不可知也不可控,所以Java的安全机制禁止Java Applet程序访问和存取本地文件,如果试图在Java Applet程序

29、中使用文件操作,则将引发Java的安全性异常。,文件操作例子,2. 写文本文件,方法一:用FileOutputStream打开文件my.txt,然后用PrintStream 对象p的println方法把字符串写入文件中。 例: FileOutputStream fout=new FileOutputStream(“my.txt”) PrintStream p=new PrintStream(fout); p.println(“要写入文本文件中的内容”); p.close();,写文本例子1,方法二:用FileWriter打开文件myf.txt,又创建了文本输出流out,然后用out 的prin

30、t(或者println)方法把字符串写入文件中。 例: FileWriter fw= new FileWriter(“myf.txt”); PrintWriter out=new PrintWriter(fw); out.print(“要写入文本文件中的内容”); out.close(); /关于输出 fw.close(); /关闭文件,写文本例子2,3. 读文本文件,方法一:用FileInputStream打开文件my.txt,然后建立DataInputStream的 对象in(文件流),使用in的readLine()方法以一行为单位读出my.txt文件中的所有字符串。 例: FileInp

31、utStream fs=new FileInputStream(“my.txt”) DataInputStream in=new DataInputStream(fs); while(in.available( )!=0) System.out.println( in.readLine() ); in.close(); /关闭输入流,读文本例子1,方法二:用FileReader打开文件myf.txt,然后用BufferedReader类的对象br作为文件流,用br 的readline()读取文件中的字符串。 例: FileReader fr= new FileReader (“myf.txt”

32、); BufferedReader br=new BufferedReader(fr); String record=new String( ); Int recCount=0; While (record=br.readLine()!=null) recCount+; System.out.println(recCount+”:”+ record); br.close(); /关于缓存 fr.close(); /关闭文件,读文本例子2,4. 程序对文件的随机访问,用RandomAccessFile类可以实现对文件的随机读写操作,即可以在文件的任意位置执行数据读写; 创建RandomAcces

33、sFile的对象 例:File mf= new File (“myf.txt”); RandomAccessFile myRAF= new RandomAccessFile (mf, ”rw”);,访问模式: rw: 可读、可写 r: 只读,作为数据源的文件,对文件位置指针的操作,利用getPointer( )方法可以获得当前文件位置指针从文件头算起的绝对位置: public long getPointer( ); 利用seek( )方法可以将指针移动到pos指定的文件位置: public void seek( long pos ); 利用length( )方法可以返回文件的字节长度: pub

34、lic long length( );,从文件头算起的绝对位置,对文件进行读写操作,RandomAccessFile类实现了DataInput和 DataOutput接口,在读/写时具备强大的含类型转换的输入/输出功能; RandomAccessFile类的所有方法都有可能抛出IOException异常,在利用它实现文件操作时需要将相关语句放在try块中,并配上catch块来处理异常。,文件访问例子,7.3 Java的多线程机制,7.3.1 Java中的线程 1. 程序、进程与线程的区别,线程是比进程更小的执行单位,一个进程在执行过程中可以 产生多个线程,每个线程有自己的产生、存在、消亡的过程

35、。 线程间可以共享相同的内存单元,实现数据交换、实时通信 和同步操作。,进程是程序的一次动态执行过程(放电影),对应着代码加载、 执行到执行完毕的全过程。每一个进程都有自己独立的一块内 存空间、一组系统资源。在进程概念中,每一个进程的内部数 据和状态都是完全独立的。,程序是一段静态的代码,是应用软件执行的蓝本(电影胶片)。,Java的多线程,Java内在支持多线程,它的所有类都是在多线程下定义的,Java利用多线程可以开发能同时处理多个任务的功能强大的应用程序。 Java程序通过流控制来执行程序流,程序中单个顺序的流控制称为线程,多线程则指的是在单个程序中可以同时运行多个不同的线程,执行不同的

36、任务。多线程意味着一个程序的多行语句可以看上去几乎在同一时间内同时运行。,使用多线程的好处:,使UI交互的响应更块 充分利用多处理器系统 简化建模 执行异步和后台处理,Java中的线程由三部分组成: 1. 虚拟的CPU,封装在java.lang.Thread类中2. CPU所执行的代码,传递给Thread类3. CPU所处理的数据,传递给Thread类,Java中的线程多任务示意图,2. 线程的状态与生命周期,start(),sleep()时间到,获得锁,wait(),scheduler(),yield(),sleep()或join(),run()方法结束,synchronized,notif

37、y() notifyAll(),Interrupt(),(1)创建状态(new Thread)执行下列语句时,线程就处于创建状态:Thread myThread = new MyThreadClass( );当一个线程处于创建状态时,它仅仅是一个空的线程对象,系统不为它分配资源。,(2) 可运行状态( Runnable )Thread myThread = new MyThreadClass( );myThread.start( );当一个线程处于可运行状态时,系统为这个线程分配了它需的系统资源,这样该线程处于运行就绪状态,系统中可以同时有多个线程处于Runnable 状态。 (3) 运行状态

38、(Running) 是线程占有CPU并实际运行的状态。,( 4) 阻塞状态(Blocked) 阻塞状态也称为不可运行状态。因为某种原因(输入/输出、等待消息或其它阻塞情况),系统不能执行线程的状态。这时即使处理器空闲,也不能执行该线程。 进入不可运行状态的原因有如下几条:1) 调用了sleep()方法,休眠时间到即进入可运行状态; 2) 调用了t.join()方法,当t线程结束或等待时间 到即进入可运行状态; 3) 为等候一个条件变量,线程调用wait()方法; 4) 输入输出流中发生线程阻塞;,线程的终止一般可通过两种方法实现: 自然撤消(线程执行完) 被停止(调用stop( )方法) 目前

39、不推荐通过调用stop()来终止线程的执行,而是让线程执行完。,(5) 死亡状态(Dead),使用线程时要注意线程的同步,可以用synchronized来修饰那些不能被中途打扰的方法。,7.3.2 如何在程序中实现多线程,1. 创建用户自定义的一个线程子类 即创建Thread类的子类, 继承线程类Thread并重写其中的方法 run(), Thread类综合了Java程序中一个线程需要拥有的属性和方法。 由于Java只支持单重继承,用这种方法定义的类不能再继承其它父类。 关键性操作步骤: (1)定义用户线程的操作,即定义用户线程的 run()方法 (2)在适当时候建立用户线程实例。,关于Thr

40、ead类: (1) 构造函数 public Thread ( ):创建一个系统线程类的对象。 public Thread ( Runnable target ): 在上一个构造函数完成的操作基础之上,利用参数对象实现了Runnable接口的target对象中所定义的run( )方法,来初始化或覆盖新创建的线程对象的run( )方法。 public Thread ( String ThreadName ): 在第一个构造函数工作的基础上,为所创建的线程对象指定一个字符串名称供以后使用。 public Thread (Runnable target, String ThreadName): 实现,

41、两构造函数的功能。,(2) 线程优先级,Thread类有三个有关线程优先级的静态常量: MIN-PRIORITY 代表最小优先级,通常为1; MAX-PRIORITY 代表最高优先级,通常为10; NORM-PRIORITY 代表普通优先级,缺省数值为5 (3) Thread类的常用方法 start( ) 调用该方法启动线程 run( ) 线程被调度后执行的动作 sleep(int millsecond) 让线程放弃CUP资源休眠一段时间 isAlive( ) 判断线程是否处于存活状态 currentThread( ) 返回当前正在使用CUP资源的线程 interrupt( ) 吵醒处于sle

42、ep状态的线程,Thread例子,2. 在用户自己的类中实现Runnable接口,即实现Runnable接口的用户类必须实现其唯一的方法run()。一个实现了Runnable接口的类实际上定义了一个主线程之外的新线程的操作。 实现接口Runnable的类仍然可以继承其它父类。 关键性操作步骤: 定义run()方法的具体内容 当用户程序需要建立新线程时,只要以这个实现了run()方法的类为参数创建系统类thread的对象,就可以把用户实现的run()方法继承过来。,关于Runnable接口:,Runnable接口只有一个方法run( ),所有实现Runnable接口的用户类都必须具体实现这个ru

43、n( )方法,为它书写方法体并定义具体操作。 Runnable接口中的这个run( )方法是一个较特殊的方法,它可以被运行系统自动识别和执行。当线程被调度并转入运行状态时,它所执行的就是run( )方法中规定的操作。,Runnable例子,实现多线程的两种方法的比较:,1. 使用Runnable接口1) 可以将CPU、代码和数据分开,形成清晰的模型;2) 还可以从其他类继承;3) 保持程序风格的一致性。2. 直接继承Thread类1) 不能再从其他类继承;2) 编写简单,可以直接操纵线程,无需使用 Thread.currentThread( )。,7.4 Java的网络编程,由于有一套功能强大

44、的用于网络的API,用Java开发网络软件非常方便, 这些API是一系列类和接口,均在和包中 。 其中最重要的是: 因特网地址类:InetAddress类、 流套接字:Socket类(客户程序)、ServerSocket类(服务器程序) 数据包类:DatagramPacket类 统一资源定位符类:URL类,7.4.1 用Java实现底层网络通信,1. 基于连接的流式套接字(基于TCP协议),套接字(Socket)的概念 在网络上用IP标识计算机,用端口号标识正在计算机上运行的程序,端口号与IP地址的组合就得出一个网络套接字。 Socket可以看成在两个程序进行通信连接中的一个端点,一个程序将一

45、段信息写入Socket中,该Socket将这段信息发送给另外一个Socket,使这段信息能传送到其他程序。,端口常识: 80: HTTP 21: FTP 23:Telnet 25:SMTP 1433: SQL Server IP常识: 由4个字节构成,每个字节用十进制的0255表示 A类:1个字节的网络地址 + 3字节主机地址,网络地址的最高位必须是“0”,地址范围: B类:2字节的网络地址+ 2字节主机地址,网络地址的最高位必须是“10”,地址范围: 55 C类:3字节的网络地址和1字节的主机地址组成,网络地址的最

46、高位必须是“110”,范围:55 D类:第一个字节以“lll0”开始,它是一个专门保留的地址,用于多点广播 ,多点广播地址用来一次寻址一组计算机 。 E类:以“llll0”开始,为将来使用保留。 特殊地址:地址“”对应于当前主机。全“1”的IP地址(“255255255255”)是当前子网的广播地址。,Socket是TCP/IP协议的编程接口,即利用Socket提供的一组API就可以编程实现TCP/IP协议,在Java语言里,这个编程接口就是若干系统预先定义好的类。 流式Socket所完成的通信是一种基于连接的通信 (类似于生活中的

47、打电话,双方先连上线再通信),套接字建立连接的工作过程,客户端流套接字的初始化代码将IP地址和端口号传递给客户端主机的网络管理软件; 管理软件将IP地址和端口号通过NIC(网卡)传递给服务器端主机; 服务器端主机读到经过NIC传递来的数据,通过套接字和端口查看服务器程序是否处于监听状态 ; 若是,则发回一个响应信号,若否,则返回一个异常; 收到回信后,客户端流套接字的初始化代码就给客户程序建立一个端口号,并将此号传给服务器程序的套接字,完成流套接字的初始化。,流式Socket通信过程,InetAddress类,InetAddress类描述了32位或128位IP地址,它有两个子类: Inet4A

48、ddress 类 Inet6Address 类 InetAddress类只有一个构造函数,且不能传递参数,所以不能直接创建InetAddress对象。 可以通过5个静态方法创建一个InetAddress对象或InetAddress数组。,1) getAllByName(String host) 方法,返回一个InetAddress对象数组的引用,每个对象包含一个表示相应主机名的单独的IP地址,如果没有IP,则抛出一个UnknownHostException异常对象。 2) getByAddress ( byte addr) 方法 返回一个InetAddress对象的引用,这个对象包含一个IPv

49、4(4个字节地址)或IPv6(16个字节地址数组)地址数组,如果返回的数组不是4字节或6字节的,则抛出一个UnknownHostException异常对象。,返回一个InetAddress对象的引用,这个对象包含一个由host和4(或16)个字节的addr数组指定的IP地址,否则抛出UnknownHostException异常。,3) getByAddress (String host, byte addr) 方法,4) getByName(String host) 方法,返回一个InetAddress对象,该对象包含一个与host指定的主机相对应的IP地址,如果没有IP,则抛出一个Unkno

50、wnHostException异常对象。 例: InetAddress ia= InetAddress. getByName(“”); 5) getLocalHost ( ) 方法 返回一个InetAddress对象,该对象包含了本地主机的IP地址。,域名与IP地址的互换:,通过getCanonicalHostName( )方法从域名服务器中获得标准的主机名 用getHostAddress( )方法获得IP地址 用getHostName( )方法获得主机名 用isLoopbackAddress( )方法判断IP地址是否是一个loopback(虚接口)地址。,测试InetAddress类的使用示

51、例,import .*; public class TestInetAddress public static void main(String args) throws UnknownHostException String host=localhost; if(args.length=1) host=args0; InetAddress ia= InetAddress.getByName(host); System.out.println( Canonical Host Name=+ia.getCanonicalHostName(); System.out.println(Host Add

52、ress=+ia.getHostAddress(); System.out.println(Host Name=+ia.getHostName(); System.out.println(Is Loopback Address=+ia.isLoopbackAddress(); ,Socket 类与 ServerSocket类,Socket类和ServerSocket类是用Java实现流式Socket通信的主要工具。 Socket类:当客户程序需要与服务器程序通信时,客户程序在客户机上创建一个Socket对象,创建一个Socket对象就建立了一个Client与Server间的连接; Server

53、Socket类代表服务器流套接字,创建一个ServerSocket对象就创建了一个监听服务。,ServerSocket类使用时需要用构造函数创建一个ServerSocket对象,如: ServerSocket(int port) 其中port参数用来传递端口号,这个端口就是服务器监听连接请求的端口。如果此时出现错误将抛出IOException异常对象。 开始监听后,服务程序无限循环调用ServerSocket的accept()方法,建立连接后accept()返回一个最新创建的Socket对象,该对象绑定了客户程序的IP地址或端口号。,Socket类使用时可用两种构造函数创建对象: (a) So

54、cket(InetAddress addr, int port); 通过addr获得服务器的IP地址,通过port获得端口号。 (b) Socket(String host,int port); 通过host获得服务器的主机名,通过port获得端口号。 创建了Socket对象后,可以调用Socket的getInputStream ( )方法从服务器获得输入流读传送来的信息,也可以通过其getOutputStream ( )方法获得输出流来发送信息。 读写完成后,客户程序调用close()方法关闭流和流套接字。,Socket类的常用方法,(3)实现流式Socket通信的Client端与Serve

55、r端编程,见教材 P: 311 例11.5 。,2 . 无连接的数据报(基于UDP协议),流式Socket可以实现准确的通信,但是占用资源较多,在某些无须实时交互的情况下,应该使用无连接的数据报方式。 数据报是无连接的远程通信服务(类似于生活中的寄信) ,数据以独立的包为单位发送,不保证传送顺序和内容的准确性。数据报Socket又称为UDP套接字,它无须建立、拆除连接,直接将信息打包传向指定的目的地,使用起来比流式Socket要简单一些。,数据报的发送和接收过程,Java中用于无连接的数据报通信的类有两个: 1)用于读取数据等信息的DatagramPacket 类 2)用于实现数据报的发送和接

56、收过程的DatagramSocket 类 数据报的发送过程: 1) 创建DatagramPacket对象,其中包含如下信息: 要发送的数据; 数据报分组长度; 发送目的地的主机IP地址和目的端口号。 2) 在指定的或可用的本机端口创建DatagramSocket对象 3) 调用该DatagramSocket的send( )方法,以DatagramPacket 对象为参数发送数据报。,数据报的接收过程,1) 创建一个用于接收数据报的DatagramPacket对象,其中包含空白数据缓冲区和指定数据报分组长度。 2) 在指定的或可用的本机端口创建DatagramSocket对象。 3) 调用Dat

57、agramSocket对象的receive( )方法,以DatagramPacket对象为参数接收数据报。 接收到的信息有: 收到的数据报文内容; 发送端的主机IP地址; 发送端主机的发送端口号 UDP的编程实现 见教材P:322例 11.8,7.4.2 Java程序对网上资源的访问,1. 利用URL类访问网上资源 import .*; import java.io.*; public class getURLMeg public static void main(String args) String s ; try URL MyURL=new URL( BufferedReader dis

58、 = new BufferedReader(new InputStreamReader (MyURL. openStream(); while( ( s = dis.readLine() != null )/从URL对象处获得信息并显示 System.out.println(s); ,URL例子,catch(MalformedURLException e) /创建URL对象可能产生的异常 System.out.println(URL in wrong form, check it again.); catch(IOException e) System.out.println(IO Excep

59、tion ocurred when get information.); ,2. 使用URLConnection类,当利用给定的URL地址信息创建了一个URL对象时,调用该对象的方法openConnection( )就可以返回一个对应于其URL地址的URLConnection对象。使用URLConnection类可以在获取信息的同时,还能够向远方的计算机节点传送信息, URLConnection 类中包含了较丰富的用于网络资源传递的方法,有了URLConnection对象之后,连接过程自动完成,附加信息也由系统负责,大大简化了编程过程。,URLConnection例子,3. 用Applet的方法访问网络资源,(1) 访问指定网页 Apple

温馨提示

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

最新文档

评论

0/150

提交评论