基于JAVA的飞鸽传书系统设计

上传人:沈*** 文档编号:44276371 上传时间:2021-12-05 格式:DOC 页数:36 大小:570.01KB
收藏 版权申诉 举报 下载
基于JAVA的飞鸽传书系统设计_第1页
第1页 / 共36页
基于JAVA的飞鸽传书系统设计_第2页
第2页 / 共36页
基于JAVA的飞鸽传书系统设计_第3页
第3页 / 共36页
资源描述:

《基于JAVA的飞鸽传书系统设计》由会员分享,可在线阅读,更多相关《基于JAVA的飞鸽传书系统设计(36页珍藏版)》请在装配图网上搜索。

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 Editio

3、n (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),这个组件主要针对希望扩展 Ecli

5、pse 的软件开发人员,因为它允许他们构建与 Eclipse 环境无缝集成的工具。由于 Eclipse 中的每样东西都是插件,对于给 Eclipse 提供插件,以及给用户提供一致和统一的集成开发环境而言,所有工具开发人员都具有同等的发挥场所。这种平等和一致性并不仅限于 Java 开发工具。尽管 Eclipse 是使用 Java 语言开发的,但它的用途并不限于 Java 语言;例如,支持诸如 C/C+、COBOL 和 Eiffel 等编程语言的插件已经可用,或预计会推出。Eclipse 框架还可用来作为与软件开发无关的其他应用程序类型的基础,比如内容管理系统。Eclipse 是一个开放源代码的、

6、基于 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包: 用于创建主面板中的文件发送区networker.syste

8、m包:完成本程序网络通信networker.taskbardialog包:构建任务栏弹出对话框2.3 程序设计思想网络编程的基本模型就是客户机到服务器模型,简单的说就是两个进程之间相互通讯,然后其中一个必须提供一个固定的位置,而另一个则只需要知道这个固定的位置。并去建立两者之间的联系,然后完成数据的通讯。这里提供固定位置的通常称为服务器,而建立联系的通常叫做客户端。目前,在互联网上比较常见的聊天软件通常都将程序分成两个部分使用,即客户机程序和服务器程序。客户机程序在网上发布供用户使用而服务器程序则只供服务器使用,一般不公开。采用这种模式可以方便管理员对所有用户进行管理,但它必须单独提供一台计算

9、机作为服务器。而对于在局域网内使用的聊天软件,由于计算机的数量有限,而且计算机之间的服务关系经常变化或者根本没有服务关系,采用这种模式就显得力不从心了。所以,综合考虑上述因素,本程序在服务关系上做了作了一个新的设计,就是将客户机程序和服务器程序绑定在同一个软件上。当程序启动时,服务器程序监听各自端口,只负责接受来自客户机的信息并向客户机发送文件,客户机程序只负责向服务器发送信息并接受来自服务器的文件。Java对C/S模型的支持有很多种API,本程序中运用的Java Socket编程包含两个方面:一是基于UDP协议的Java DatagramSocket和Java DatagramPacket,

10、二是基于TCP/IP协议的Java Socket和Java ServerSocket。Java DatagramSocket/DatagramPacket是包中用于UDP通信协议的类,其中DatagramSocket称为报文套接字,主要用于创建UDP通信中的报文套接字并发送报文,DatagramPacket称为数据报,主要用于装载用户即将发送的报文。Java中运用这两个类进行UDP通信,实现快速的不可靠的简单数据传输。本程序中收发用户消息和系统消息的工作都由它们来完成。Java Socket/ServerSocket是包中用于TCP/IP通信协议的类,其中Socket称为客户机套接字,用于创建

11、客户机程序,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.swing.JPanel,并实现了TreeCellRenderer接口,重写方法:public C

13、omponent 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类定义了两个静态变量/判断用户是否点了“确定”按钮pu

15、blic static boolean CHOOSE_FLAG=false;/提取用户选取的路径public static String DIRECTORY_PATH=null;显示对话框时,界面的阻塞状态,等待用户的相关操作,当用户点击“取消”或者是对话框关闭按钮时,CHOOSE_FLAG的值设为false,除了对话框退出以外,不进行任何操作,反之当用户点击“确定”按钮时,设为true,DIRECTORY_PATH的值被设定为相应的路径值,实现语句如下:显示对话框:public boolean ShowDialog()setVisible(true);return CHOOSE_FLAG;调

16、用方法:DirectoryChooser dialog = new DirectoryChooser(frame,title);boolean f=dialog.ShowDialog();if(f) /获取选择路径System.out.println(DirectoryChooser.DIRECTORY_PATH);else ;/什么都不做3.2 重要图形界面模块的实现面向对象编程的最大好处就在于将一个大型的程序分成若干个模块来实现,而且模块之间的实现过程一般不会互相影响,哪个模块出了问题只需修改它本身,而不用改动其他模块。本程序也毫不例外的运用了面向对象编程的这种特点,下面将一一介绍本程序中

17、用到的程序模块。3.2.1 在线用户列表在线用户列表用于显示局域网内其他在线用户,它位于主面板的左侧,如图3-2所示:图3-2 在线用户列表构建在线用户列表用到了ponents包中的UserItem类、UserList类、MyRenderer类和neworker.panels包中的UserPane类。它们的实现方法分别为:UserItem类UserItem类是为构建在线用户列表而设计的类,用来存储在线用户信息(用户名,IP地址,用户头像地址),其构造函数为:public UserItem (String name,String ipaddress,String imagepath) /name

18、载入用户名,ipaddress,imagepathUserList类UserList类是用来存储在线用户对象的列表类,它继承自javax.swing.JList。在UserList还有很多对用户对象进行操作的方法:添加本地用户对象:public void addMe()添加用户:public void addUser(UserItem item)删除指定用户:public void removeUser(String username) 获取选中用户的用户名:public String getSelectedUserName() 获取所有在线用户的IP地址:public String getA

