• 1. 课程小结
  • 2. 网络编程的目的:就是指直接或间接地通过网络协议与其他计算机进行通讯。 网络编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。
  • 3. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机。而TCP层则提供面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的。
  • 4. 第1章  Java 数据流 第2章 Java 多线程编程 第3章 Internet寻址 第4章 URL数据检索 第5章 Java Socket编程 第6章 Java Mail
  • 5. 第1章  Java 数据流一、 流的概述 Java使用流(stream)来执行输入输出(I/O)的功能,流是一种数据的源头和目的之间的通信途径。 用于读入数据称为输入流(input stream), 用于写出数据称为输出流(output stream)。 当使用流时需要使用java.io包,因此在涉及数据流操作的程序中都要先导入java.io包: import java.io.*;
  • 6. 二、 I/O类层次结构 Java提供超过60个不同的流类型,这些流类包含在上面提到的java.io包中, 四个基本的抽象类: InputStream、OutputStream、Reader和Writer。 你不能创建这四个类型的对象,但是其他的方法的返回值可以是他们
  • 7. 三、 标准输入输出在System类中有三个静态域System.in、System.out和System.err。 可以在标准位置使用这三个系统流进行I/O操作。 public static InputStream in 读取字符数据的标准输入流。 public static PrintStream out 显示或打印输出信息的标准输出流 public static PrintStream err 输出错误信息的标准错误流。
  • 8. 字节流字节流是用来读写8位的数据,由于不会对数据作任何转换,因此可以用来处理二进制的数据。 (一)、OutputStream (二)、InputStream (三)、FileInputStream和FileOutputStream (四)、ByteArrayInputStream和ByteArrayOutputStream (五)、BufferedInputStream和BufferedOutputStream
  • 9. 字符流字节流速度快高效高,读起来困难(因为是二进制)。 字符流主要是用来支持Unicode的文字内容,绝大多数在字节流中所提供的类,都有相对应的字符流的类。 Reader和Writer InputStreamReader、OutputStreamWriter ◇ FileReader、FileWriter ◇ CharArrayReader、CharArrayWriter ◇ PipedReader、PipedWriter ◇ FilterReader、FilterWriter ◇ BufferedReader、BufferedWriter ◇ StringReader、StringWriter
  • 10. 使用字符流可以写出不依赖于具体编码的应用程序。 因为java中的字符是以Unicode的形式存储的。使用Unicode可以对世界上大部分语言的字符进行编码。使用字符流可以避免手工在程序中处理繁多的字符编码,因为字符是以Unicode存放的,字符流则隐藏了这个处理编码的复杂性。
  • 11. 文件的随机访问如果需要对文件进行随机的访问,必须使用RandomAccessFile类
  • 12. 目录和文件管理File类是一个和流无关的类。 File对象可以用来生成与文件(及其所在的路径)或目录结构相关的对象, 由于不同的系统可能会有不同的目录结构表示法, 使用File类可以达到与系统无关的目的(使用抽象的路径表示法)。 类java.io.File提供了获得文件基本信息及操作文件的一些方法
  • 13. 其他常用的流处理一、管道流 管道(pipe)提供一种线程之间的通信方法,可用于IPC(Inter-Process Communication进程间通信) 或是ITC(Inter-Thread Communication线程间通信),但不能够在不同主机间进行通信。 一个输入管道是用来接收一个输出管道所写出的数据,因此,一个线程会负责送出(PipedOutputStream对象)数据,而另一个线程序要负责接收(PipedInputStream对象)这些数据,PipedInputStream和PipedOutputStream对象总是成对出现的。并且由于管道的数据流是单向的
  • 14. ZIP文件流ZIP文件是存储了一个或多个文件的存档文件,通常使用压缩格式。 从Java 1.1起,Java能够处理GZIP和ZIP格式的存档文件。 与其他的流不同,处理ZIP文件的类ZipInputStream和ZipOutputStream在java.util.zip,而不在java.io中,因此在使用ZIP文件流时记住要加上:import java.util.*;
  • 15. 对象流Java中的数据流不仅能对基本数据类型的数据进行操作,而且也提供了把对象写入文件或从文件中读取对象的功能,这一功能是通过java.io包中的ObjectInputStream和ObjectOutputStream两个类实现的。 由于他们和DataInputStream及DataOutputStream有共同的接口,因此他们也可使用相同的方法来读取或写入数据。 除此之外,这两个类还有如下方法用于读写对象: void writeObject(Object obj):ObjectOutputStream的方法,将对象写入流。 Object readObject(): ObjectInputStream的方法,将对象读出。
  • 16. 第二章 Java 多线程编程一、 线程的概念 在多线程程序设计中,线程是程序执行过程中一个子运行序列。 进程与程序的关系 程序是静态的代码,一个进程是某个程序的一次执行过程 线程则是一个比进程更细微的程序执行序列,是进程的某个子序列 线程由程序负责管理,而进程由操作系统调度。
  • 17. 线程依附于进程的上下文环境中,随进程或父线程执行后启动。 多个线程使用相同的地址空间,因此线程之间的通信非常方便。而进程之间使用不同的地址空间,可以单独执行。 多线程的核心在于多个代码块并发执行,本质特点在于各代码块之间的代码是乱序执行的。我们的程序是否需要多线程,就是要看这是否也是它的内在特点。
  • 18. 线程的创建第一种方法 以多线程方式启动执行的类必须继承java.lang.Thread类,实现该类的Run()方法,然后控制线程的执行; 第二种方法 如果只要一段代码在单独线程中运行 则可以继承java.lang.Runnable接口,并将该段代码放在该接口Run()方法中,然后通过构造Thread类对象实现线程的建立和运行控制。
  • 19. 一、Thread类创建多线程应用程序使用Thread类建造多线程程序的方法 将自定义的应用程序类继承Thread类,并覆盖其run()方法,当线程开始启动时会调用这个方法。 通过覆盖run()方法,就可以使线程在后台完成一些有用的任务。 然后,在自定义类中的main()方法,声明一个Thread类型的对象使之指向自定义应用程序类的实例。 如: Thread t1=new MyThread(1); 再调用start()方法启动线程,该方法会调用前面定义的run()方法,并使之脱离main()方法的主线程,在操作系统中申请新的线程运行。 如: t1.start();//启动线程
  • 20. 二、使用Runnable接口创建多线程应用程序由于Java只支持单重继承,使用扩展Thread类的方式实现多线程,就会导致应用程序不能继承其他的类,在构造复杂程序时很不方便。 使程序能够多线程执行的更好的方法是实现java.lang.Runnable接口。 Runnable接口唯一的定义了一个run()方法,实现该接口必须实现这个方法。 应用程序类实现了这个接口则该类既可以以多线程的方式执行,又可以继承其他的类。
  • 21. 步骤 创建这类多线程程序的方法是定义类时声明实现Runnable接口并写好线程体run()方法, 然后在main()方法中声明并创建Runnable类型的对象,以该对象为构造参数,声明并构造Thread对象, 当调用了线程对象的start()方法时,新创建的线程就会调用run()方法。 run()方法结束时,线程便停止。 注意,同一个Runnable对象可以被传递给多个线程,所以几个并发的线程可以使用相同的代码,并操作相同的数据。 使用Runnable接口实现多线程程序还有一个好处就是使用Runnable实例作构造参数创建多个Thread实例比创建多个经过扩展的Thread实例开销要小。
  • 22. 线程的生存周期每个线程从生成实例获得资源到运行结束、释放空间要经历三种基本的状态。 线程实例在内存中创建后线程处于就绪状态,然后在父线程中通过调用Thread类的start()方法来启动线程体run()方法。 线程进入运行状态,当线程因需要的某个资源被其他线程占用等原因而进入阻塞状态。 线程体执行完毕或被父线程终止时,线程结束。Java提供了很多方法可以对线程的生存周期进行各种控制和调度,以灵活实现程序的功能。
  • 23. 线程的状态1. 新状态:线程已被创建但尚未执行(start() 尚未被调用)。 2. 可执行状态:线程可以执行,虽然不一定正在执行。CPU 时间随时可能被分配给该线程,从而使得它执行。 3. 死亡状态:正常情况下 run() 返回使得线程死亡。调用 stop()或 destroy() 亦有同样效果,但是不被推荐,前者会产生异常,后者是强制终止,不会释放锁。 4. 阻塞状态:线程不会被分配 CPU 时间,无法执行。
  • 24. 线程的控制方法1.线程休眠sleep() 在线程运行时,可以主动调用静态方法Thread.sleep()方法让线程休眠一段时间。 此时线程让出CPU,进入就绪队列。让低优先级的线程运行,以提高程序的整体效率。 运用此方法还可以实现延时效果。 2.打断线程休眠interrupt() 在主线程中通过调用interrupt()方法可以使进入休眠状态的子线程提前唤醒。
  • 25. 3.停止/销毁线程stop()/destroy() 在主线程中使用静态方法stop()可以结束子线程。调用时要求主线程拥有被控制线程的对象名(引用) 4.挂起/恢复线程suspend()/resume() 在主线程中调用Thread.suspend()方法和Thread.resume()方法可以暂停和恢复线程的运行。 5.主动让出CPU yield() Thread.yield()。线程调用该方法后,即进入就绪队列,等待下一次竞争CPU重新运行。 6.等待别的线程结束join() 有时一个运行到某个时候,必须等待另外一个线程结束后才可以继续运行,可以调用join()方法。
  • 26. 线程的同步由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题。Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问。 如果在线程体中对一些访问共享数据或者不能打断顺序执行完整性的代码进行同步互斥控制,就可以使各个线程以固定秩序访问共享数据,从而避免这些问题。 这种考虑了多线程竞争资源访问冲突的代码或程序称为线程安全的。
  • 27. Java中线程同步有两种机制:方法级同步和代码级同步。 方法级同步 定义:指共享对象的方法在定义时就声明为同步的,即需要事先申请到同步锁才能执行。 作用:防止两个线程在同一时刻对同一对象执行方法。 原理: 当调用某共享对象的同步方法时,线程取得对象锁(或称为对象监视器), 当其他线程试图执行该对象的同步方法时,将会发现对象被锁住了,因而进入挂起状态,直到前面的线程结束同步方法,释放对象锁。
  • 28. 代码级同步 代码级同步有两种形式1)在共享对象的方法中声明申请同步锁 (1)定义共享对象时,还可以只对其成员方法中的某段代码进行同步控制。这样的同步代码段在被多个线程调用时的执行机制是和方法级同步类似的。 声明共享对象方法的代码块同步的语法如下: synchronized (Object o) { //被同步的代码块 }
  • 29. 2)在线程体的调用代码中标明申请同步锁如果共享对象的方法没有定义为方法级同步或代码块同步,而且多线程共享访问的对象方法定义不能修改,则可以对调用该对象方法的调用代码块进行同步修饰。 其语法格式就是代码块同步的格式,需要在synchronize关键字之后指定同步共享对象的对象名。 例如:把p.show()语句 改成: synchronized(p){ //在同步对象方法的调用语句前加代码块同步控制, //p为同步访问的对象的对象名 p.show(); }
  • 30. 线程的阻塞线程堵塞状态是线程的四种状态中最有趣也是非常复杂的状态。线程被堵塞可能是由下述五方面的原因造成的: 1) 调用sleep(毫秒数),使线程进入“睡眠”状态。在规定的时间内,这个线程是不会运行的。 (2) 用suspend()暂停了线程的执行。除非线程收到resume()消息,否则不会返回“可运行”状态。 (3) 用wait()暂停了线程的执行。除非线程收到nofify()或者notifyAll()消息,否则不会变成“可运行”(是的,这看起来同原因2非常相象,但有一个明显的区别是我们马上要揭示的)。 (4) 线程正在等候一些IO(输入输出)操作完成。 (5) 线程试图调用另一个对象的“同步”方法,但那个对象处于锁定状态,暂时无法使用。
  • 31. 第三章 Internet 寻址一 IP地址与域名系统 每个IP地址都包含两部分,即网络号和主机号。     网络号:用于识别主机所在的网络;     主机号:用于识别该网络中的主机。 IP地址被分成了A、B、C、D和E五类。其中A类、B类、和C类这三类地址用于TCP/IP节点,其它两类D类和E类被用于特殊用途
  • 32. 局域网IP地址A类、B类和C类IP地址有一部分保留下来,供局域网使用。 IP地址类别 供局域网使用的IP地址范围 网络数 A类 10.0.0.0~10.255.255.255 1 B类 172.16.0.0~172.31.255.255 16 C类 192.168.0.0~192.168.255.255 255保留的IP地址段不能在因特网上使用,故不会与其他网络中的地址发生冲突。
  • 33. 域名域名简单地说就是Internet上主机的名字,它采用层次结构,每一层构成一个子域名,子域名之间用圆点隔开,自左至右分别为:计算机名、网络名、机构名、最高域名。Internet域名系统是一个树型结构。 随着Internetde的不断发展壮大,国际域名管理机构又增加了国家与地区代码这一新根域名。
  • 34. 二 TCP与UDP协议所有使用或实现某种Internet服务的程序都必须遵从一个或多个网络协议。这种协议很多,而IP(Internet Protocol,Internet协议)、TCP(Transport Control Protocol,传输控制协议)、UDP(User Datagram Protocol,用户数据报协议)是最为根本的三种协议,是所有其它协议的基础。 IP是最底层的协议,它定义了数据按照数据报(Datagram)传输的格式和规则。在Java中不存在操作该协议的直接方法。
  • 35. TCP协议TCP建立在IP之上(常见的缩写词TCP/IP的由来)。TCP定义了网络上程序到程序的数据传输格式和规则,提供了IP数据包的传输确认、丢失数据包的重新请求、将收到的数据包按照它们的发送次序重新装配的机制,是一种面向连接的保证可靠传输的协议。 发送方和接收方的成对的两个socket之间必须建立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送或接收操作。 例如:远程连接(Telnet)和文件传输(FTP)都需要不定长度的数据被可靠地传输。
  • 36. UDP协议UDP全称——User Datagram Protocol中的Datagram是一种自带寻址信息的、独立地从数据源走到终点的数据包。UDP不保证数据的传输,也不提供重新排列次序或重新请求功能。 与TCP的有连接相比,UDP 协议是一种无连接协议,两台计算机之间的传输类似于传递邮件:消息从一台计算机发送到另一台计算机,但是两者之间没有明确的连接。另外,单次传输的最大数据量取决于具体的网络。
  • 37. Java网络编程一般可以理解为: 基于URL的高层次Java网络编程(本质上是TCP) 基于Socket(套接字)的低层次Java网络编程 。(TCP和UDP 广播方式UDP)
  • 38. 三 用Java进行Internet寻址(一)Java网络类和接口 Java中有关网络方面的功能都定义在java.net包中。Java所提供的网络功能可大致分为三大类: URL和URLConnection 这是三大类功能中最高级的一种。利用URL的表示和建立,Java程序可以直接读入网络上所放的数据,或把自己的数据传送到网络的另一端。
  • 39. (二) InetAddress类 java.net.InetAddress类是Java的IP地址封装类,它不需要用户了解如何实现地址的细节。 定义:  public final class InetAddress extends object implements Serializable 该类用hostName(String)和address(int)拜师网络地址,即主机名和IP地址。这两个字段是不公开的,不能直接访问。
  • 40. 创建InetAddress对象的方法InetAddress类没有构造方法,要创建该类的实例对象,可以通过该类的静态方法获得该对象。 public static InetAddress getLocalHost() 方法getLocalHost()获得本地机的InetAddress对象,当查找不到本地机器的地址时,触发一个UnknownHostException异常。
  • 41. try { InetAddress address=InetAddress.getLocalHost( ); …; // 其他处理代 } catch(UnknownException e) { …; // 异常处理代码 }
  • 42. public static InetAddress getByName (String host) 该方法获得由host指定的InetAddress对象,host是计算机的域名(也就是名字),其作用跟IP地址一样,只不过域名标识计算机比IP标识计算机更易于记忆。如果找不到主机会触发UnknownHostException异常。 public static InetAddress[] getAllByName(String host) 在Internet上不允许多台计算机共用一个名字(或者说是IP地址),但是在Web中,可以用相同的名字代表一组计算机。通过方法InetAddress[]getAllByName(String host)可以获得具有相同名字的一组InetAddress对象。出错了同样会抛出UnknownException异常。
  • 43. getAddress()InteAddress类有一个getAddress()方法,该方法将IP地址以网络字节顺序作为字节数组返回。当前IP只有4个字节,但是当实行IPV6时,就有16个字节了。如果需要知道数组的长度,可以用数组的length字段。使用getAddress( )方法的一般性用法如下所示: InetAddress inetaddress=InetAddress.getLocalHost( ); byte[ ] address=inetaddress.getAddress( ); Java没有无符号字节的基本数据类型,因此如果要对返回的字节操作时,必须要将int做适当的调整
  • 44. getHostName()getHostName()方法返回一个字符串,就是主机名字。如果被查询的机器没有主机名,或者如果使用了Applet,但是它的安全性却禁止查询主机名,则该方法就返回一个具有点分形式的数字IP地址。一般的使用方法如下所示: InetAddress inetadd = InetAddress.getLocalHost( ); String localname= inetadd.getHostName( ); 尽量不要使用getHostName方法得到主机名,因为不同的平台的主机名格式是不同的,最好使用 getAddress得到格式相同的IP地址
  • 45. toString()toString()   toSring()方法得到主机名和IP地址的字符串,其具体形式如下:主机名/点分地址     如果一个InetAddress对象没有主机名,则点分格式的IP地址将会被代替。
  • 46. 第四章 用URL检索数据一、URL类 URL(Uniform Resource Locator)是WWW资源统一资源定位器的简写。它规范了WWW资源网络定位地址的表示方法。WWW资源包括Web页、文本文件、图形文件、声频片段等等。 URL的基本表示格式是: protocol://hostname:/resourcename#anchor Protocol: 使用的协议,它可以是http、ftp、news、telnet等。 hostname: 主机名 指定域名服务器(DNS)能访问到的WWW服务的计算机。 port: 端口号,是可选的,表示所连的端口号,如缺省,将连接到协议缺省的端口,正如上面socket通讯所介绍的。 resourcename: 资源名,是主机上能访问到的目录或文件。 anchor :标记,也是可选的,它指定文件中的有特定标记的位置。
  • 47. 构造URL类对象java.net中实现了类URL。 (1) public URL (String spec); URL urlBase=new URL("http://www. 263.net/") (2) public URL(URL context, String spec); URL net263=new URL ("http://www.263.net/"); URL index263=new URL(net263, "index.html")
  • 48. (3) public URL(String protocol, String host, String file); new URL("http", "www.gamelan.com", "/pages/Gamelan.net. html"); (4) public URL(String protocol, String host, int port, String file);   URL gamelan=new URL("http", "www.game.com", 80, "Pages/Gamelan.html");
  • 49. 解析一个URLpublic String getProtocol() 获取该URL的协议名。 public String getHost() 获取该URL的主机名。 public int getPort() 获取该URL的端口号,如果没有设置端口,返回-1。 public String getFile() 获取该URL的文件名。 public String getRef() 获取该URL在文件中的相对位置。 public String getQuery() 获取该URL的查询信息。 public String getPath() 获取该URL的路径 public String getAuthority() 获取该URL的权限信息 public String getUserInfo() 获得使用者的信息 public String getRef() 获得该URL的标记
  • 50. 利用URL读取WWW网络资源得到一个URL对象后,就可以通过它读取指定的WWW资源。可使用URL的方法openStream()与指定的URL建立连接并返回InputStream类的对象以从这一连接中读取数据
  • 51. 读取html文件public class URLRead { public static void main(String[] args) throws Exception { URL web = new URL("http://www.lytu.edu.cn"); BufferedReader in = new BufferedReader(new InputStreamReader(web.openStream())); String inputLine; while ((inputLine = in.readLine()) != null)System.out.println(inputLine); in.close();
  • 52. 从网上获取和显示图片从网络上其他结点获取图象,关键是创建对应于网络上其他结点的Image类型的对象, Java提供了如下方法可以创建对应于其他结点的图象:getImage(new URL(字符串))
  • 53. 其使用格式可有两种: 用“new URL(url)”生成 URL 对象, 并直接作为getImage的参数 String url = "结点URL"; Image image; try {  image = getImage(new URL(url)); }  catch(Exception e){  System.out.println("Can´t open the URL "); }  
  • 54. 先用“new URL(url)”生成一个 URL对象,再传给getImage。URL imgur=null; Image image; try {  imgur=new URL("结点URL "); } catch (MalformedURLException e) {  System.out.println("Can´t open the URL "); } image=getImage(imgur);
  • 55. 文件的下载用HTTP协议下载文件的方法。 用openStream方法作为输入流打开网络文件。再建立一个文件输出流在本地磁盘保存文件,就实现了任意文件的下载。
  • 56. try { URL url = new URL(urlString); File file = new File(url.getFile()); String filename = file.getName(); //为了得到不含路径的文件名 in = new BufferedInputStream(url.openStream()); out = new BufferedOutputStream( new FileOutputStream("c:\\temp\\" + url.getFile()));
  • 57. URLConnection类实现同网络资源的双向通信,用URLConnection类来解决这一问题的。 类URLConnection定义在包java.net里,它表示Java程序和URL在网络上的通信连接。当与一个URL建立连接时,首先要在一个URL对象上通过方法openConnection()生成对应的URLConnection对象。URLConnection是以HTTP协议为中心的类,其中很多方法只有在处理HTTP的URL时才起作用。
  • 58. 利用URLConnection类对象向URL对象发送服务请求进行通信时,具体的实现步骤。 1、创建URL对象 2、调用URL对象的OpenConnection()方法打开一个到URL的连接,返回相应的URLConnection类对象。 3、从URLConnection对象获取其连接的输出流,该输出流就是连接到服务器上CGI的标准输入流,通过这个输出流向服务器发送数据。 4、向这个输出流写入数据,写入结束后关闭输出流。 5、从URLConnection对象获取其连接的输入流,该输入流就是连接到服务器上CGI的标准输出流,通过这个输出流读取服务器发送的数据,最后关闭输入流。
  • 59. 1.建立连接 URL url=new URL(“http://www.yahoo.com/”); URLConnection con=url.openConnection(); 2. 向服务器端送数据 PrintStream ps= new PrintStream(con.getOutputStream()); ps.println(string_data); 3. 从服务器读数据 DataInputStream dis= new DataInputStream(con.getInputStream()); dis.readLine();
  • 60. 第五章 套接字(Socket)编程网络通信的核心是协议。协议是指进程之间交换信息已完成任务所使用的一系列规则和规范。它主要包含两个方面的定义: 1 定义了进程之间交换消息所必需遵循的顺序。 2 定义进程之间所交换的消息的格式。
  • 61. C/S结构的主要技术特征(1) 按功能划分 C/S结构按功能来划分,服务器是服务的提供者,客户机是服务的消费者,服务器又按功能分为DB服务器、文件服务器、事务服务器、Web服务器等等。   (2) 共享资源 一个服务器在同一时刻可为多个客户机提供服务,并且服务器具有并发控制能力,协调多个用户对于共享资源的访问。   (3) 不对称协议 客户机和服务器之间是一种主从关系:客户机主动与服务器对话,请求服务;服务器被动地等待客户机的请求,提供服务。   (4) 定位透明性 用户不必知道服务器的位置,就可以请求服务器的服务。   (5) 基于消息的交换 客户机和服务器通过消息机制互相协作。   (6) 良好的可扩展性 C/S系统可以水平地或垂直地扩展,即增加或删除客户机对系统性能影响很小,而且可方便地移植到大型服务器或多服务器系统上。
  • 62. C/S结构的演变C/S结构经历了从两层、三层到多层模型的演变过程。这种演变实质上就是用户界面、应用逻辑、事务逻辑和数据管理四方面功能在客户机和服务器之间的分配策略的变化。
  • 63. 客户机/服务器模式客户机/服务器模式在操作过程中采取的是主动请求方式 服务器方执行过程: 1。打开一通信通道并告知本地主机,它愿意在某一公认地址端口上(周知口,如http为80)接受客户请求。 2。等待客户请求到达该端口。 3。接收到重复服务请求,处理该请求并发送应答信号。接收并发服务请求,要激活一新进程来处理这个客户请求。新进程处理此客户请求,并不需要对其他请求做出应答。服务完成后,关闭此新进程与客户的通信链路,并终止。 4。返回第二步,等待另外的客户请求 5。关闭服务器。
  • 64. 客户方: 1。打开一通信通道,并连接到服务器所在主机的特定端口。 2。向服务器发出服务请求报文,等待并接收应答;继续提出请求。 3。请求结束后关闭通信通道并终止。
  • 65. socketsocket是指在一个特定编程模型下,进程间通信链路的端点。 当进程通过网络进行通信时,Java技术使用它的流模型。一个socket包括两个流:一个输入流和一个输出流。如果一个进程要通过网络向另一个进程发送数据,只需简单地写入与socket相关联的输出流。一个进程通过从与socket相关联的输入流读来读取另一个进程所写的数据。 建立网络连接之后,使用与socket相关联的流和使用其他流是非常相似的。
  • 66. Socket类1、 InetAddress类 InetAddress类在套接字编程中扮演了一个重要角色。参数传递给流套接字类。InetAddress描述了32位或64位IP地址,要完成这个功能,InetAddress类主要依靠两个支持类Inet4Address 和 Inet6Address,这三个类是继承关系,InetAddrress是父类,Inet4Address 和 Inet6Address是子类。不能直接创建InetAddress对象 。
  • 67. Socket类的构造函数1) Socket (String address, int port) 产生java.net.UnknownHostException、java.io.IOException、java.lang.SecurityException异常--建立连接到特定主机和端口的套接字。 try { Socket MySocket= new Socket(www.lywww.com,80); } catch(UnknownHostException) { …… } catch(IOException) { …… }
  • 68. Socket (InetAddress address, int port)产生 java.io.IOException异常 ,不抛出UnknownHostException异常。 try { InetAddress Google=InetAddress.getByName(“www.goole.com”); Socket MySocket= new Socket(Goole,80); } catch(UnknownHostException) { …… } catch(IOException) { …… }
  • 69. 从 Socket中获取信息的方法(1) InetAddress getInetAddress() 返回连接到套接字的远程主机的地址 try { Socket theSocket= new Socket(“java.sun.com”,80); InetAddress host=theSocket.getInetAddress(); System.out.println(“connected to remote host:”+host); } catch(UnknownHostException e) {System.err.println(e);} catch(IOException e) {System.err.println(e);}
  • 70. 创建TCP客户try{// 把套接字连接到某台主机和端口 Socket socket = new Socket ( somehost, someport );  // 连接到被缓冲地读取程序 BufferedReader reader = new BufferedReader ( new InputStreamReader ( socket.getInputStream() ) ); // 连接到打印流 PrintStream pstream = new PrintStream( socket.getOutputStream() );} catch (Exception e) {System.err.println ("Error - " + e);}
  • 71. 利用Socket编程的一般步骤如下: 1、分别是为服务器和客户端创建Socket对象,建立Socket连接 2、打开连接到Socket的输入输出流。Socket对象包含两个流:一是输入流,表示流入的数据流,其作用是接收数据;一是输出流,表示流出的数据流,其作用是向外发送数据,其流操作与I/O操作相同。 3、按照一定的协议对Socket进行读写操作。 4、读写操作结束后,关闭Socket。
  • 72. Socket客户端应用程序编写的基本步骤。 1、创建指定服务器上指定端口号的Socket对象。 2、创建与Socket对象绑定的输入输出流,并建立相应的数据输入输出流。 3、通过数据输入输出流与服务器端进行数据读写,完成双向通信。 4、通过调用close()方法关闭与服务器的连接,并关闭各个流对象,结束通信。
  • 73. ServerSocket类在客户/服务器通信模式中,服务器端需要创建监听特定端口的ServerSocket,ServerSocket负责接收客户连接请求。 服务器套接字是一种特定类型的套接字,它用于提供TCP服务。客户端套接字绑定到本地计算机的任何空的端口,并且连接到特定服务器程序的端口和主机。服务器套接字与它的差别是它们绑定到本地计算机的某个特定的端口,这样远程客户端才能定位某种服务。客户端套接字连接只能连接到一台计算机,然而服务器套接字能够满足多个客户端的请求。
  • 74. 构造ServerSocketServerSocket的构造方法有以下几种形式: 1、ServerSocket(int port) 把服务器套接字绑定到特定的端口号 如果运行时无法绑定到80端口,以上代码会抛出IOException,更确切地说,是抛出BindException。 如果把参数port设为0,表示由操作系统来为服务器分配一个任意可用的端口。 try{ // 绑定到80端口,提供TCP服务(类似与HTTP) ServerSocket myServer = new ServerSocket ( 80 ); }catch (IOException ioe){ System.err.println ("I/O error - " + ioe); }
  • 75. 创建TCP服务器程序接受客户端套接字,以及I/O流怎样连接到客户端的关键代码: // 执行阻塞的读取操作,读取一个套接字 Socket nextSocket = someServerSocket.accept(); // 连接到流的过滤器读取和写入程序 BufferedReader reader = new BufferedReader (new InputStreamReader(nextSocket.getInputStream() ) ); PrintWriter writer = new PrintWriter( new OutputStreamWriter(nextSocket.getOutputStream() ) );
  • 76. Socket服务器端应用程序编写的基本步骤 1、创建一个等待连接的ServerSocket对象,如sersocket。 2、调用sesocket对象的accept()方法监听接收客户端的连接请求;当监听到一个客户的连接请求时,连接成功,并返回一个用于通信的Socket对象。 3、创建与Socket对象绑定的输入输出流,并建立相应的数据输入输出流。 4、通过数据输入输出流与客户端进行数据读写,完成双向通信。 5、当客户断开连接时,关闭各个流对象,结束通信。
  • 77. DatagramSocket类DatagramSocket类在客户端创建自寻址套接字与服务器端进行通信连接,并发送和接受自寻址套接字。 客户端自寻址套接字一般选择DatagramSocket()函数,而服务器端则是DatagramSocket(int port)函数,一旦程序创建了DatagramSocket对象,程序分别调用send(DatagramPacket dgp)和 receive(DatagramPacket dgp)来发送和接收自寻址数据包 未能创建自寻址套接字或没能绑定自寻址套接字到本地端口,这两个函数都将抛出一个SocketException对象,
  • 78. DatagramPacket类用来表示一个数据报包,是进行数据报通信的基本单位。 DatagramPacket(byte[] buf, int length) 将数据包中Length长的数据装进Buf数组,一般用来接收客户端发送的数据。 在接收数据前,应该采用上面的构造方法生成一个DatagramPacket对象,给出接收数据的缓冲区及其长度。然后调用DatagramSocket 的方法receive()等待数据报的到来,receive()将一直等待,直到收到一个数据报为止。 DatagramPacket packet=new DatagramPacket(buf, 256); Socket.receive (packet);
  • 79. 基于UDP协议的Socket编程的具体开发步骤:服务器端程序的具体开发步骤: 1、建立一个DatagramSocket对象。 2、进入收发数据报包的循环,直到客户端数据传送完毕。循环过程如下: (1)创建一个用于接收数据的DatagramPacket对象。 (2)利用 DatagramSocket对象的receive()方法等待客户端的数据报包。 (3)处理客户端数据报包内容。 (4)创建一个用于发送响应信息数据的DatagramPacket对象。 (5)利用DatagramSocket对象的方法 send()向客户端发送包含响应信息的数据报包。 3、客户端数据传送完毕,释放Socket。
  • 80. 客户端程序的具体开发步骤: 1、建立一个DatagramSocket对象。 2、进入收发数据报包的循环,直到数据传送完毕。循环过程如下: (1)创建一个用于接收数据的DatagramPacket对象,并将要发送的数据封装到该数据报包。 (2)利用 DatagramSocket对象的send()方法向服务器端的发送数据报包。 (3)创建一个用于接收响应信息数据的DatagramPacket对象。 (4)利用 DatagramSocket对象的receive()方法等待接收服务器端包含响应信息的数据报包。 (5)处理服务器端数据报包内容。 3、数据传送完毕,释放Socket。
  • 81. 多点传送和MulticastSocket类 网络API通过MulticastSocket类和MulticastSocket,以及一些辅助类(比如NetworkInterface)支持多点传送,当一个客户程序要加入多点传送组时,就创建一个MulticastSocket对象。 MulticastSocket(int port)构造函数允许应用程序指定端口(通过port参数)接收自寻址包,端口必须与服务程序的端口号相匹配,要加入多点传送组,客户程序调用两个joinGroup()方法中的一个,同样要离开传送组,也要调用两个leaveGroup()方法中的一个。
  • 82. 第六章 Java Mail 编程JavaMail API简介 Java Mail体系分为三层: 抽象层:定义用于邮件处理功能的抽象类、既然口和方法 Internet邮件实现层:实现为收发信息提供与协议无关的访问,基本上是如何发送和接收独立于提供程序/协议的消息。 协议实现层:实现对特定协议的支持,如:SMTP、POP、IMAP和NNTP等。
  • 83. Java Mail相关类介绍javax.mail.Session类 Session类代表JavaMail 中的一个邮件session. 每一个基于 JavaMail的应用程序至少有一个session,可以有任意多的session。 Session对象需要知道用来处理邮件的SMTP 服务器。用来创建邮件对象、实现邮件对象中数据的封装并可指定邮件服务器认证的客户端属性。 Properties类 JavaMail需要Properties来创建一个session对象。它将寻找字符串"mail.smtp.host",属性值就是发送邮件的主机.
  • 84. MimeMessage类Message对象将存储我们实际发送的电子邮件信息,Message对象被作为一个MimeMessage对象来创建并且需要知道应当选择哪一个JavaMail session。 MimeMessage有一个内部类Recipient类,即javax.mail.internet. MimeMessage.Recipient,表示邮件消息的接收者。这个类有一个属性to表示接收者,即接收邮件的邮箱地址 InternetAddress类 一旦创建了 Session 和 Message,并将内容填入消息后,就可以用Address确定信件地址了。和 Message 一样,Address 也是个抽象类。
  • 85. Transport类邮件既可以被发送也可以被收。JavaMail使用了两个不同的类来完成这两个功能:Transport 和Store. Transport 是用来发送信息的,而Store用来收信。 Store类 Store类实现特定邮件协议上的读、写、监视、查找等操作。通过Javax.mail.Store类可以访问Javax.mail.Folder类。 Folder类 Folder类用于分级组织邮件,并提供照Javax.mail.Message格式访问email的能力。
  • 86. SMTP 简单邮件传输协议(SMTP)是用于传送电子邮件的机制。在JavaMail API环境中,基于JavaMail的程序将与Internet服务提供商(ISP)的SMTP服务器通信。该SMTP服务器将会把消息转发给用作接收消息的SMTP服务器,最后用户可通过POP或IMAP协议获取该消息。由于支持身份验证,所以不需要SMTP服务器是一种开放的转发器,但需要确保SMTP服务器配置正确。JavaMail API中没有集成用于处理诸如配置服务器以转发消息或添加/删除电子邮件帐户这一类任务的功能。 邮件协议介绍
  • 87. POPPOP的含义是邮局协议,当前的版本为3,也称作POP3,该协议是在RFC 1939中定义的。POP是Internet上的大多数人用来接收邮件的机制。它为每个用户的每个邮箱定义支持,这是它所做的全部工作。 (1)POP适用于C/S结构的脱机模型的电子邮件协议,目前已发展到第三版,称POP3。脱机模型即不能在线操作,不像IMAP4(netscape支持IMAP4) (2)当客户机与服务器连接并查询新电子邮件时,被该客户机指定的所有将被下载的邮件都将被程序下载到客户机,下载后,电子邮件客户机就可以删除或修改任意邮件,而无需与电子邮件服务器进一步交互。 (3)POP3客户向POP3服务器发送命令并等待响应,POP3命令采用命令行形式,用ASCII码表示。服务器响应是由一个单独的命令行组成,或多个命令行组成,响应第一行以ASCII文本+OK或-ERR指出相应的操作状态是成功还是失败。
  • 88. (本页无文本内容)