Java TCP/IP Socket编程
多年来,大学里的计算机网络课程使学生很少或几乎没有动手实践的机会。由于各种各样的原因(其中也包含一些积极因素),教师仅仅通过公式、分析以及对协议栈的抽象描述来讲授计算机网络的原理。教科书里可能会包含一些代码,但都没有与学生能够动手实践的任何东西结合起来。但是我们相信,如果能让学生看到(然后实现)这些原理在实际应用中的具体例子,他们将学得更好。所幸的是情况已经发生了变化。互联网已经成为人们日常生活的一部分,大部分学生(以及他们的程序)都能快速方便地访问网络服务,而且能免费获得大量正式软件(不分优劣)。
我们基于写《TCP/IP Sockets in C》同样的目的编写了本书:我们需要一些编程练习资源来支持计算机网络课程的学习。我们旨在为学生提供充足的引导,使他们能够在真实的网络服务中实践,而不会手足无措。在掌握了基本原理后,学生就能够进一步接触一些高级任务,并从中学习到路由算法、多媒体协议、介质访问控制等相关知识。我们尽量使本书像我们之前其他书一样,让学生选择自己熟悉的编程语言和技术,从而保证他们能学会相同的技能并理解相同的概念。当然,目前尚不清楚这一目标是否可以实现,但是无论如何,本书的范围、定价以及介绍的深度都力求做到这点。
面向的读者
本书面向两种类型的读者。第一类是学习计算机网络课程的本科生或研究生,他们是促使我们写这本书的首要因素。第二类是了解Java,想要学习利用Java来编写互联网应用程序的人。我们尽量保持了内容的简洁和专一性,因此本书既可以作为学生的辅助教程,也可以作为从业者涉足这一领域的入门指南。但是,你不能期望自己读完本书后就成为这一领域的专家!本书的目的只是引导读者入门并掌握足够的知识,从而能够进行独立研究和学习。
为配合练习,读者应有一台安装Java的计算机。本书基于Java 1.6版和Java虚拟机(JVM),然而,除少量较新的方法外,本书的代码也能在更早版本的Java中运行。由于Java具有可移植性,在不同硬件和操作系统上运行程序没有差别。
内容主线
第1章对计算机网络的概念进行了总体概述。从各方面看,这一介绍并不全面,但能够使读者与贯穿全书的概念和术语相同步。第2章介绍了简单的客户端和服务器的结构,这章中的代码能作为进行各种练习的起点。第3章涵盖了有关消息的创建和解析的基础内容。读者若能理解并消化前3章的内容,将能够为简单应用协议实现一个客户端和服务器。第4章和第5章介绍了建立具有扩展性和健壮性的客户端与服务器端的高级技术,其中,第5章专注于工具的应用,并对“New I/O”包进行了讲解。最后,为了与“通过程序来阐明原理”的目的相一致,第6章从细节上讨论了程序的构造和底层协议的实现之间的关系。
本书主要通过简单的程序实例来介绍一些编程概念,每一个实例后都附有对每行代码的注解,用以说明程序各部分的功能。这样使读者能够结合程序的上下文来理解重要的对象和方法。当你阅读代码时,就能理解每行代码的作用。
我们的例子并没有涵盖Java中所有库的应用。有些功能,特别是序列化技术,要求相互通信的所有节点都是由Java实现的。同时,为了尽快地介绍实例,我们刻意避免介绍引入之后将被清除的类和方法。我们尽量保持了内容的简洁,尤其是前面几个章节。
本书不包含哪些内容
作为一本辅导教程,为了使其定价保持在合理的范围内,我们必须对本书所涉及的内容有所限制,同时也要严格专注于前面所提出的目标。由于我们省略了某些方面的主题,因此有必要说明本书不包含哪些内容:
·本书不是一本介绍Java编程语言的书。我们只专注于TCP/IP套接字编程,同时希望读者已经熟悉Java语言的基本语法特征和类库(包括后期发布版所包含的内容,如泛型等),并知道如何使用Java进行程序开发。
·本书不是一本介绍协议的书。通过阅读本书并不能使你成为IP、TCP、FTP、HTTP或其他已知协议(可能反馈协议除外)的专家。我们的关注点在于套接字抽象层为TCP/IP服务所提供的接口。如果你已经对TCP协议和IP协议工作机制有所了解,这将对后续的学习有所帮助,不过第1章已经对相关内容做了足够的介绍。
·本书并不是一本介绍隐藏了通信细节的Java类库集(如HTTPConnection)而使程序员工作变得更轻松的实用指南。本书讲授进行通信协议相关开发的基础,而不是去回避它,因此书中并没有对那些隐藏了通信细节的API进行介绍。我们希望读者能够从通信线路的传输内容上理解协议,所以本书在大部分情况下直接使用了简单的字节流和显式的字符编码,并不对URL、URLConnection等类进行介绍。相信读者一旦理解了底层的基本原理,对那些更方便的类的使用就很容易上手了。
·本书不是一本讲解面向对象设计的书。我们致力于介绍TCP/IP套接字编程的重要原理,并通过实例对这些原理进行简要说明。本书尽可能使实例代码符合面向对象设计的思想,但如果这样做会增加代码的复杂度从而使套接字的原理变得模糊,或使代码变得臃肿,我们将把清晰性放在第一位,舍弃面向对象设计的思想。本书也没有包含有关网络编程的设计模式。(尽管我们认为本书也为理解这类设计模式提供了一些必要的背景知识!)
·本书不是一本讲解如何编写适用于生产环境的高质量代码的书。再次声明,虽然我们尽量使代码具有一定的健壮性,但这些实例代码的主要目的还是为了教学。为了避免由于使用了大量的错误处理代码而导致原理的含糊,我们放弃了一定的健壮性,使代码更加简洁清晰。·本书不是一本介绍如何用Java实现自定义的本地套接字的书。我们仅专注于Java标准库所提供的TCP/IP套接字,并没有对各种实现了套接字的包装器类进行介绍(如SocketImpl类)。
·为了避免本书中的实例聚集了过多的无关代码(即与套接字编程无关的代码),我们所有例子都是基于命令行的。在本书的网站上[1]有一些基于图形界面的网络应用程序的例子,本书没有将其纳入或进行讲解。
·本书不是关于Java Applet的书。applet使用了相同的Java网络API,因此一些通信代码看起来非常相似,不过Applet所能进行的通信方式有着非常严格的安全限制。我们对这些限制进行了有限的讨论,并在本书的网站上提供了一个Applet应用程序的例子。然而,对Applet网络编程的完整介绍不属于本书讨论的范围。