图文并茂版请至:
http://www.javatwo.net/JavaPaper/java_chat_room.pdf
第零话
------------
蓝图 / The Plan:
我们将利用 Java 制作一个网络聊天程序。这份文件将会简单的
介绍 Java 是什么,并大略的勾勒出这个程序的结构及运作方式。
咖啡杯
0.0.0
Java 是 Sun Microsystem 在 1995 年间推出的一种程序语言,这个语言拥有许多传统语言没有的特性。
0.0.1
除了 Java 天生的一些优势外,他最大的魅力在于它提供的应用程序程序设计接口 (API, Application Programming Interface),什么是 API 呢?所谓 API是指作业环境所提供给程序设计者用来使唤系统、链接库或是组件的函式呼叫或数据结构,换言之,就是操作系统或作业环境提供给应用程序与系统核心沟通的接口,像:ANSIC 中规定的 printf 就是用来向标准输出输出文字用的函数呼叫。所以,只要知道 Java 提供了哪些类别可供使用,就可以轻易的设计 Java 程序。
0.0.2
Java 语言由 Sun 发展到今天,已经成为一套十分庞大的软件环境,您可以
从http://java.sun.com 取得最新的 API 规格书,作为撰写Java 程序时的参考。
是的,由于 Java 是个完全的对象导向语言,所以他的 API 其实就是一个庞大的类别库,与系统沟通的函式被分门别类的包装在各个类别之中。
0.0.3
要注意:Java 并不仅是一套软件,而是一个规格。有许许多多的厂商可以根据这项规格提出他们自己的 Java 产品,程序设计者是针对 Java 这个平台设计他们的程序,所撰写的不是 Windows 程序,也不是 Unix 程序,而是Java 程序。Java 目前已经发展到了 1.4.1 版,目前主要有 IBM 和 Sun Microsystem 在个人计算机上实作 Java 的系统环境。
0.0.4
Java 的规格可以分成两部份:语言本身的规格和 Java 平台的 API 也就是内建的类别库的内容。这两部份都一直演进中,其中类别库的扩充是相当快的,这点可以从 JDK 的体积看的出来:从 1.1 版的 10MB 到 1.4.1 版的36 MB,语言本身的扩充就没有那么样的迅速:预计在 1.5 版将会支持样板。
0.0.5
毫无疑问的,Java 的发展会越来越有趣。
翔于蓝天的鸟
0.1.0
在这里精简的简介一下网络:透过电缆、光纤或无线电,将电子支持设施加以连结,使之能透过传输媒体交换信息,就可以构成网络。那资料是怎么从我们这头传到另外一端呢?简单而言可以从下面这个表格来解释:
"应用程序应用程序透过呼叫应用程序设计接口提供的函式送出资料。传输协议驱动程序传输协议驱动程序接受来自应用程序的请求,将其包装处理好后交给网络协议驱动程序,请他把资料送到指定的地址上。 网络协议驱动程序将传输协议驱动程序送交的资料贴好收件人地址后交给网络设备驱动程序,请网络设备驱动程序控制网络设备硬件,把资料送出去。网络设备驱动程序与网络硬设备〈如:以太网络卡〉直接相关,负责和硬件设备直接沟通。
网络硬设备接受来自设备驱动程序的命令,把资料送到传输媒体上头。
这部份可能是以太网络卡、记号环网络卡、蓝牙装置、串行端口或是无线电
终端器等等。 传输媒体讯号在这层跑。这部份可能是双绞线、同轴心缆、
光纤、水、空气或真空等等。网络硬设备从传输媒体上收受讯号,整理
后通知驱动程序:「喂!你的货到了,记得付钱。」
网络设备驱动程序收到网络硬设备的通知后将资料再加以整理与检查后,把资料送到网络协议驱动程序。网络协议驱动程序拿到网络设备送来的资料后,网络协议驱动程序会看看拿到的东西是不是要交给他的,如果不是,就把资料丢了,不然就交给传输协议驱动程序。传输协议驱动程序接到网络协定驱动程序送来的资料,加以整理与检查后,把资料交给应用程序。应用程式应用程序透过呼叫应用程序设计接口的函式取得资料。"
0.1.1
Java 目前只认识 IP (Internet Protocol) 这种网络型态,以及 TCP 和 UDP 这两种
传输通讯协议。而网际网络 (Internet) 所采用的正是 IP 这种网络通讯协议。
0.1.2
TCP 和 UDP 有一些差异,其中三个最大的差异就是:TCP 会保证资料绝对会送到,若没送到的话会通知应用程序,而 UDP 则没有这种保障,送出去的资料就像断了线的风筝般。TCP 还保障资料接收后顺序会和传送时的顺序相同,也就是若您的程序先把甲这个资料包裹送出再把乙这个资料包裹送出,另一端的程序将会先收到甲包裹在收到乙包裹,而UDP 则不提供这样的保障。 因为TCP 对资料的传递提供了种种的保障,所以 TCP 加诸于网络的负担也就比 UDP要来的大,速度也就自然会慢一些。
0.1.3
绝大部份的程序都是使用 TCP/IP 作为通讯协议,这样就可以省去检查资料完整
性及连续性的问题,如果您的程序不需要这两个特性,那您就可以考虑采用UDP/IP作为您的程序的网络数据传输媒介。
0.1.4
基本上,因为有应用程序接口包装过,透过网络存取资料就像读写档案一般,
相当的简单。
0.1.5
回到 Java 语言本身,下面列出一些常见到的名词及大略的说明:
类别 (Class):
===========
是一些数据域位和用来处理这些资料的方法所成的集合体,一个类别使用关键词 class 搭配类别的存取层级、类别的名称和类别的继承状态来宣告。
要根据某一类别来产生对象实体,必须使用关键词 new 并加上欲产生的类别名称及建构参数,产生出来的物见实体称为对象 (Object) 或称为该类别的一份案例 (Instance) 如:Button str=new Button("确定"); 则称 str 是 Button 的一
份案例 (Instance) 或称 str 是一个 Button 类别的对象。
继承:
======
Java 支持对象的继承,继承一个类别只要在宣告这个新类别时使用 extends
关键词加上预计成的类别名称即可。
抽象方法 (Abstract Methods):
=======================
抽象方法就是 C++ 中的纯虚拟函数,要宣告抽象方法只要在宣告方法时加
上关键词abstract 即可。
抽象类别 (Abstract Class):
====================
一个类别若拥有一个以上个抽象方法,那他就是个抽象类别。抽象类别必须在宣告时加上关键词 abstract 来作宣告。因为抽象类别是不完整的,所以您不能产生抽象类别的对象实体。
接口 (Interface):
=============
Java为了避免一个类别同时继承两个以上的类别时所造成模棱两可的问题,
限制一个类别只能继承自一个类别。但是,这么做在需要让一个类别拥有多种的特性时会显得很不方便,接口便是为了弥补这一点而诞生。接口之中仅允许宣告常数和抽象方法以规避名称冲突的问题。要实作一个接口,必须在宣告新类别时使用关键词implements 宣告。
弃置 (Deprecated):
==============
在 Java 演进的过程中,有些标准类别的方法会因为某些原因被更名或是丢弃,为了维持向前兼容性,这些方法大多都还会留在标准套件内,但并不建议新的程序去使用他们。API 规格书会在被弃置的方法旁列出替代的新方法或解决方案。
0.1.6
Java 语言本身的结构与语法请参考书本或是 Sun Microsystem 所提供的 The Java
Language Specification。
炭铅笔
0.2.0
好,我们来看看这个将要被我们写出来的聊天室程序大概会是长什么样子?
下面这是我所想到的接口:
0.2.1
那资料要如何传送呢?这有许多的方式:星状、树状或环状都是可行的做法。
其中因为星状的架构比较容易实作也比较容易管理,所以我们将采用这种结构
,下面是星状架构的示意图:
0.2.2
那服务器和使用者端程序会说些啥来达成让使用者聊天的目的呢?下面是我想到的内容,当然您也可以有您的一套:首先终端使用者连上服务端,和服务端说:
「早,我是某甲。」接着,只要有讯息送入服务端,服务端就会把这个讯息转送给所有和他搭上线的人,包含送出讯息的人。
0.2.3
换句话说,我们把使用者端显示讯息用窗口的内容管理权交由服务端来管理,如此可以确保所有聊天室内的成员会看到相同的内容。一但使用者端程序连上
服务端的程序,使用者端的程序第一句说的话就是表明自己的身分。此后每一
句话,都是要转送给所有挂在那个服务器上的使用者。使用者端如果听到服务
端说话,就把服务端说的话贴到讯息窗口上显示给使用者看。
0.2.4
综合上面所说,我们将会撰写两组程序:使用者端的程序和服务端的程序。整
个聊天室需要两组程序同时运转,才能够顺利运作。其中,使用者端的程序将
会有美美的图形化使用者接口 (GUI) 以方便终端使用者操作。至于服务端的程
式则一切从简,毕竟它可是整个系统的核心,不能够有任何的错误存在的。
第零话:蓝图结束
(代续)