首页 飞鸽传书(java版)

飞鸽传书(java版)

举报
开通vip

飞鸽传书(java版)目 录 1 绪论.................................................... 1 1.1本程序的开发背景........................................ 1 1.2开发环境................................................ 1 1.3 Java语言................................................1 1.4 关于Eclipse...

飞鸽传书(java版)
目 录 1 绪论.................................................... 1 1.1本程序的开发背景........................................ 1 1.2开发环境................................................ 1 1.3 Java语言................................................1 1.4 关于Eclipse............................................ 2 2 程序结构和 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 思想...................................... 4 2.1本文解决的主要技术问题.................................. 4 2.2程序设计结构............................................ 4 2.3程序设计思想............................................ 5 3 程序 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 和具体实现...................................... 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 开发环境 操作系统:Microsoft Windows XP 程序语言:Java 2 开 发 包:Java(TM) 2 Standard Edition (6.0) 开发平台:Eclipse 3.0+Swing Designer+JRE6.0 1.3 Java语言 Java平台演进到Java2后,分别针对不同领域的需求被分成三个版本,亦即J2EE、J2SE、J2ME。本程序使用J2SE。 J2SE是Java的 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 版本 (Java2 Standard Edition), 定位在客户端,主要用于桌面应用软件的编程。J2SE 包含那些构成Java语言核心类库。 Java语言区别于其它编程语言的特点主要有: (1)平台无关性 (2)安全性 (3)面向对象 (4)分布式 (5)键壮性 本程序中,突出体现了Java语言的面向对象编程的特点,将对象实例化的模式贯穿到了程序设计的始终,而且严格按照Java语言的跨平台特性设计程序,完全摆脱了windows操作系统的束缚。 1.4 关于Eclipse Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括 Java 开发工具JDK。 虽然大多数用户很乐于将 Eclipse 当作 Java IDE 来使用,但 Eclipse 的目标不仅限于此。Eclipse 还包括插件开发环境(Plug-in Development Environment,PDE),这个组件主要针对希望扩展 Eclipse 的软件开发人员,因为它允许他们构建与 Eclipse 环境无缝集成的工具。由于 Eclipse 中的每样东西都是插件,对于给 Eclipse 提供插件,以及给用户提供一致和统一的集成开发环境而言,所有工具开发人员都具有同等的发挥场所。 这种平等和一致性并不仅限于 Java 开发工具。尽管 Eclipse 是使用 Java 语言开发的,但它的用途并不限于 Java 语言;例如,支持诸如 C/C++、COBOL 和 Eiffel 等编程语言的插件已经可用,或预计会推出。Eclipse 框架还可用来作为与软件开发无关的其他应用程序类型的基础,比如 内容 财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容 管理系统。Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。图1-1为Eclipse3.0的编程界面。 图1-1 Eclipse3.0的编程界面 2 程序结构和设计思想 2.1 本程序需要解决的主要技术问题 1.提供友好的用户界面 2.实现信息收发 3.实现文件传输和文件夹传输 4.为程序添加系统托盘图标 5.保存用户设置信息 2.2 程序设计结构 本程序按照功能可分为两个层:界面层和网络通信层。其中界面层主要采用Java Swing编程技术编写用户界面,网络通信层采用Java Socket技术编写数据交互程序。随程序的容量不断扩大,在同一个目录下存放所有的代码和执行文件,显得十分混乱,加大了不必要的工作量。因此,为了方便代码和其他资源文件的管理,本程序将所有的代码文件按功能分为一下几个功能包,它们实现的功能分别为: networker包: 构建本程序的主窗体和系统托盘图标 networker.about包: 提供用户帮助信息,介绍程序设计的相关信息 networker.component包: 包含程序设计中几个重要的自定义功能组件 networker.directorychooser包: 实现目录选取对话框 networker.panels包: 包含了主面板设计中需要用到的区域面板 networker.panels.filepane包: 用于创建主面板中的文件发送区 networker.system包: 完成本程序网络通信 networker.taskbardialog包: 构建任务栏弹出对话框 2.3 程序设计思想 网络编程的基本模型就是客户机到服务器模型,简单的说就是两个进程之间相互通讯,然后其中一个必须提供一个固定的位置,而另一个则只需要知道这个固定的位置。并去建立两者之间的联系,然后完成数据的通讯。这里提供固定位置的通常称为服务器,而建立联系的通常叫做客户端。 目前,在互联网上比较常见的聊天软件通常都将程序分成两个部分使用,即客户机程序和服务器程序。客户机程序在网上发布供用户使用而服务器程序则只供服务器使用,一般不公开。采用这种模式可以方便管理员对所有用户进行管理,但它必须单独提供一台计算机作为服务器。而对于在局域网内使用的聊天软件,由于计算机的数量有限,而且计算机之间的服务关系经常变化或者根本没有服务关系,采用这种模式就显得力不从心了。所以,综合考虑上述因素,本程序在服务关系上做了作了一个新的设计,就是将客户机程序和服务器程序绑定在同一个软件上。当程序启动时,服务器程序监听各自端口,只负责接受来自客户机的信息并向客户机发送文件,客户机程序只负责向服务器发送信息并接受来自服务器的文件。 Java对C/S模型的支持有很多种API,本程序中运用的Java Socket编程包含两个方面:一是基于UDP 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 的Java DatagramSocket和Java DatagramPacket,二是基于TCP/IP协议的Java Socket和Java ServerSocket。Java DatagramSocket/DatagramPacket是java.net包中用于UDP通信协议的类,其中DatagramSocket称为报文套接字,主要用于创建UDP通信中的报文套接字并发送报文,DatagramPacket称为数据报,主要用于装载用户即将发送的报文。Java中运用这两个类进行UDP通信,实现快速的不可靠的简单数据传输。本程序中收发用户消息和系统消息的工作都由它们来完成。Java Socket/ServerSocket是java.net包中用于TCP/IP通信协议的类,其中Socket称为客户机套接字,用于创建客户机程序,ServerSocket称为服务器套接字,用于创建服务器。Java中运用这两个类进行TCP/IP通信,实现面向数据链接的可靠数据传输,本程序中收发文件(文件夹)都是由这两个类来完成的。 由于计算机之间利用Java Socket进行的信息收发和文件传输事先是没有约定,要完成这些工作必须在程序中制定一个协议。本程序采用发送命令字的方式通知计算机完成相应工作,具体实现本文将在后面的章节中作具体介绍。 3 程序分析和具体实现 3.1 目录选择器 在当前所有版本的JDK中,都没有实现过windows风格的目录选取对话框,本程序考虑到保存文件的需要,重新定义了一个类似功能的目录选取对话框,并具有跨平台特性。其效果图如图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 Component getTreeCellRendererComponent(JTree tree,Object o,boolean sel,boolean ex,boolean leaf, int row,boolean focus) (3)DirectoryChooser类 DirectoryChooser实现了目录选取对话框的主体,它继承自javax.swing.JDialog类,并实现了接口ActionListener,TreeExpansionListener,其中最重要的组件是树形组件,它把文件系统所有目录以树形结构转化为节点显示出来,用户可以很方便的在树形组件中浏览到文件系统中的所有目录。在DirectoryChooser中有几个方法是十分重要的,它们分别是: 树选择事件: public void valueChanged(TreeSelectionEvent tse) 树展开事件: public void treeExpanded(TreeExpansionEvent ee) 初始化桌面: public void initDesk() 为父节点添加子节点: public void addChild(DefaultMutableTreeNode node) 这里重点指出显示对话框并获取用户选择的路径: 程序为DirectoryChooser类定义了两个静态变量 //判断用户是否点了“确定”按钮 public 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; } 调用方法: DirectoryChooser dialog = new DirectoryChooser(frame,title); boolean f=dialog.ShowDialog(); if(f) //获取选择路径 System.out.println(DirectoryChooser.DIRECTORY_PATH); else ;//什么都不做 3.2 重要图形界面模块的实现 面向对象编程的最大好处就在于将一个大型的程序分成若干个模块来实现,而且模块之间的实现过程一般不会互相影响,哪个模块出了问题只需修改它本身,而不用改动其他模块。本程序也毫不例外的运用了面向对象编程的这种特点,下面将一一介绍本程序中用到的程序模块。 3.2.1 在线用户列表 在线用户列表用于显示局域网内其他在线用户,它位于主面板的左侧,如图3-2所示: 图3-2 在线用户列表 构建在线用户列表用到了networker.components包中的UserItem类、UserList类、MyRenderer类和neworker.panels包中的UserPane类。它们的实现方法分别为: UserItem类 UserItem类是为构建在线用户列表而设计的类,用来存储在线用户信息(用户名,IP地址,用户头像地址),其构造函数为: public UserItem (String name,String ipaddress,String imagepath) //name载入用户名,ipaddress,imagepath UserList类 UserList类是用来存储在线用户对象的列表类,它继承自javax.swing.JList。在UserList还有很多对用户对象进行操作的方法: 添加本地用户对象: public void addMe() 添加用户: public void addUser(UserItem item) 删除指定用户: public void removeUser(String username) 获取选中用户的用户名: public String getSelectedUserName() 获取所有在线用户的IP地址: public String[] getAllIPs() 删除所有用户对象: 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 isSelected, boolean hasFocus) 构建MyRenderer的意义是十分重大的,JList在默认情况下是不支持显示多行文本和图片的,只有通过构建一个类,也就是像MyRenderer这样的类,并让JList的对象调用方法: setCellRenderer(new MyRenderer())来实现。 UserPane类 UserPane类继承自javax.swing.JPanel类,是装载UserList的类,它的构造函数为: public UserPane(UserList list) 3.2.2 文件发送区 文件发送区用于存放即将发送的文件列表并发送文件和文件夹,它位于程序主面板的中上部,其效果图如图3-3: 图3-3 文件发送区 文件发送区由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表格的单元格,实现了带图标的单元格。重写方法: public Component getTableCellRendererComponent(JTable t,Object value, boolean isSelected,boolean hasFocus,int row,int col) FileIcon类 FileIcon类封装了一个File类对象,并通过一系列方法获取该File对象的文件名、文件路径、文件图标。这里重点提出javax.swing.filechooser.FileSystemView类,它是处理文件系统的一个很重要的类,在FileIcon类中使用方法: ImageIcon icon=(ImageIcon)FileSystemView.getSystemIcon(file)获取文件的系统图标。 FileTable类 FileTable类是filepane包中最重要的一个类,它是装载文件列表的主体。它继承了javax.swing.JTabel类,实现了接口DropTargetListener, DragGestureListener, DragSourceListener, ActionListener。这里重点讨论java swing的拖拽事件。实现组件的拖拽功能,必须让组件实现DropTargetListener, DragGestureListener, DragSourceListener接口,完成以下步骤: (1)创建DragSource DragSource dragSource = new DragSource(); dragSource.createDefaultDragGestureRecognizer(this, DnDConstants.ACTION_COPY_OR_MOVE, this); public void drop(DropTargetDropEvent dtde){} (2)重写拖拽事件方法 public void drop(DropTargetDropEvent dtde){} 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类实现,其效果图如图3-4所示: 图3-4 文本发送区 SendMsgPane类继承自javax.swing.JPanel,并实现了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 (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(); 清空:textarea.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); “发送”、“发送至”按钮的功能同文件发送区类似,此外文本发送区支持群发功能,当点击“群发”按钮时,程序会给每个在线用户发送同一个信息。发送过程同样涉及到socket编程,本文在后面的章节中作进一步的介绍。 3.2.4超链接标签 本文在3.2小节中介绍networker.about.JavaPage类时,曾经提到过超级链接标签,它用于实现类似网页上超级链接功能,点击它,可以利用本地浏览器打开一个网页。networker.components.LinkLabel类实现了这种标签,它继承自javax.swing.JLabel,并添加了鼠标事件,重写如下方法: public void mouseEntered(MouseEvent e) public void mouseExited(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.getSystemTray(); 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 任务栏弹出对话框 有经验的朋友都知道,我们在使用很多软件的过程中,经常会看到任务栏托盘的上方会弹出一些提示用户的对话框,比如:卡巴斯基在检测到计算机有病毒威胁时,会弹出对话框提示用户是否清除病毒;腾讯QQ报道一些小型新闻也会从任务栏弹出对话框提示用户查看;web迅雷在下载完文件或下载失败时,都会使用相同的方式提示用户。由于它不会占用用户太多的屏幕分量,而又达到了提示用户的效果,这种方式得到了越来越多用户和程序员的认可。 然而在java的世界里,考虑到程序的跨平台性,目前在所有版本JDK的类库中都没有提供实现这种效果的API,幸运的是,Java Swing的设计十分巧妙,程序员可以利用其高度的可扩展性构建符合要求的功能模块。本程序在networker.taskbardialog包中就利用Java中已有的API实现了这种功能,效果图如图3-6: 图3-6 任务栏弹出对话框 TaskBarDialog类 TaskBarDialog类是完成此功能的基类,它继承自javax.swing.Jdialog类,并实现了Runnable接口,程序启动时开通一个线程,通过dialog.setBounds方法不断改变窗体的大小和位置,当窗体达到目标大小和位置时,并使用方法SwingUtilities.updateComponentTreeUI(this) 刷新界面,具体操作步骤如下: (1)首先获取屏幕大小 Toolkit t=Toolkit.getDefaultToolkit(); 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(i>height) flag=false; } SwingUtilities.updateComponentTreeUI(this); (4)显示对话框 public void showDialog(){ setVisible(true); Thread t=new Thread(this); t.start(); } ShowFileDialog类和DefaultSavaPath类 ShowFileDialog类继承了TaskBarDialog类,并实现了接口java.awt.event. ActionListener。它最终实现了从任务栏托盘弹出提示对话框的动态效果,对话框弹出后,用户可以根据提示进行保存文件的操作,从效果图上,可以清楚的看到,收到文件的文件名和文件大小,以及供用户操作的3个按钮“保存到”、“确定”、“拒绝”,当用户点击“拒绝”时,对话框退出,程序自动发送拒绝消息至文件发送方,通知对方取消操作;当用户点击“保存到”按钮时,会弹出目录选择对话框,供用户选择一个保存目录,并通知发送方打开服务器准备发送文件;当用户点击“确定”按钮时,程序直接将文件保存在用户设定的默认保存目录,其中文件默认保存目录可以通过在主面板“设置”菜单中的“设置默认存取目录”菜单项来设置,taskbardialog包中的DefaultSavaPath类就是用来完成这个功能的。 3.4 信息收发和文件传输的实现 networker.system包是完成本程序网络通信的中心包,它工作在计算机后台,不与用户进行交互,但计算机之间的数据交互都是由它来完成的,是一个功能巨大默默无闻的net worker。 3.4.1 自定义的Sys和SystemInfo类 networker.system包的基本功能都是由Sys和SystemInfo类提供的,这两个类中的方法都是静态的,程序调用这些方法只需直接利用类名而不用构造它们的对象,大大简化了本程序网络通信设计的过程。 Sys类中提供的方法有: 获取系统时间 public static String getDate() 获取文件大小常规表达 public static String getFileLengthExpress(File f) 获取相对目录 public static 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 imagepath) 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 getDefaultSavePath() 添加和获取好友列表 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协议,因为文件传输要考虑到安全性,必须保证计算机之间建立连接之后才能进行文件传输。 2.客户端和服务器模式(C/S) 由于本程序工作在局域网内数量有限的若干台计算机之间,像目前比较流行的网络软件(比如QQ,MSN等)一样使用特定服务器的可能性不大,所以本程序必须考虑各终端的C/S通信机制。 既然不能使用特定服务器,就要实现网络通信,那么每台计算机终端都必须有C/S程序,也就是说必须在同一台计算机上同时运行C/S程序。为了保证计算机之间通信不致混乱,本程序合理的安排了C/S程序的任务,即:程序启动时,服务器程序监听各自端口,只负责接受来自客户机的信息并向客户机发送文件,客户机程序只负责向服务器发送信息并接受来自服务器的文件,如此一来,客户机和服务器各司其职,各尽其责,使网络通信有条不紊,并且大大简化了程序设计的过程。 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, 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|本地用户名|本地IP|当前时间|文件夹名|文件夹大小描述|文件夹大|总文件数 (6)回复命令 YES_OR_NO|本地用户名|本地IP|文件外地路径 (7)振动对话框 NETWORKER_JUMP|本地用户名|本地IP 3.4.3 数据交互过程 在了解数据交互基本思想和工作原理之后,再来看看java是如何将这些数据发送出去的。networker.system包中提供了UDPClient、UDPServer、TCPClient、TCPServer四个类来实现数据交互,从类名可以看出它们分别用于UDP和TCP/IP协议中的c/s模式。它们的实现过程分别为: UDPClient类 UDPClient类主要完成程序的UDP通信的客户端工作,系统信息和用户发送的消息都是由它实现的,其中使用最频繁的函数是java UDP通信函数,这里重点提出利用java.net.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.close(); 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)最后处理命令字。本程序中自定义了一个函数专门用来处理命令字,即: public void ManageMsg(String msg) 以接收的命令字为参数,以分隔符“|”为界限,将这个参数中的信息一一分离出来,程序可以根据获取的有用信息作出相关动作。比如:当其他用户给本地用户发送消息时,本地用户的计算机终端会受到命令字: NETWORKER_MESSAGE|本地用户名|本地IP|当前时间|消息内容 利用java.util.StringTokenizer类将该字符串以分隔符“|” 为界限进行拆分可以得到如表3-1所示信息: 表3-1拆分命令字 NETWORKER_MESSAGE 通知计算机收到的时外地用户发送的消息 本地用户名 是那一台计算机给本地用户发送了消息 本地IP 获取对方的IP地址,方便回复消息 当前时间 通知本地用户是什么时间收到的消息 消息内容 显示在文本接收区,告知用户接收消息的内容 TCPServer类 TCPServer类主要用于开通文件服务器,向提出请求的客户机发送文件和文件夹,其工作流程如下: (1)首先接收UDPServer的命令开通文件服务器: new ServerSocket ss = new ServerSocket(port); (2)然后等待客户端来建立连接 Socket s=ss.accept(); (3)最后发送文件或文件夹 public void SendFile(String filePath) public void SendDirFile(String relapath,String filepath) 发送文件和文件夹的原理:本程序通过客户机和服务器套接字的连接进行文件传输,SendFile方法以一个即将发送文件的路径为参数,通过构建DataInputStream获取该文件的输入数据流,通过DataOutputStream获取对方计算机的输出流,将文件名和文件大小写入输出流的头部,然后将输出流传送到对方计算机的套接字上。 传送文件夹是一个多次重复传送文件的过程,其中单个文件传输的原理与传送文件的方法类似,区别在于程序会在每个输出流头部写入带相对路径的文件名(比如:JDK1.6.0\bin\java.exe)。 TCPClient类 TCPClient类主要用于接收文件,其工作流程如下: (1)连接服务器 Socket socket = new Socket(host,port); (2)获取输入流 DataInputStream d=new DataInputStream(s.getInputStream()) (3)读取输入流的头部获取文件名和文件大小; (4)将文件保存在用户指定路径。 接收文件夹也是反复接收单个文件的过程,这里不再赘述。 3.5 使用外部程序包 对于当前程序开发人员没有能力写出,而当前版本JDK开发包中并没提供的API,程序员可以根据需要调用第三方程序包。在本程序设计中,作者本人也得益于第三方程序包的强大功能,才使得程序的结构和功能得到了很大的改进。 本程序中共调用了两个外部程序包,它们分别是:用于改变界面皮肤的JTattoo.jar和增强xml文档操作功能的jdom.jar。调用外部程序包的方法分两步:首先从网上下载相应的第三方的程序包,在比较正式的网站(一般指官方网站)下载的程序包通常包含该程序包的源代码、类库、帮助文档和几个典型的使用实例,解压后从中获取该程序包类库(jar格式)。然后将该类库添加到工程的classpath中。 添加类库的方法有很多种,在此介绍一下本程序设计中利用eclipse添加类库的方法:右击包资源管理器中选中要添加类库的工程,选取“属性”菜单项,弹出属性设置对话框,在该对话框右侧的树形目录中选择“路径选择”目录,点击“添加Jar文件”按钮,将相应的jar文件加入类库,点击确定按钮即可。 3.5.1 美化界面 当前,在因特网上关于java的评论非常多,对于它的优点,大家的说法不一,对于它的缺点,大家一致认为java的界面非常丑陋。但在java Swing的世界里有一个lookandfeel的概念,程序员可以通过借助外地第三方程序包来美化自己的界面,而且实现方法十分简单,即: UIManager.setLookAndFeel(lookandfeelname); JTattoo.jar程序包中包含十几个主题,考虑到程序的容量,本程序只使用了其中四个,它们分别是: 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文档 本程序中有很多的用户自行设定的操作,每次设置完后,程序都要把设置信息保存下来,方便下次程序启动时再把相应值取出,实现预定操作。例如,用户可以根据个人喜爱为程序设置一个皮肤,设置完后程序会把设置信息写入/SystemInfo/system.xml中,下次用户启动程序时,程序会自动检查这个文档,并将程序的皮肤设定为从该文档中获取的配置信息皮肤名。 目前,大部分的jdk版本中都支持对xml文档的操作,但使用起来很不方便,而且对中文的支持有许多问题,所以本程序采用了一个很方便使用且功能强大的外部程序包jdom.jar。本文在3.6.1小节中曾经介绍过networker.system.SystemInfo类是通过这个程序包实现其功能的。下面介绍java利用这个程序包读写xml文档的方法: 1.向xml文档中写入信息 //设置写入编码格式 Format 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);//path指定输出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 发布程序 程序编译成功后,可以通过在命令行写入命令来运行,但考虑到这样使用起来很不方便,所以java程序编译完后通常将.class文件打包成.jar文件,其实.jar格式文件就是java的执行文件,而且它满足了java的跨平台特性。.jar格式文件打包的方式有很多种,这里只介绍本程序利用Eclipse打包的方法,其步骤如下: 1. 点击菜单栏文件-》导出菜单项 2. 在弹出的“导出”对话框中选择JAR文件,单击下一步 3. 选择要打包的文件和JAR文件输出路径,单击下一步 4. 在JAR导出对话框中选择程序的Main类,点击完成,即可生成jar文件 将.jar文件的打开方式设置为jre bin目录下的javaw.exe,然后双击jar文件即可执行程序。
本文档为【飞鸽传书(java版)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_155940
暂无简介~
格式:doc
大小:570KB
软件:Word
页数:35
分类:互联网
上传时间:2012-12-12
浏览量:36