1、目 录1 绪论. 11.1本程序的开发背景. 11.2开发环境. 11.3 Java语言.11.4 关于 Eclipse. 22 程序结构和设计思想. 42.1本文解决的主要技术问题. 42.2程序设计结构. 42.3程序设计思想. 53 程序分析和具体实现. 73.1目录选择器. 73.2重要图形界面模块的实现. 103.3任务栏托盘图标和任务栏弹出对话框. 173.4信息收发和文件传输的实现. 213.5使用外部程序包. 283.6发布程序. 331 绪论1.1 本软件的开发背景当今,是一个信息高度发达的时代,计算机无疑已经成为网络通信的主角,生活节奏的加快,使得人们对通信速度的要求越来越
2、高。对于在局域网内的计算机之间的数据交互,尤其是文件传输,通常,人们习惯于通过借助于移动存储介质,采取重复拷贝的方式来实现。这种传统文件传输方式存在诸多缺点,比如:1.消耗时间长,反复拔插存储介质过程繁琐;2.文件交互频繁,加速了计算机病毒的传播;3.虽然可以通过操作系统实现在局域网内的数据共享,但终因操作困难而使人们望而却步。在如此多困难之下,人们不禁会考虑,能不能通过软件来实现计算机之间的数据交互?答案是肯定的。本程序将针对这些问题进行设计。1.2 开发环境操作系统:Microsoft Windows XP程序语言:Java 2开 发 包:Java(TM) 2 Standard Editi
3、on (6.0)开发平台:Eclipse 3.0+Swing Designer+JRE6.01.3 Java语言Java平台演进到 Java2后,分别针对不同领域的需求被分成三个版本,亦即 J2EE、J2SE、J2ME。本程序使用 J2SE。J2SE是 Java的标准版本 (Java2 Standard Edition), 定位在客户端,主要用于桌面应用软件的编程。J2SE 包含那些构成 Java语言核心类库。Java语言区别于其它编程语言的特点主要有: (1)平台无关性(2)安全性 (3)面向对象(4)分布式(5)键壮性本程序中,突出体现了 Java语言的面向对象编程的特点,将对象实例化的模
4、式贯穿到了程序设计的始终,而且严格按照 Java语言的跨平台特性设计程序,完全摆脱了 windows操作系统的束缚。1.4 关于 EclipseEclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括 Java 开发工具 JDK。虽然大多数用户很乐于将 Eclipse 当作 Java IDE 来使用,但 Eclipse 的目标不仅限于此。Eclipse 还包括插件开发环境(Plug-in Development Environment,PDE) ,这个组件主
5、要针对希望扩展 Eclipse 的软件开发人员,因为它允许他们构建与 Eclipse 环境无缝集成的工具。由于 Eclipse 中的每样东西都是插件,对于给 Eclipse 提供插件,以及给用户提供一致和统一的集成开发环境而言,所有工具开发人员都具有同等的发挥场所。这种平等和一致性并不仅限于 Java 开发工具。尽管 Eclipse 是使用 Java 语言开发的,但它的用途并不限于 Java 语言;例如,支持诸如 C/C+、COBOL 和 Eiffel 等编程语言的插件已经可用,或预计会推出。Eclipse 框架还可用来作为与软件开发无关的其他应用程序类型的基础,比如内容管理系统。Eclips
6、e 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。图 1-1为 Eclipse3.0的编程界面。图 1-1 Eclipse3.0的编程界面2 程序结构和设计思想2.1 本程序需要解决的主要技术问题1.提供友好的用户界面2.实现信息收发3.实现文件传输和文件夹传输4.为程序添加系统托盘图标5.保存用户设置信息2.2 程序设计结构本程序按照功能可分为两个层:界面层和网络通信层。其中界面层主要采用 Java Swing编程技术编写用户界面,网络通信层采用Java Socket技术编写数据交互程序。随程序的容量不断扩大,在同
7、一个目录下存放所有的代码和执行文件,显得十分混乱,加大了不必要的工作量。因此,为了方便代码和其他资源文件的管理,本程序将所有的代码文件按功能分为一下几个功能包,它们实现的功能分别为:networker包:构建本程序的主窗体和系统托盘图标networker.about包: 提供用户帮助信息,介绍程序设计的相关信息ponent包: 包含程序设计中几个重要的自定义功能组件networker.directorychooser包: 实现目录选取对话框networker.panels包: 包含了主面板设计中需要用到的区域面板networker.panels.filepane包: 用于创建主面板中的文件发送
8、区networker.system包:完成本程序网络通信networker.taskbardialog包:构建任务栏弹出对话框2.3 程序设计思想网络编程的基本模型就是客户机到服务器模型,简单的说就是两个进程之间相互通讯,然后其中一个必须提供一个固定的位置,而另一个则只需要知道这个固定的位置。并去建立两者之间的联系,然后完成数据的通讯。这里提供固定位置的通常称为服务器,而建立联系的通常叫做客户端。目前,在互联网上比较常见的聊天软件通常都将程序分成两个部分使用,即客户机程序和服务器程序。客户机程序在网上发布供用户使用而服务器程序则只供服务器使用,一般不公开。采用这种模式可以方便管理员对所有用户进
9、行管理,但它必须单独提供一台计算机作为服务器。而对于在局域网内使用的聊天软件,由于计算机的数量有限,而且计算机之间的服务关系经常变化或者根本没有服务关系,采用这种模式就显得力不从心了。所以,综合考虑上述因素,本程序在服务关系上做了作了一个新的设计,就是将客户机程序和服务器程序绑定在同一个软件上。当程序启动时,服务器程序监听各自端口,只负责接受来自客户机的信息并向客户机发送文件,客户机程序只负责向服务器发送信息并接受来自服务器的文件。Java对 C/S模型的支持有很多种 API,本程序中运用的 Java Socket编程包含两个方面:一是基于 UDP协议的 Java DatagramSocket
10、和 Java DatagramPacket,二是基于 TCP/IP协议的Java Socket和 Java ServerSocket。Java DatagramSocket/DatagramPacket是 包中用于 UDP通信协议的类,其中 DatagramSocket称为报文套接字,主要用于创建 UDP通信中的报文套接字并发送报文,DatagramPacket 称为数据报,主要用于装载用户即将发送的报文。Java 中运用这两个类进行 UDP通信,实现快速的不可靠的简单数据传输。本程序中收发用户消息和系统消息的工作都由它们来完成。Java Socket/ServerSocket是 包中用于 T
11、CP/IP通信协议的类,其中 Socket称为客户机套接字,用于创建客户机程序,ServerSocket 称为服务器套接字,用于创建服务器。Java中运用这两个类进行 TCP/IP通信,实现面向数据链接的可靠数据传输,本程序中收发文件(文件夹)都是由这两个类来完成的。由于计算机之间利用 Java Socket进行的信息收发和文件传输事先是没有约定,要完成这些工作必须在程序中制定一个协议。本程序采用发送命令字的方式通知计算机完成相应工作,具体实现本文将在后面的章节中作具体介绍。3 程序分析和具体实现3.1 目录选择器在当前所有版本的 JDK中,都没有实现过 windows风格的目录选取对话框,本
12、程序考虑到保存文件的需要,重新定义了一个类似功能的目录选取对话框,并具有跨平台特性。其效果图如图 3-1:图 3-1 目录选择器实现目录选择器的类文件配置在 networker.directorychooser包中,其中包含 3个类:(1)TreeCell 类TreeCell类封装了一个 java.io.File类,并分别通过 4个方法返回了该 File对象的文件名、文件图标、文件路径、File 类本身。其构造函数如下:public TreeCell(File f)(2)DCTreeCellRenderer 类DCTreeCellRenderer类重构了树形组件的节点 UI,它继承自javax
13、.swing.JPanel,并实现了 TreeCellRenderer接口,重写方法:public Component getTreeCellRendererComponent(JTree tree,Object o,boolean sel,boolean ex,boolean leaf, int row,boolean focus)(3)DirectoryChooser 类DirectoryChooser实现了目录选取对话框的主体,它继承自javax.swing.JDialog类,并实现了接口ActionListener,TreeExpansionListener,其中最重要的组件是树形组件
14、,它把文件系统所有目录以树形结构转化为节点显示出来,用户可以很方便的在树形组件中浏览到文件系统中的所有目录。在DirectoryChooser中有几个方法是十分重要的,它们分别是:树选择事件:public void valueChanged(TreeSelectionEvent tse)树展开事件:public void treeExpanded(TreeExpansionEvent ee)初始化桌面:public void initDesk()为父节点添加子节点:public void addChild(DefaultMutableTreeNode node)这里重点指出显示对话框并获取用户选择的路径:程序为 DirectoryChooser类定义了两个静态变量