飞鸽传书java版.docx
《飞鸽传书java版.docx》由会员分享,可在线阅读,更多相关《飞鸽传书java版.docx(19页珍藏版)》请在冰豆网上搜索。
飞鸽传书java版
目录
1绪论....................................................1
1.1本程序的开发背景........................................1
1.2开发环境................................................1
1.3Java语言................................................1
1.4关于Eclipse............................................2
2程序结构和设计思想......................................4
2.1本文解决的主要技术问题..................................4
2.2程序设计结构............................................4
2.3程序设计思想............................................5
3程序分析和具体实现......................................7
3.1目录选择器..............................................7
3.2重要图形界面模块的实现.................................10
3.3任务栏托盘图标和任务栏弹出对话框.......................17
3.4信息收发和文件传输的实现...............................21
3.5使用外部程序包.........................................28
3.6发布程序...............................................33
1绪论
1.1本软件的开发背景
当今,是一个信息高度发达的时代,计算机无疑已经成为网络通信的主角,生活节奏的加快,使得人们对通信速度的要求越来越高。
对于在局域网内的计算机之间的数据交互,尤其是文件传输,通常,人们习惯于通过借助于移动存储介质,采取重复拷贝的方式来实现。
这种传统文件传输方式存在诸多缺点,比如:
1.消耗时间长,反复拔插存储介质过程繁琐;
2.文件交互频繁,加速了计算机病毒的传播;
3.虽然可以通过操作系统实现在局域网内的数据共享,但终因操作困难而使人们望而却步。
在如此多困难之下,人们不禁会考虑,能不能通过软件来实现计算机之间的数据交互?
答案是肯定的。
本程序将针对这些问题进行设计。
1.2开发环境
操作系统:
MicrosoftWindowsXP
程序语言:
Java2
开发包:
Java(TM)2StandardEdition(6.0)
开发平台:
Eclipse3.0+SwingDesigner+JRE6.0
1.3Java语言
Java平台演进到Java2后,分别针对不同领域的需求被分成三个版本,亦即J2EE、J2SE、J2ME。
本程序使用J2SE。
J2SE是Java的标准版本(Java2StandardEdition),定位在客户端,主要用于桌面应用软件的编程。
J2SE包含那些构成Java语言核心类库。
Java语言区别于其它编程语言的特点主要有:
(1)平台无关性
(2)安全性
(3)面向对象
(4)分布式
(5)键壮性
本程序中,突出体现了Java语言的面向对象编程的特点,将对象实例化的模式贯穿到了程序设计的始终,而且严格按照Java语言的跨平台特性设计程序,完全摆脱了windows操作系统的束缚。
1.4关于Eclipse
Eclipse是一个开放源代码的、基于Java的可扩展开发平台。
就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。
幸运的是,Eclipse附带了一个标准的插件集,包括Java开发工具JDK。
虽然大多数用户很乐于将Eclipse当作JavaIDE来使用,但Eclipse的目标不仅限于此。
Eclipse还包括插件开发环境(Plug-inDevelopmentEnvironment,PDE),这个组件主要针对希望扩展Eclipse的软件开发人员,因为它允许他们构建与Eclipse环境无缝集成的工具。
由于Eclipse中的每样东西都是插件,对于给Eclipse提供插件,以及给用户提供一致和统一的集成开发环境而言,所有工具开发人员都具有同等的发挥场所。
这种平等和一致性并不仅限于Java开发工具。
尽管Eclipse是使用Java语言开发的,但它的用途并不限于Java语言;例如,支持诸如C/C++、COBOL和Eiffel等编程语言的插件已经可用,或预计会推出。
Eclipse框架还可用来作为与软件开发无关的其他应用程序类型的基础,比如内容管理系统。
Eclipse是一个开放源代码的、基于Java的可扩展开发平台。
就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。
图1-1为Eclipse3.0的编程界面。
图1-1Eclipse3.0的编程界面
2程序结构和设计思想
2.1本程序需要解决的主要技术问题
1.提供友好的用户界面
2.实现信息收发
3.实现文件传输和文件夹传输
4.为程序添加系统托盘图标
5.保存用户设置信息
2.2程序设计结构
本程序按照功能可分为两个层:
界面层和网络通信层。
其中界面层主要采用JavaSwing编程技术编写用户界面,网络通信层采用JavaSocket技术编写数据交互程序。
随程序的容量不断扩大,在同一个目录下存放所有的代码和执行文件,显得十分混乱,加大了不必要的工作量。
因此,为了方便代码和其他资源文件的管理,本程序将所有的代码文件按功能分为一下几个功能包,它们实现的功能分别为:
networker包:
构建本程序的主窗体和系统托盘图标
networker.about包:
提供用户帮助信息,介绍程序设计的相关信息
ponent包:
包含程序设计中几个重要的自定义功能组件
networker.directorychooser包:
实现目录选取对话框
networker.panels包:
包含了主面板设计中需要用到的区域面板
networker.panels.filepane包:
用于创建主面板中的文件发送区
networker.system包:
完成本程序网络通信
networker.taskbardialog包:
构建任务栏弹出对话框
2.3程序设计思想
网络编程的基本模型就是客户机到服务器模型,简单的说就是两个进程之间相互通讯,然后其中一个必须提供一个固定的位置,而另一个则只需要知道这个固定的位置。
并去建立两者之间的联系,然后完成数据的通讯。
这里提供固定位置的通常称为服务器,而建立联系的通常叫做客户端。
目前,在互联网上比较常见的聊天软件通常都将程序分成两个部分使用,即客户机程序和服务器程序。
客户机程序在网上发布供用户使用而服务器程序则只供服务器使用,一般不公开。
采用这种模式可以方便管理员对所有用户进行管理,但它必须单独提供一台计算机作为服务器。
而对于在局域网内使用的聊天软件,由于计算机的数量有限,而且计算机之间的服务关系经常变化或者根本没有服务关系,采用这种模式就显得力不从心了。
所以,综合考虑上述因素,本程序在服务关系上做了作了一个新的设计,就是将客户机程序和服务器程序绑定在同一个软件上。
当程序启动时,服务器程序监听各自端口,只负责接受来自客户机的信息并向客户机发送文件,客户机程序只负责向服务器发送信息并接受来自服务器的文件。
Java对C/S模型的支持有很多种API,本程序中运用的JavaSocket编程包含两个方面:
一是基于UDP协议的JavaDatagramSocket和JavaDatagramPacket,二是基于TCP/IP协议的JavaSocket和JavaServerSocket。
JavaDatagramSocket/DatagramPacket是包中用于UDP通信协议的类,其中DatagramSocket称为报文套接字,主要用于创建UDP通信中的报文套接字并发送报文,DatagramPacket称为数据报,主要用于装载用户即将发送的报文。
Java中运用这两个类进行UDP通信,实现快速的不可靠的简单数据传输。
本程序中收发用户消息和系统消息的工作都由它们来完成。
JavaSocket/ServerSocket是包中用于TCP/IP通信协议的类,其中Socket称为客户机套接字,用于创建客户机程序,ServerSocket称为服务器套接字,用于创建服务器。
Java中运用这两个类进行TCP/IP通信,实现面向数据链接的可靠数据传输,本程序中收发文件(文件夹)都是由这两个类来完成的。
由于计算机之间利用JavaSocket进行的信息收发和文件传输事先是没有约定,要完成这些工作必须在程序中制定一个协议。
本程序采用发送命令字的方式通知计算机完成相应工作,具体实现本文将在后面的章节中作具体介绍。
3程序分析和具体实现
3.1目录选择器
在当前所有版本的JDK中,都没有实现过windows风格的目录选取对话框,本程序考虑到保存文件的需要,重新定义了一个类似功能的目录选取对话框,并具有跨平台特性。
实现目录选择器的类文件配置在networker.directorychooser包中,其中包含3个类:
(1)TreeCell类
TreeCell类封装了一个java.io.File类,并分别通过4个方法返回了该File对象的文件名、文件图标、文件路径、File类本身。
其构造函数如下:
publicTreeCell(Filef)
(2)DCTreeCellRenderer类
DCTreeCellRenderer类重构了树形组件的节点UI,它继承自javax.swing.JPanel,并实现了TreeCellRenderer接口,重写方法:
publicComponentgetTreeCellRendererComponent(JTreetree,Objecto,booleansel,booleanex,booleanleaf,introw,booleanfocus)
(3)DirectoryChooser类
DirectoryChooser实现了目录选取对话框的主体,它继承自javax.swing.JDialog类,并实现了接口ActionListener,TreeExpansionListener,其中最重要的组件是树形组件,它把文件系统所有目录以树形结构转化为节点显示出来,用户可以很方便的在树形组件中浏览到文件系统中的所有目录。
在DirectoryChooser中有几个方法是十分重要的,它们分别是:
树选择事件:
publicvoidvalueChanged(TreeSelectionEventtse)
树展开事件:
publicvoidtreeExpanded(TreeExpansionEventee)
初始化桌面:
publicvoidinitDesk()
为父节点添加子节点:
publicvoidaddChild(DefaultMutableTreeNodenode)
这里重点指出显示对话框并获取用户选择的路径:
程序为DirectoryChooser类定义了两个静态变量
//判断用户是否点了“确定”按钮
publicstaticbooleanCHOOSE_FLAG=false;
//提取用户选取的路径
publicstaticStringDIRECTORY_PATH=null;
显示对话框时,界面的阻塞状态,等待用户的相关操作,当用户点击“取消”或者是对话框关闭按钮时,CHOOSE_FLAG的值设为false,除了对话框退出以外,不进行任何操作,反之当用户点击“确定”按钮时,设为true,DIRECTORY_PATH的值被设定为相应的路径值,实现语句如下:
显示对话框:
publicbooleanShowDialog(){
setVisible(true);
returnCHOOSE_FLAG;
}
调用方法:
DirectoryChooserdialog=newDirectoryChooser(frame,title);
booleanf=dialog.ShowDialog();
if(f)//获取选择路径
System.out.println(DirectoryChooser.DIRECTORY_PATH);
else;//什么都不做
3.2重要图形界面模块的实现
面向对象编程的最大好处就在于将一个大型的程序分成若干个模块来实现,而且模块之间的实现过程一般不会互相影响,哪个模块出了问题只需修改它本身,而不用改动其他模块。
本程序也毫不例外的运用了面向对象编程的这种特点,下面将一一介绍本程序中用到的程序模块。
3.2.1在线用户列表
在线用户列表用于显示局域网内其他在线用户,它位于主面板的左侧,构建在线用户列表用到了ponents包中的UserItem类、UserList类、MyRenderer类和neworker.panels包中的UserPane类。
它们的实现方法分别为:
UserItem类
UserItem类是为构建在线用户列表而设计的类,用来存储在线用户信息(用户名,IP地址,用户头像地址),其构造函数为:
publicUserItem(Stringname,Stringipaddress,Stringimagepath)//name载入用户名,ipaddress,imagepath
UserList类
UserList类是用来存储在线用户对象的列表类,它继承自javax.swing.JList。
在UserList还有很多对用户对象进行操作的方法:
添加本地用户对象:
publicvoidaddMe()
添加用户:
publicvoidaddUser(UserItemitem)
删除指定用户:
publicvoidremoveUser(Stringusername)
获取选中用户的用户名:
publicStringgetSelectedUserName()
获取所有在线用户的IP地址:
publicString[]getAllIPs()
删除所有用户对象:
publicvoidremoveAllUser()
判断用户是否已在用户列表中:
publicbooleanexists(UserItemitem)
MyRenderer类
MyRenderer类重构了列表类的列表项,使更复杂的信息能在JList中显示,它继承自javax.swing.JPanel,并实现了javax.swing.ListCellRenderer接口,重写方法:
publicComponentgetListCellRendererComponent(JListlist,Objecto,intindex,booleanisSelected,booleanhasFocus)
构建MyRenderer的意义是十分重大的,JList在默认情况下是不支持显示多行文本和图片的,只有通过构建一个类,也就是像MyRenderer这样的类,并让JList的对象调用方法:
setCellRenderer(newMyRenderer())来实现。
UserPane类
UserPane类继承自javax.swing.JPanel类,是装载UserList的类,它的构造函数为:
publicUserPane(UserListlist)
3.2.2文件发送区
文件发送区用于存放即将发送的文件列表并发送文件和文件夹,它位于程序主面板的中上部。
文件发送区由networker.panels.filepane包实现,它包含LabelRenderer、FileIcon、FileTable、MScroll和FilePane五个类。
在文件发送区,用户可以通过两种方式向文件发送区添加发送对象:
1.通过菜单栏或右键菜单中“传送文件”、“传送文件夹”菜单项或通过工具栏中相应图标按钮打开文件或文件夹选择器;2.直接在windows资源管理器中将指定文件拖拽至文件发送区。
filepane包主要围绕javax.swing.JTable表格类进行设计。
LabelRenderer类
LabelRenderer类继承了javax.swing.JLabel类,实现了javax.swing.table.TableCellRenderer接口,从而改写了JTabel表格的单元格,实现了带图标的单元格。
重写方法:
publicComponentgetTableCellRendererComponent(JTablet,Objectvalue,booleanisSelected,booleanhasFocus,introw,intcol)
FileIcon类
FileIcon类封装了一个File类对象,并通过一系列方法获取该File对象的文件名、文件路径、文件图标。
这里重点提出javax.swing.filechooser.FileSystemView类,它是处理文件系统的一个很重要的类,在FileIcon类中使用方法:
ImageIconicon=(ImageIcon)FileSystemView.getSystemIcon(file)获取文件的系统图标。
FileTable类
FileTable类是filepane包中最重要的一个类,它是装载文件列表的主体。
它继承了javax.swing.JTabel类,实现了接口DropTargetListener,DragGestureListener,DragSourceListener,ActionListener。
这里重点讨论javaswing的拖拽事件。
实现组件的拖拽功能,必须让组件实现DropTargetListener,DragGestureListener,DragSourceListener接口,完成以下步骤:
(1)创建DragSource
DragSourcedragSource=newDragSource();
dragSource.createDefaultDragGestureRecognizer(this,DnDConstants.ACTION_COPY_OR_MOVE,this);
publicvoiddrop(DropTargetDropEventdtde){}
(2)重写拖拽事件方法
publicvoiddrop(DropTargetDropEventdtde){}
Mscroll类:
Mscroll类继承自javax.swing.JScrollPane,实现DropTargetListener,DragGestureListener,DragSourceListener接口,用于给FileTable添加滚动窗格,为完善FileTable的拖拽功能而设计。
在初始状态下,FileTable中没有对象,这时拖拽功能不能依靠FileTable来实现,必须借助一个载体来实现拖拽功能,将发送对象添加入文件发送区,而给FileTable添加滚动窗格的JScrollPane则是最佳选择,MScroll则由此而产生。
FilePane类:
FilePane类将文件发送区的最终形式添加到程序主面板中,用户可以在在线用户列表中选择一个在线用户点击“发送”按钮发送文件,当欲发送对象不在在线用户列表中时,可以点击“发送至”按钮,在弹出的输入框中输入对方的IP地址,即可发送文件。
发送过程涉及到socket编程,本文在后面的篇幅中再作介绍。
3.2.3文本发送区
文本发送区用于发送用户自己输入的信息,它位于程序主面板的中下部,由networker.panels包中的SendMsgPane类实现。
SendMsgPane类继承自javax.swing.JPanel,并实现了ActionListener,ItemListener接口。
它是程序中供用户发送信息的主要模块,其中心面板上是一个javax.swing.JTextArea文本域,操作和显示相对简单快捷,这里重点讲右键菜单的用法。
(1)右键弹出菜单的构造函数
JPopupMenupop=newJPopupMenu();
(2)添加菜单项:
pop.add(newJMenuItem());
(3)为使用右键菜单的组件添加鼠标事件:
component.addMouseListener(newMouseAdapter(){
publicvoidmousePressed(MouseEventevt){
if(evt.isPopupTrigger()){
pop.show(evt.getComponent(),evt.getX(),evt.getY());}}
publicvoidmouseReleased(MouseEventevt){
if(evt.isPopupTrigger()){
pop.show(evt.getComponent(),evt.getX(),evt.getY());}}
});
各菜单项和按钮的功能及相关函数:
复制:
textarea.copy();
剪切:
textarea.cut();
粘贴:
textarea.paste();
全选:
textarea.selectedAll();
清空:
textarea.setText(“”);
删除:
这个操作没有给定方法,用自定义函数实现:
JTextAreaarea=newJTextArea();
intstart=area.getSelectionStart(),
end=area.getSelectionEnd();
Stringall=area.getText();
before=all.substring(0,start);
after=all.substring(end,all.length());
area.setText(before+after);
area.setFocusable(true);
“发送”、“发送至”按钮的功能同文件发送区类似,此外文本发送区支持群发功能,当点击“群发”按钮时,程序会给每个在线用户发送同一个信息。
发送过程同样涉及到socket编程,本文在后面的章节中作进一步的介绍。
3.2.4超链接标签
本文在3.2小节中介绍networker.about.JavaPage类时,曾经提到过超级链接标签,它用于实现类似网页上超级链接功能,点击它,可以利用本地浏览器打开一个网页。
ponents.LinkLabel类实现了这种标签,它继承自javax.swing.JLabel,并添加了鼠标事件,重写如下方法: