本书结合大量的典型实例,详细介绍了用Java来编写网络应用程序的技术。本书的范例都基于最新的JDK 1.5版本,书中内容包括:Java网络编程的基础知识、套接字编程、非阻塞通信、创建HTTP服务器与客户程序、数据报通信、对象的序列化与反序列化、Java反射机制、RMI框架、JDBC API、JavaMail API、MVC设计模式、安全网络通信、CORBA和Web服务。另外,本书还涵盖了Sun公司的SCJD(Sun Certified Java Developer)认证的考试要点。\r\n书中范例源文件请到http://www.fecit.com.cn的“下载专区”下载。\r\n阅读本书,读者不仅可以掌握网络编程的实用技术,还可以进一步提高按照面向对象的思想来设计和编写Java软件的能力。本书适用于所有Java编程人员,包括Java初学者及资深Java开发人员。本书还可作为高校的Java教材,以及企业的Java培训教材,也可作为Sun公司SCJD认证的辅导教材。\r\n
第1章 Java网络编程入门 1\r\n1.1 进程之间的通信 1\r\n1.2 计算机网络的概念 3\r\n1.3 OSI参考模型 5\r\n1.4 TCP/IP参考模型和\r\nTCP/IP协议 8\r\n1.4.1 IP协议 11\r\n1.4.2 TCP协议及端口 14\r\n1.4.3 RFC简介 15\r\n1.4.4 客户/服务器通信模式 16\r\n1.5 用Java编写客户/服务器\r\n程序 17\r\n1.5.1 创建EchoServer 18\r\n1.5.2 创建EchoClient 20\r\n1.6 小结 22\r\n1.7 练习题 23\r\n第2章 Socket用法详解 25\r\n2.1 构造Socket 25\r\n2.1.1 设定等待建立连接的\r\n超时时间 26\r\n2.1.2 设定服务器的地址 26\r\n2.1.3 设定客户端的地址 27\r\n2.1.4 客户连接服务器时\r\n可能抛出的异常 27\r\n2.2 获取Socket的信息 30\r\n2.3 关闭Socket 32\r\n2.4 半关闭Socket 33\r\n2.5 设置Socket的选项 38\r\n2.5.1 TCP_NODELAY选项 38\r\n2.5.2 SO_RESUSEADDR选项 38\r\n2.5.3 SO_TIMEOUT选项 39\r\n2.5.4 SO_LINGER选项 42\r\n2.5.5 SO_RCVBUF选项 44\r\n2.5.6 SO_SNDBUF选项 45\r\n2.5.7 SO_KEEPALIVE选项 45\r\n2.5.8 OOBINLINE选项 45\r\n2.5.9 服务类型选项 45\r\n\r\n\r\n\r\n2.5.10 设定连接时间、延迟和\r\n带宽的相对重要性 46\r\n2.6 发送邮件的SMTP客户程序 47\r\n2.7 小结 51\r\n2.8 练习题 52\r\n第3章 ServerSocket用法详解 55\r\n3.1 构造ServerSocket 55\r\n3.1.1 绑定端口 55\r\n3.1.2 设定客户连接请求\r\n队列的长度 56\r\n3.1.3 设定绑定的IP地址 58\r\n3.1.4 默认构造方法的作用 58\r\n3.2 接收和关闭与客户的连接 59\r\n3.3 关闭ServerSocket 60\r\n3.4 获取ServerSocket的信息 60\r\n3.5 ServerSocket选项 62\r\n3.5.1 SO_TIMEOUT选项 62\r\n3.5.2 SO_REUSEADDR选项 63\r\n3.5.3 SO_RCVBUF选项 64\r\n3.5.4 设定连接时间、延迟和\r\n带宽的相对重要性 64\r\n3.6 创建多线程的服务器 65\r\n3.6.1 为每个客户分配一个线程 65\r\n3.6.2 创建线程池 67\r\n3.6.3 使用JDK类库提供的\r\n线程池 72\r\n3.6.4 使用线程池的注意事项 74\r\n3.7 关闭服务器 76\r\n3.8 小结 80\r\n3.9 练习题 81\r\n第4章 非阻塞通信 83\r\n4.1 线程阻塞的概念 83\r\n4.1.1 线程阻塞的原因 83\r\n4.1.2 服务器程序用多线程\r\n处理阻塞通信的局限 84\r\n4.1.3 非阻塞通信的基本思想 85\r\n4.2 java.nio包中的主要类 87\r\n4.2.1 缓冲区Buffer 88\r\n4.2.2 字符编码Charset 90\r\n4.2.3 通道Channel 90\r\n4.2.4 SelectableChannel类 92\r\n4.2.5 ServerSocketChannel类 93\r\n4.2.6 SocketChannel类 93\r\n4.2.7 Selector类 96\r\n4.2.8 SelectionKey类 97\r\n4.3 服务器编程范例 100\r\n4.3.1 创建阻塞的EchoServer 100\r\n4.3.2 创建非阻塞的EchoServer 103\r\n4.3.3 在EchoServer中混合用\r\n阻塞模式与非阻塞模式 110\r\n4.4 客户端编程范例 114\r\n4.4.1 创建阻塞的EchoClient 114\r\n4.4.2 创建非阻塞的EchoClient 116\r\n4.4.3 创建非阻塞的PingClient 120\r\n4.5 小结 126\r\n4.6 练习题 127\r\n第5章 创建非阻塞的HTTP服务器 129\r\n5.1 HTTP协议简介 129\r\n5.1.1 HTTP请求格式 129\r\n5.1.2 HTTP响应格式 132\r\n5.1.3 测试HTTP请求 133\r\n5.2 创建非阻塞的HTTP\r\n服务器 137\r\n5.2.1 服务器主程序:\r\nHttpServer类 137\r\n5.2.2 具有自动增长的缓冲区的\r\n ChannelIO类 138\r\n5.2.3 负责处理各种事件的\r\nHandler接口 140\r\n5.2.4 负责处理接收连接就绪\r\n事件的AcceptHandler类 140\r\n5.2.5 负责接收HTTP请求和\r\n发送HTTP响应的\r\nRequestHandler类 141\r\n\r\n5.2.6 代表HTTP请求的\r\nRequest类 143\r\n5.2.7 代表HTTP响应的\r\nResponse类 145\r\n5.2.8 代表响应正文的Content\r\n接口及其实现类 147\r\n5.2.9 运行HTTP服务器 149\r\n5.3 小结 150\r\n5.4 练习题 151\r\n第6章 客户端协议处理框架 153\r\n6.1 客户端协议处理框架的\r\n主要类 153\r\n6.2 在客户程序中运用\r\n协议处理框架 154\r\n6.2.1 URL类的用法 154\r\n6.2.2 URLConnection类的用法 156\r\n6.3 实现协议处理框架 160\r\n6.3.1 创建EchoURLConnection\r\n类 161\r\n6.3.2 创建EchoURLStreamHandler\r\n及工厂类 162\r\n6.3.3 创建EchoContentHandler\r\n类及工厂类 163\r\n6.3.4 在EchoClient类中运用\r\nECHO协议处理框架 165\r\n6.4 小结 166\r\n6.5 练习题 167\r\n第7章 用Swing组件展示\r\nHTML文档 169\r\n7.1 在按钮等组件上展示\r\nHTML文档 170\r\n7.2 用JEditorPane组件\r\n创建简单的浏览器 171\r\n7.3 小结 179\r\n7.4 练习题 179\r\n\r\n\r\n第8章 基于UDP的\r\n数据报和套接字 181\r\n8.1 UDP协议简介 181\r\n8.2 DatagramPacket类 184\r\n8.2.1 选择数据报的大小 185\r\n8.2.2 读取和设置DatagramPacket\r\n的属性 185\r\n8.2.3 数据格式的转换 186\r\n8.2.4 重用DatagramPacket 187\r\n8.3 DatagramSocket类 189\r\n8.3.1 构造DatagramSocket 189\r\n8.3.2 接收和发送数据报 190\r\n8.3.3 管理连接 190\r\n8.3.4 关闭DatagramSocket 191\r\n8.3.5 DatagramSocket的选项 191\r\n8.3.6 IP服务类型选项 193\r\n8.4 DatagramChannel类 193\r\n8.4.1 创建DatagramChannel 194\r\n8.4.2 管理连接 194\r\n8.4.3 用send()方法发送数据报 194\r\n8.4.4 用receive()方法接\r\n收数据报 195\r\n8.4.5 用write()方法发送数据报 198\r\n8.4.6 用read()方法接收数据报 199\r\n8.5 组播Socket 202\r\n8.5.1 MulticastSocket类 205\r\n8.5.2 组播Socket的范例 207\r\n8.6 小结 209\r\n8.7 练习题 210\r\n第9章 对象的序列化与反序列化 213\r\n9.1 JDK类库中的序列化API 213\r\n9.2 实现Serializable接口 218\r\n9.2.1 序列化对象图 220\r\n9.2.2 控制序列化的行为 222\r\n9.2.3 readResolve()方法在\r\n单例类中的运用 229\r\n9.3 实现Externalizable接口 231\r\n\r\n9.4 可序列化类的不同\r\n版本的序列化兼容性 233\r\n9.5 小结 235\r\n9.6 练习题 236\r\n第10章 Java语言的反射机制 239\r\n10.1 Java Reflection API简介 239\r\n10.2 在远程方法调用中运用\r\n反射机制 244\r\n10.3 代理模式 248\r\n10.3.1 静态代理类 248\r\n10.3.2 动态代理类 250\r\n10.3.3 在远程方法调用中\r\n运用代理类 253\r\n10.4 小结 258\r\n10.5 练习题 259\r\n第11章 RMI框架 261\r\n11.1 RMI的基本原理 262\r\n11.2 创建第一个RMI应用 264\r\n11.2.1 创建远程接口 264\r\n11.2.2 创建远程类 265\r\n11.2.3 创建服务器程序 267\r\n11.2.4 创建客户程序 269\r\n11.2.5 运行RMI应用 270\r\n11.3 远程对象工厂设计模式 272\r\n11.4 远程方法中的参数与\r\n返回值传递 277\r\n11.5 回调客户端的远程对象 281\r\n11.6 远程对象的并发访问 286\r\n11.7 分布式垃圾收集 289\r\n11.8 远程对象的equals()、\r\nhashCode()和clone()方法 294\r\n11.9 使用安全管理器 294\r\n11.10 RMI应用的部署及类的\r\n动态加载 295\r\n11.11 远程激活 297\r\n11.12 小结 303\r\n11.13 练习题 304\r\n\r\n第12章 通过JDBC API\r\n访问数据库 305\r\n12.1 JDBC的实现原理 306\r\n12.2 安装和配置MySQL\r\n数据库 308\r\n12.3 JDBC API简介 310\r\n12.4 JDBC API的基本用法 314\r\n12.4.1 处理字符编码的转换 317\r\n12.4.2 把连接数据库的各种\r\n属性放在配置文件中 318\r\n12.4.3 管理Connection、Statement\r\n和ResultSet对象的\r\n生命周期 321\r\n12.4.4 执行SQL脚本文件 326\r\n12.4.5 处理SQLException 328\r\n12.4.6 输出JDBC日志 329\r\n12.4.7 获得新插入记录的\r\n主键值 329\r\n12.4.8 设置批量抓取属性 330\r\n12.4.9 检测驱动器使用的\r\nJDBC版本 330\r\n12.4.10 元数据 331\r\n12.5 可滚动及可更新的结果集 333\r\n12.6 行集 339\r\n12.7 调用存储过程 346\r\n12.8 处理Blob和Clob\r\n类型数据 347\r\n12.9 控制事务 351\r\n12.9.1 事务的概念 351\r\n12.9.2 声明事务边界的概念 353\r\n12.9.3 在mysql.exe程序中\r\n声明事务 354\r\n12.9.4 通过JDBC API\r\n声明事务边界 356\r\n12.9.5 保存点 357\r\n12.9.6 批量更新 358\r\n12.9.7 设置事务隔离级别 360\r\n12.10 数据库连接池 362\r\n12.10.1 创建连接池 363\r\n12.10.2 DataSource数据源 369\r\n12.11 小结 371\r\n12.12 练习题 372\r\n第13章 基于MVC和RMI的\r\n分布式应用 375\r\n13.1 MVC设计模式简介 375\r\n13.2 store应用简介 377\r\n13.3 创建视图 381\r\n13.4 创建控制器 389\r\n13.5 创建模型 390\r\n13.6 创建独立应用 394\r\n13.7 创建分布式应用 395\r\n13.8 小结 398\r\n13.9 练习题 398\r\n第14章 通过JavaMail API\r\n收发邮件 401\r\n14.1 E-mail协议简介 401\r\n14.1.1 SMTP简单邮件\r\n传输协议 401\r\n14.1.2 POP3邮局协议 402\r\n14.1.3 接收邮件的新\r\n协议IMAP 402\r\n14.1.4 MIME简介 403\r\n14.2 JavaMail API简介 403\r\n14.3 建立JavaMail应用程序的\r\n开发环境 405\r\n14.3.1 获得JavaMail API\r\n的类库 405\r\n14.3.2 安装和配置邮件服务器 406\r\n14.4 创建JavaMail\r\n应用程序 408\r\n14.5 身份验证 412\r\n14.6 URLName类 416\r\n14.7 创建和读取复杂\r\n电子邮件 418\r\n14.7.1 邮件地址 419\r\n14.7.2 邮件头部 420\r\n14.7.3 邮件标记 421\r\n14.7.4 邮件正文 422\r\n14.8 操纵邮件夹 427\r\n14.9 小结 432\r\n14.10 练习题 433\r\n第15章 安全网络通信 435\r\n15.1 SSL简介 435\r\n15.1.1 加密通信 436\r\n15.1.2 安全证书 436\r\n15.1.3 SSL握手 437\r\n15.1.4 创建自我签名的\r\n安全证书 438\r\n15.2 JSSE简介 439\r\n15.2.1 KeyStore、KeyManager\r\n与TrustManager类 442\r\n15.2.2 SSLContext类 443\r\n15.2.3 SSLServerSocketFactory\r\n类 444\r\n15.2.4 SSLSocketFactory类 444\r\n15.2.5 SSLSocket类 444\r\n15.2.6 SSLServerSocket类 447\r\n15.2.7 SSLEngine类 448\r\n15.3 创建基于SSL的安全\r\n服务器和安全客户 453\r\n15.4 小结 457\r\n15.5 练习题 457\r\n第16章 CORBA简介 459\r\n16.1 创建IDL接口 460\r\n16.2 创建IDL接口的实现类 460\r\n16.3 创建服务器程序 461\r\n16.4 创建客户程序 462\r\n16.5 运行CORBA程序 463\r\n16.6 小结 464\r\n16.7 练习题 465\r\n第17章 Web服务简介 467\r\n17.1 SOAP简介 467\r\n17.2 建立Apache AXIS环境 469\r\n17.3 在Tomcat上发布\r\nApache-AXIS Web应用 470\r\n17.4 创建SOAP服务 471\r\n17.4.1 创建提供SOAP\r\n服务的Java类 471\r\n17.4.2 创建SOAP服务的\r\n发布描述符文件 471\r\n17.5 管理SOAP服务 472\r\n17.5.1 发布SOAP服务 472\r\n17.5.2 删除SOAP服务 473\r\n17.6 创建和运行SOAP\r\n客户程序 473\r\n17.7 发布JWS服务 476\r\n17.8 小结 476\r\n17.9 练习题 477\r\n附录A 本书范例的运行方法 479\r\nA.1 本书所用软件的下载地址 479\r\nA.2 部分软件的安装 479\r\nA.2.1 安装JDK 480\r\nA.2.2 安装ANT 480\r\nA.2.3 安装Tomcat 481\r\nA.3 编译源程序 481\r\nA.4 运行客户/服务器程序 482\r\n\r\n
孙卫琴(LindaSun),畅销图书《精通Struts:基于MVC的Java Web设计与开发》的作者,IT女性作家。 1975年出生,1997年毕业于上海交通大学,随后一直从事基于Java的软件开发工作,还从事过J2EE培训和咨询。
自2002年首部作品问世以来,孙卫琴一直专注于开源技术图书创作。孙卫琴以她女性独特的视角和细腻的文风开辟了自己的写作天地。2004年是孙卫琴丰收的一年,也是Java开源技术图书市场充满亮点的一年,由孙卫琴撰写的《精通Struts: 基于MVC的Java Web设计与开发》、《Tomcat与Java Web开发技术详解》两本书是2004年国内原创图书市场的惊喜。截止到2005年5月,两本图书都已经达到6次印刷,以如此专业性强的图书而获得一致好评和空前的市场成功在今日的IT图书市场上实属惊人。
Java语言是第一个完全融入网络的语言,Java语言之所以适合编写网络应用程序,归功于它的以下优势:
(1)Java语言与生俱来就是平台无关的。Java程序能够运行在不同的平台上,运行在不同平台上的Java程序能够方便的进行网络通信。
(2)Java语言具有完善的安全机制,可以对程序进行权限检查。这对网络程序至关重要。
(3)JDK类库提供了丰富的网络类库(如套节字API、JavaMail API和JDBC API等),大大简化了网络程序的开发过程。
本书将展示如何利用Java网络类库来快速便捷的创建网络应用程序,致力于完成以下任务:
实现访问HTTP服务器的客户程序。
实现HTTP服务器。
实现多线程的服务器,以及非阻塞的服务器。
解析并展示HTML页面。
通过JDBC API访问数据库。
通过JavaMail API接收和发送电子邮件。
利用RMI框架实现分布式的软件系统。
进行安全的网络通信,对数据加密,验证身份,保证数据的完整性。
利用CORBA和Web服务实现分布式的软件系统。
本书的组织结构和主要内容
本书结合大量典性的实例,详细介绍了用Java来编写网络应用程序的技术。本书内容包括:Java网络编程的基础知识、 套接字编程、非阻塞通信、创建HTTP服务器与客户程序、数据报通信、对象的序列化与反序列化、Java反射机制、RMI框架、JDBC API、JavaMail API、MVC设计模式、安全网络通信、CORBA和Web服务。以下图P-1展示了本书各个章之间的顺序渐进关系。
阅读本书,读者不仅可以掌握网络编程的实用技术,还可以进一步提高按照面向对象的思想来设计和编写Java软件的能力。本书适用于所有Java编程人员,包括Java初学者及资深Java开发人员。本书还可作为高校的Java教材,以及企业Java培训教材,也可作为Sun公司的SCJD认证的辅导教材。
图P-1 本书各章之间的顺序渐进关系
从图P-1可以看出,套接字(Socket)是Java网络编程的基础,第2章和第3章分别详细介绍了Socket与ServerSocket的用法。本书第1章介绍了分层的网络体系结构,Java网络程序位于最上层——应用层,并且通过套节字访问底层网络,也可以说,套节字为应用层封装了底层网络传输数据的细节。Java网络程序都采用客户/服务器模式,客户端发出获得特定服务的请求,服务器接收请求,执行客户端所请求的操作,然后向客户端发回响应。在介绍服务器端编程时,探讨了服务器端实现并发响应多个客户请求的两种方式:一种方式是运用线程池(第3章),还有一种方式是采用非阻塞通信(第4章)。在介绍客户端编程时,介绍了JDK提供的一种通用的客户端协议处理框架(第6章)。
利用Java网络API,可以实现基于各种应用层协议(比如HTTP协议和FTP协议)的服务器程序与客户程序,本书侧重介绍了HTTP服务器(第5章)与HTTP客户程序(第7章)的实现方法,HTTP客户程序也称为浏览器。
本书还介绍了三种分布式的软件架构:RMI(第11章)、CORBA(第16章)和Web服务(第17章)。这些分布式架构主要解决的问题是,如何让客户端调用服务器端的远程对象的方法。RMI是JDK自带的,它要求客户端与服务器端都是Java程序,而CORBA和Web服务允许用任意编程语言编写的客户程序与服务器程序能够通信。本书重点介绍了RMI框架的用法。RMI框架在其实现中封装了用套接字通信的细节,此外,RMI框架的实现会把客户端的方法调用请求信息序列化为字节序列,把它发送给服务器端,然后在服务器端再通过反序列化把字节序列还原为方法调用请求。RMI框架还运用了动态代理机制,为客户端提供了远程对象的代理。客户端实际上直接访问的是远程对象的代理。为了帮助读者理解RMI框架的实现原理,本书第9章和第10章分别介绍了Java序列化以及反射机制。在介绍反射机制时,介绍了动态代理。
本书还介绍了两个常用的客户端的网络API:JDBC API(第12章)和JavaMail API(第14章),这两个API分别用于访问数据库服务器和邮件服务器,在它们的实现中都封装了用套接字与服务器通信的细节。Java客户程序可以通过JDBC API来访问各种数据服务器,还可以通过JavaMail API来访问各种邮件服务器。
本书第13章介绍了一个运用了MVC设计模式和RMI框架的综合应用。MVC设计模式把实际的软件应用分为视图、控制器和模型三个层次,每个层次相对独立。本书的范例把模型作为远程对象放置到RMI的服务器端,把视图和控制器放置到RMI的客户端。
本书第15章介绍了SSLSocket,它支持SSL(Server Socket Layer)协议和TLS(Transport Layer Security)协议。运用SSLSocket,可以实现安全的网络通信,网络上传输的是被加密的数据,并且通信两端还能验证对方的身份。
本书在介绍以上技术时,采用UML建模语言中的类框图以及时序图来展示对象模型以及类与类之间的协作关系。此外,本书还把一些常见的设计模式,如静态代理模式、动态代理模式和MVC设计模式等运用到实际例子中。阅读本书,读者不仅可以掌握Java网络编程的实用技术,还可以进一步提高按照面向对象的思想来设计和编写Java软件的能力。
这本书是否适合您
阅读本书,要求读者已经具备了Java编程的基础知识。对于还不熟悉Java语言的读者,建议先阅读作者的另一本书《Java面向对象编程》,本书是它的姊妹篇。《Java面向对象编程》自2006年7月份出版后,受到了广大IT读者的欢迎。本书围绕着网络编程,进一步介绍了Java语言的一些高级特性,如套接字编程、非阻塞通信、数据报通信、对象的序列化与反序列化、Java反射机制、RMI框架、JDBC API和JavaMail API等,这些特性是作为一个高级Java开发人员必须具备的。深入了解这些高级特性,有助于开发人员熟练的从头开发分布式的软件系统,或者轻松的学习和掌握现有的如Java EE等分布式的软件架构。
本书一方面由浅入深组织内容,迎合Java网络编程初学者的需求,一方面与实际项目紧密结合,介绍了线程池、非阻塞通信和动态代理等高级话题,可作为Java开发人员的参考手册。本书还可以作为高校的Java教材,以及企业培训教材。
致谢
本书在编写过程中得到了Sun公司在技术上的大力支持,飞思科技产品研发中心负责监制工作,复旦软件学院的MSE师生们为本书的编写提供了有益的帮助,JavaThinker网站(www.javathinker.org)的许多热心网友及作者的亲友,包括李红军、axman、gogolong、lwy0329、fjchenq、曹文伟和刘巧云等为本书提供了宝贵的建议,在此表示衷心的感谢!
尽管我们尽了最大努力,但本书难免会有不妥之处,欢迎各界专家和读者朋友批评指正。
编 著 者
飞思科技产品研发中心
无封面