19、llIPs()删除所有用户对象: public void removeAllUser() 判断用户是否已在用户列表中:public boolean exists(UserItem item) MyRenderer类MyRenderer类重构了列表类的列表项,使更复杂的信息能在JList中显示,它继承自javax.swing.JPanel,并实现了javax.swing. ListCellRenderer接口,重写方法:public Component getListCellRendererComponent(JList list, Object o, int index, boolean is

20、Selected, boolean hasFocus)构建MyRenderer的意义是十分重大的,JList在默认情况下是不支持显示多行文本和图片的,只有通过构建一个类,也就是像MyRenderer这样的类,并让JList的对象调用方法:setCellRenderer(new MyRenderer()来实现。UserPane类UserPane类继承自javax.swing.JPanel类,是装载UserList的类,它的构造函数为: public UserPane(UserList list)3.2.2 文件发送区文件发送区用于存放即将发送的文件列表并发送文件和文件夹,它位于程序主面板的中上部

21、,其效果图如图3-3:图3-3 文件发送区文件发送区由networker.panels.filepane包实现,它包含LabelRenderer、FileIcon、FileTable、MScroll和FilePane五个类。在文件发送区,用户可以通过两种方式向文件发送区添加发送对象:1.通过菜单栏或右键菜单中“传送文件”、“传送文件夹”菜单项或通过工具栏中相应图标按钮打开文件或文件夹选择器;2.直接在windows资源管理器中将指定文件拖拽至文件发送区。filepane包主要围绕javax.swing.JTable表格类进行设计。LabelRenderer类LabelRenderer类继承了j

22、avax.swing.JLabel类,实现了javax.swing.table. TableCellRenderer接口,从而改写了JTabel表格的单元格,实现了带图标的单元格。重写方法:public Component getTableCellRendererComponent(JTable t,Object value, boolean isSelected,boolean hasFocus,int row,int col)FileIcon类FileIcon类封装了一个File类对象,并通过一系列方法获取该File对象的文件名、文件路径、文件图标。这里重点提出javax.swing.fi

23、lechooser.FileSystemView类,它是处理文件系统的一个很重要的类,在FileIcon类中使用方法:ImageIcon icon=(ImageIcon)FileSystemView.getSystemIcon(file)获取文件的系统图标。FileTable类FileTable类是filepane包中最重要的一个类,它是装载文件列表的主体。它继承了javax.swing.JTabel类,实现了接口DropTargetListener, DragGestureListener, DragSourceListener, ActionListener。这里重点讨论java swin

24、g的拖拽事件。实现组件的拖拽功能,必须让组件实现DropTargetListener, DragGestureListener, DragSourceListener接口,完成以下步骤:(1)创建DragSourceDragSource dragSource = new DragSource();dragSource.createDefaultDragGestureRecognizer(this, DnDConstants.ACTION_COPY_OR_MOVE, this);public void drop(DropTargetDropEvent dtde)(2)重写拖拽事件方法public

25、 void drop(DropTargetDropEvent dtde)Mscroll类:Mscroll类继承自javax.swing.JScrollPane, 实现DropTargetListener, DragGestureListener, DragSourceListener接口,用于给FileTable添加滚动窗格,为完善FileTable的拖拽功能而设计。在初始状态下,FileTable中没有对象,这时拖拽功能不能依靠FileTable来实现,必须借助一个载体来实现拖拽功能,将发送对象添加入文件发送区,而给FileTable添加滚动窗格的JScrollPane则是最佳选择,MScr

26、oll则由此而产生。FilePane类:FilePane类将文件发送区的最终形式添加到程序主面板中,用户可以在在线用户列表中选择一个在线用户点击“发送”按钮发送文件,当欲发送对象不在在线用户列表中时,可以点击“发送至”按钮,在弹出的输入框中输入对方的IP地址,即可发送文件。发送过程涉及到socket编程,本文在后面的篇幅中再作介绍。3.2.3 文本发送区文本发送区用于发送用户自己输入的信息,它位于程序主面板的中下部,由networker.panels包中的SendMsgPane类实现,其效果图如图3-4所示:图3-4 文本发送区SendMsgPane类继承自javax.swing.JPanel

27、,并实现了ActionListener,ItemListener接口。它是程序中供用户发送信息的主要模块,其中心面板上是一个javax.swing.JTextArea文本域,操作和显示相对简单快捷,这里重点讲右键菜单的用法。(1)右键弹出菜单的构造函数JPopupMenu pop=new JPopupMenu();(2)添加菜单项:pop.add(new JMenuItem();(3)为使用右键菜单的组件添加鼠标事件:component.addMouseListener(new MouseAdapter()public void mousePressed(MouseEvent evt) if

28、(evt.isPopupTrigger()pop.show(evt.getComponent(),evt.getX(), evt.getY();public void mouseReleased(MouseEvent evt) if (evt.isPopupTrigger() pop.show(evt.getComponent(),evt.getX(), evt.getY(););各菜单项和按钮的功能及相关函数:复制:textarea.copy();剪切:textarea.cut();粘贴:textarea.paste();全选:textarea.selectedAll();清空:textar

29、ea.setText(“”);删除:这个操作没有给定方法,用自定义函数实现:JTextArea area=new JTextArea();int start=area.getSelectionStart(), end=area.getSelectionEnd();String all=area.getText();before=all.substring(0,start);after=all.substring(end,all.length();area.setText(before+after);area.setFocusable(true);“发送”、“发送至”按钮的功能同文件发送区类似,

30、此外文本发送区支持群发功能,当点击“群发”按钮时,程序会给每个在线用户发送同一个信息。发送过程同样涉及到socket编程,本文在后面的章节中作进一步的介绍。3.2.4超链接标签本文在3.2小节中介绍networker.about.JavaPage类时,曾经提到过超级链接标签,它用于实现类似网页上超级链接功能,点击它,可以利用本地浏览器打开一个网页。ponents.LinkLabel类实现了这种标签,它继承自javax.swing.JLabel,并添加了鼠标事件,重写如下方法:public void mouseEntered(MouseEvent e)public void mouseExite

31、d(MouseEvent e)public void mouseClicked(MouseEvent e)利用本地浏览器打开网页是JDK6.0中提供的新功能,其基本方法为:Desktop.getDesktop().browse(new URI(new URL(url);其中url为将要打开网页的网址;3.3 任务栏托盘图标和任务栏弹出对话框3.3.1 任务栏托盘图标Java实现系统托盘图标是sun公司在JDK6.0中新添加功能,它使用的api分别是位于java.awt包中的SystemTray和TrayIcon,其实现方式如下:SystemTray tray = SystemTray.getS

32、ystemTray();TrayIcon icon=new TrayIcon(image,tooltiptext,menu);tray.add(icon);其中,image是一个装载图片的Image,menu是一个菜单类PopupMenu;而tooltiptext则是一个字符串String,当鼠标放在托盘图标上时,托盘图标会弹出一个解释框显示tooltiptext,菜单中的菜单项功能与主窗体的相应菜单项功能一致。本程序中的networker.TaskBarIcon类利用了这些api为程序添加了一个托盘图标,其效果图如图3-5:图3-5 托盘图标3.3.2 任务栏弹出对话框有经验的朋友都知道,我

33、们在使用很多软件的过程中,经常会看到任务栏托盘的上方会弹出一些提示用户的对话框,比如:卡巴斯基在检测到计算机有病毒威胁时,会弹出对话框提示用户是否清除病毒;腾讯QQ报道一些小型新闻也会从任务栏弹出对话框提示用户查看;web迅雷在下载完文件或下载失败时,都会使用相同的方式提示用户。由于它不会占用用户太多的屏幕分量,而又达到了提示用户的效果,这种方式得到了越来越多用户和程序员的认可。然而在java的世界里,考虑到程序的跨平台性,目前在所有版本JDK的类库中都没有提供实现这种效果的API,幸运的是,Java Swing的设计十分巧妙,程序员可以利用其高度的可扩展性构建符合要求的功能模块。本程序在ne

34、tworker.taskbardialog包中就利用Java中已有的API实现了这种功能,效果图如图3-6:图3-6 任务栏弹出对话框TaskBarDialog类TaskBarDialog类是完成此功能的基类,它继承自javax.swing.Jdialog类,并实现了Runnable接口,程序启动时开通一个线程,通过dialog.setBounds方法不断改变窗体的大小和位置,当窗体达到目标大小和位置时,并使用方法SwingUtilities.updateComponentTreeUI(this) 刷新界面,具体操作步骤如下:(1)首先获取屏幕大小Toolkit t=Toolkit.getDe

35、faultToolkit();Dimension screen=t.getScreenSize();int w=(int)screen.getWidth();int h=(int)screen.getHeight();(2)然后获取通过构造函数传入的参数(窗体最终大小和任务栏宽度)public TaskBarDialog(int width,int height,int TaskBar)(3)开通线程while(flag) setBounds(w-width,h-(TaskBar+i),width,i); i+; if(iheight) flag=false;SwingUtilities.up

36、dateComponentTreeUI(this);(4)显示对话框public void showDialog() setVisible(true);Thread t=new Thread(this);t.start(); ShowFileDialog类和DefaultSavaPath类ShowFileDialog类继承了TaskBarDialog类,并实现了接口java.awt.event. ActionListener。它最终实现了从任务栏托盘弹出提示对话框的动态效果,对话框弹出后,用户可以根据提示进行保存文件的操作,从效果图上,可以清楚的看到,收到文件的文件名和文件大小,以及供用户操作

37、的3个按钮“保存到”、“确定”、“拒绝”,当用户点击“拒绝”时,对话框退出,程序自动发送拒绝消息至文件发送方,通知对方取消操作;当用户点击“保存到”按钮时,会弹出目录选择对话框,供用户选择一个保存目录,并通知发送方打开服务器准备发送文件;当用户点击“确定”按钮时,程序直接将文件保存在用户设定的默认保存目录,其中文件默认保存目录可以通过在主面板“设置”菜单中的“设置默认存取目录”菜单项来设置,taskbardialog包中的DefaultSavaPath类就是用来完成这个功能的。3.4 信息收发和文件传输的实现networker.system包是完成本程序网络通信的中心包,它工作在计算机后台,不

38、与用户进行交互,但计算机之间的数据交互都是由它来完成的,是一个功能巨大默默无闻的net worker。3.4.1 自定义的Sys和SystemInfo类networker.system包的基本功能都是由Sys和SystemInfo类提供的,这两个类中的方法都是静态的,程序调用这些方法只需直接利用类名而不用构造它们的对象,大大简化了本程序网络通信设计的过程。Sys类中提供的方法有:获取系统时间public static String getDate()获取文件大小常规表达public static String getFileLengthExpress(File f)获取相对目录public s

39、tatic String getRelativePath(String a,String p)获取文件或文件夹总大小public static long getLength(File f)获取局域网所有用户的IP地址public static String getUserIPs()SystemInfo类主要用于保存程序在使用过程中的配置信息,其中大量使用了外部程序包jdom.jar中java操作xml文档的api,调用过程在后面的章节中再作详细介绍。SystemInfo类中提供的方法有:设置和获取图像路径public static void setImagePath(String imagep

40、ath)public static String getImagePath()设置和获取用户名public static void setMyName(String name)public static String getMyName()设置和获取皮肤public static void setLookAndFeel(String laf)public static String getLookAndFeel()设置默认存取路径public static void setDefaultSavePath(String savepath)public static String getDefau

41、ltSavePath()添加和获取好友列表public static void setUserList(String list)public static String getUserList()读取帮助文档public static String getHelpDoc(String str)3.4.2 数据交互基本思想和工作原理1.使用网络通信协议考虑到局域网发生错误的可能性很低,本程序中的所有的信息收发工作都采用UDP通信协议,原因是UDP通信速度快,弥补了java程序运行速度的不足;而所有的文件传输工作都采用TCP/IP协议,因为文件传输要考虑到安全性,必须保证计算机之间建立连接之后才能

42、进行文件传输。2.客户端和服务器模式(C/S)由于本程序工作在局域网内数量有限的若干台计算机之间,像目前比较流行的网络软件(比如QQ,MSN等)一样使用特定服务器的可能性不大,所以本程序必须考虑各终端的C/S通信机制。既然不能使用特定服务器,就要实现网络通信,那么每台计算机终端都必须有C/S程序,也就是说必须在同一台计算机上同时运行C/S程序。为了保证计算机之间通信不致混乱,本程序合理的安排了C/S程序的任务,即:程序启动时,服务器程序监听各自端口,只负责接受来自客户机的信息并向客户机发送文件,客户机程序只负责向服务器发送信息并接受来自服务器的文件,如此一来,客户机和服务器各司其职,各尽其责,

43、使网络通信有条不紊,并且大大简化了程序设计的过程。3.使用命令字由于计算机之间进行互操作,不可避免的要使用到各种各样的操作命令,为了区分它们以用户信息,程序中设定了一系列的命令字,如下:首先定义一系列静态整形数字和分隔符:private static int NETWORKER_CONNECT=0, NETWORKER_EXIT=1, NETWORKER_MESSAGE=2, NETWORKER_FILE=3, NETWORKER_DIRECTORY=4, NETWORKER_FILE_YES=5, NETWORKER_FILE_NO=6, NETWORKER_DIRECTORY_YES=7,

44、 NETWORKER_DIRECTORY_NO=8, NETWORKER_JUMP=10;public static String SEP=|;然后设定命令字:(1)扫描用户NETWORKER_CONNECT|本地用户名|本地IP|本地用户头像地址 (2)退出连接 NETWORKER_EXIT|本地用户名|本地IP (3)发送消息 NETWORKER_MESSAGE|本地用户名|本地IP|当前时间|消息内容(4)发送文件提示 NETWORKER_FILE|本地用户名|本地IP|当前时间|文件名|文件大小描述|文件大小|文件本地路径(5)发送文件夹提示 NETWORKER_FILE|本地用户名|

45、本地IP|当前时间|文件夹名|文件夹大小描述|文件夹大|总文件数 (6)回复命令 YES_OR_NO|本地用户名|本地IP|文件外地路径(7)振动对话框 NETWORKER_JUMP|本地用户名|本地IP3.4.3 数据交互过程在了解数据交互基本思想和工作原理之后,再来看看java是如何将这些数据发送出去的。networker.system包中提供了UDPClient、UDPServer、TCPClient、TCPServer四个类来实现数据交互,从类名可以看出它们分别用于UDP和TCP/IP协议中的c/s模式。它们的实现过程分别为:UDPClient类UDPClient类主要完成程序的UDP

46、通信的客户端工作,系统信息和用户发送的消息都是由它实现的,其中使用最频繁的函数是java UDP通信函数,这里重点提出利用.DatagramSocket类进行报文发送的方法:(1)首先创建一个报文套接字DatagramSocket ds=new DatagramSocket();(2)然后获取发送对象的IP地址InetAddress ia=InetAddress.getByName(ip);(3)创建报文DatagramPacket dp=new DatagramPacket(byte d,int len,ia,int port);(4)最后发送报文并关闭套接字ds.send(dp);ds.c

47、lose();UDPServer类 UDPServer类负责接收其他客户机发送的命令字,对所接收的命令字进行处理,并通知本地终端完成相应动作。接收并处理命令字步骤是:(1)首先开通一个线程监听某一固定端口DatagramSocket ds=new DatagramSocket(port);(2)然后接收命令字:DatagramPacket dp=new DatagramPacket(data,data.length);ds.receive(dp);String str=new String(dp.getData(),0,data.length).trim();(3)最后处理命令字。本程序中自定

48、义了一个函数专门用来处理命令字,即: public void ManageMsg(String msg)以接收的命令字为参数,以分隔符“|”为界限,将这个参数中的信息一一分离出来,程序可以根据获取的有用信息作出相关动作。比如:当其他用户给本地用户发送消息时,本地用户的计算机终端会受到命令字:NETWORKER_MESSAGE|本地用户名|本地IP|当前时间|消息内容利用java.util.StringTokenizer类将该字符串以分隔符“|” 为界限进行拆分可以得到如表3-1所示信息:表3-1拆分命令字NETWORKER_MESSAGE通知计算机收到的时外地用户发送的消息本地用户名是那一台计

49、算机给本地用户发送了消息本地IP获取对方的IP地址,方便回复消息当前时间通知本地用户是什么时间收到的消息消息内容显示在文本接收区,告知用户接收消息的内容TCPServer类TCPServer类主要用于开通文件服务器,向提出请求的客户机发送文件和文件夹,其工作流程如下:(1)首先接收UDPServer的命令开通文件服务器:new ServerSocket ss = new ServerSocket(port);(2)然后等待客户端来建立连接Socket s=ss.accept();(3)最后发送文件或文件夹public void SendFile(String filePath)public v

50、oid SendDirFile(String relapath,String filepath)发送文件和文件夹的原理:本程序通过客户机和服务器套接字的连接进行文件传输,SendFile方法以一个即将发送文件的路径为参数,通过构建DataInputStream获取该文件的输入数据流,通过DataOutputStream获取对方计算机的输出流,将文件名和文件大小写入输出流的头部,然后将输出流传送到对方计算机的套接字上。传送文件夹是一个多次重复传送文件的过程,其中单个文件传输的原理与传送文件的方法类似,区别在于程序会在每个输出流头部写入带相对路径的文件名(比如:JDK1.6.0binjava.ex

51、e)。TCPClient类 TCPClient类主要用于接收文件,其工作流程如下:(1)连接服务器Socket socket = new Socket(host,port);(2)获取输入流DataInputStream d=new DataInputStream(s.getInputStream()(3)读取输入流的头部获取文件名和文件大小;(4)将文件保存在用户指定路径。接收文件夹也是反复接收单个文件的过程,这里不再赘述。3.5 使用外部程序包对于当前程序开发人员没有能力写出,而当前版本JDK开发包中并没提供的API,程序员可以根据需要调用第三方程序包。在本程序设计中,作者本人也得益于第三

52、方程序包的强大功能,才使得程序的结构和功能得到了很大的改进。本程序中共调用了两个外部程序包,它们分别是:用于改变界面皮肤的JTattoo.jar和增强xml文档操作功能的jdom.jar。调用外部程序包的方法分两步:首先从网上下载相应的第三方的程序包,在比较正式的网站(一般指官方网站)下载的程序包通常包含该程序包的源代码、类库、帮助文档和几个典型的使用实例,解压后从中获取该程序包类库(jar格式)。然后将该类库添加到工程的classpath中。添加类库的方法有很多种,在此介绍一下本程序设计中利用eclipse添加类库的方法:右击包资源管理器中选中要添加类库的工程,选取“属性”菜单项,弹出属性设

53、置对话框,在该对话框右侧的树形目录中选择“路径选择”目录,点击“添加Jar文件”按钮,将相应的jar文件加入类库,点击确定按钮即可。3.5.1 美化界面当前,在因特网上关于java的评论非常多,对于它的优点,大家的说法不一,对于它的缺点,大家一致认为java的界面非常丑陋。但在java Swing的世界里有一个lookandfeel的概念,程序员可以通过借助外地第三方程序包来美化自己的界面,而且实现方法十分简单,即: UIManager.setLookAndFeel(lookandfeelname);JTattoo.jar程序包中包含十几个主题,考虑到程序的容量,本程序只使用了其中四个,它们分

54、别是:com.jtattoo.plaf.aero.AeroLookAndFeel(图3-7)图3-7 蓝色主题com.jtattoo.plaf.hifi.HifiLookAndFeel(图3-8)图3-8 黑色主题com.jtattoo.plaf.mcwin.McwinLookAndFeel(图3-9)图3-9 苹果主题com.jtattoo.plaf.mint.MintLookAndFeel(图3-10)图3-10 绿色皮肤3.5.2 Java操作xml文档本程序中有很多的用户自行设定的操作,每次设置完后,程序都要把设置信息保存下来,方便下次程序启动时再把相应值取出,实现预定操作。例如,用户

55、可以根据个人喜爱为程序设置一个皮肤,设置完后程序会把设置信息写入/SystemInfo/system.xml中,下次用户启动程序时,程序会自动检查这个文档,并将程序的皮肤设定为从该文档中获取的配置信息皮肤名。目前,大部分的jdk版本中都支持对xml文档的操作,但使用起来很不方便,而且对中文的支持有许多问题,所以本程序采用了一个很方便使用且功能强大的外部程序包jdom.jar。本文在3.6.1小节中曾经介绍过networker.system.SystemInfo类是通过这个程序包实现其功能的。下面介绍java利用这个程序包读写xml文档的方法:1.向xml文档中写入信息/设置写入编码格式Form

56、at format = Format.getCompactFormat();format.setEncoding(gb2312); format.setIndent( ); /创建文档Element MyRoot=new Element(MyRoot), system=new Element(System);MyRoot.addContent(system);Document doc=new Document(MyRoot);/输出文档XMLOutputter XMLOut = new XMLOutputter(format);fos=new FileOutputStream(path);/p

57、ath指定输出xml文档路径XMLOut.output(doc,fos);2.从xml中读取信息,在读取信息的过程中要捕获异常SAXBuilder builder=new SAXBuilder();Document read_doc=builder.build(xmlpath);Element root=read_doc.getRootElement();List list=root.getChildren(child1);Element e=(Element)list.get(index);String result=e.getChildText(achildtext);3.6 发布程序程序

58、编译成功后,可以通过在命令行写入命令来运行,但考虑到这样使用起来很不方便,所以java程序编译完后通常将.class文件打包成.jar文件,其实.jar格式文件就是java的执行文件,而且它满足了java的跨平台特性。.jar格式文件打包的方式有很多种,这里只介绍本程序利用Eclipse打包的方法,其步骤如下:1. 点击菜单栏文件导出菜单项2. 在弹出的“导出”对话框中选择JAR文件,单击下一步3. 选择要打包的文件和JAR文件输出路径,单击下一步4. 在JAR导出对话框中选择程序的Main类,点击完成,即可生成jar文件将.jar文件的打开方式设置为jre bin目录下的javaw.exe,然后双击jar文件即可执行程序。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!