




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、目 錄1 緒論. 11.1本程序的開發(fā)背景. 11.2開發(fā)環(huán)境. 11.3 java語言.11.4 關(guān)于eclipse. 22 程序結(jié)構(gòu)和設(shè)計思想. 42.1本文解決的主要技術(shù)問題. 42.2程序設(shè)計結(jié)構(gòu). 42.3程序設(shè)計思想. 53 程序分析和具體實現(xiàn). 73.1目錄選擇器. 73.2重要圖形界面模塊的實現(xiàn). 103.3任務(wù)欄托盤圖標(biāo)和任務(wù)欄彈出對話框. 173.4信息收發(fā)和文件傳輸?shù)膶崿F(xiàn). 213.5使用外部程序包. 283.6發(fā)布程序. 331 緒論1.1 本軟件的開發(fā)背景當(dāng)今,是一個信息高度發(fā)達(dá)的時代,計算機無疑已經(jīng)成為網(wǎng)絡(luò)通信的主角,生活節(jié)奏的加快,使得人們對通信速度的要求越來越高
2、。對于在局域網(wǎng)內(nèi)的計算機之間的數(shù)據(jù)交互,尤其是文件傳輸,通常,人們習(xí)慣于通過借助于移動存儲介質(zhì),采取重復(fù)拷貝的方式來實現(xiàn)。這種傳統(tǒng)文件傳輸方式存在諸多缺點,比如:1.消耗時間長,反復(fù)拔插存儲介質(zhì)過程繁瑣;2.文件交互頻繁,加速了計算機病毒的傳播;3.雖然可以通過操作系統(tǒng)實現(xiàn)在局域網(wǎng)內(nèi)的數(shù)據(jù)共享,但終因操作困難而使人們望而卻步。在如此多困難之下,人們不禁會考慮,能不能通過軟件來實現(xiàn)計算機之間的數(shù)據(jù)交互?答案是肯定的。本程序?qū)⑨槍@些問題進(jìn)行設(shè)計。1.2 開發(fā)環(huán)境操作系統(tǒng):microsoft windows xp程序語言:java 2開 發(fā) 包:java(tm) 2 standard editio
3、n (6.0)開發(fā)平臺:eclipse 3.0+swing designer+jre6.01.3 java語言java平臺演進(jìn)到j(luò)ava2后,分別針對不同領(lǐng)域的需求被分成三個版本,亦即j2ee、j2se、j2me。本程序使用j2se。j2se是java的標(biāo)準(zhǔn)版本 (java2 standard edition), 定位在客戶端,主要用于桌面應(yīng)用軟件的編程。j2se 包含那些構(gòu)成java語言核心類庫。java語言區(qū)別于其它編程語言的特點主要有: (1)平臺無關(guān)性(2)安全性 (3)面向?qū)ο?4)分布式(5)鍵壯性本程序中,突出體現(xiàn)了java語言的面向?qū)ο缶幊痰奶攸c,將對象實例化的模式貫穿到了程序
4、設(shè)計的始終,而且嚴(yán)格按照java語言的跨平臺特性設(shè)計程序,完全擺脫了windows操作系統(tǒng)的束縛。1.4 關(guān)于eclipseeclipse 是一個開放源代碼的、基于 java 的可擴(kuò)展開發(fā)平臺。就其本身而言,它只是一個框架和一組服務(wù),用于通過插件組件構(gòu)建開發(fā)環(huán)境。幸運的是,eclipse 附帶了一個標(biāo)準(zhǔn)的插件集,包括 java 開發(fā)工具jdk。雖然大多數(shù)用戶很樂于將 eclipse 當(dāng)作 java ide 來使用,但 eclipse 的目標(biāo)不僅限于此。eclipse 還包括插件開發(fā)環(huán)境(plug-in development environment,pde),這個組件主要針對希望擴(kuò)展 ecli
5、pse 的軟件開發(fā)人員,因為它允許他們構(gòu)建與 eclipse 環(huán)境無縫集成的工具。由于 eclipse 中的每樣?xùn)|西都是插件,對于給 eclipse 提供插件,以及給用戶提供一致和統(tǒng)一的集成開發(fā)環(huán)境而言,所有工具開發(fā)人員都具有同等的發(fā)揮場所。這種平等和一致性并不僅限于 java 開發(fā)工具。盡管 eclipse 是使用 java 語言開發(fā)的,但它的用途并不限于 java 語言;例如,支持諸如 c/c+、cobol 和 eiffel 等編程語言的插件已經(jīng)可用,或預(yù)計會推出。eclipse 框架還可用來作為與軟件開發(fā)無關(guān)的其他應(yīng)用程序類型的基礎(chǔ),比如內(nèi)容管理系統(tǒng)。eclipse 是一個開放源代碼的、
6、基于 java 的可擴(kuò)展開發(fā)平臺。就其本身而言,它只是一個框架和一組服務(wù),用于通過插件組件構(gòu)建開發(fā)環(huán)境。圖1-1為eclipse3.0的編程界面。圖1-1 eclipse3.0的編程界面2 程序結(jié)構(gòu)和設(shè)計思想2.1 本程序需要解決的主要技術(shù)問題1.提供友好的用戶界面2.實現(xiàn)信息收發(fā)3.實現(xiàn)文件傳輸和文件夾傳輸4.為程序添加系統(tǒng)托盤圖標(biāo)5.保存用戶設(shè)置信息2.2 程序設(shè)計結(jié)構(gòu)本程序按照功能可分為兩個層:界面層和網(wǎng)絡(luò)通信層。其中界面層主要采用java swing編程技術(shù)編寫用戶界面,網(wǎng)絡(luò)通信層采用java socket技術(shù)編寫數(shù)據(jù)交互程序。隨程序的容量不斷擴(kuò)大,在同一個目錄下存放所有的代碼和執(zhí)行文
7、件,顯得十分混亂,加大了不必要的工作量。因此,為了方便代碼和其他資源文件的管理,本程序?qū)⑺械拇a文件按功能分為一下幾個功能包,它們實現(xiàn)的功能分別為:networker包:構(gòu)建本程序的主窗體和系統(tǒng)托盤圖標(biāo)networker.about包: 提供用戶幫助信息,介紹程序設(shè)計的相關(guān)信息ponent包: 包含程序設(shè)計中幾個重要的自定義功能組件networker.directorychooser包: 實現(xiàn)目錄選取對話框networker.panels包: 包含了主面板設(shè)計中需要用到的區(qū)域面板networker.panels.filepane包: 用于創(chuàng)建主面板中的文件發(fā)送區(qū)networker.syste
8、m包:完成本程序網(wǎng)絡(luò)通信networker.taskbardialog包:構(gòu)建任務(wù)欄彈出對話框2.3 程序設(shè)計思想網(wǎng)絡(luò)編程的基本模型就是客戶機到服務(wù)器模型,簡單的說就是兩個進(jìn)程之間相互通訊,然后其中一個必須提供一個固定的位置,而另一個則只需要知道這個固定的位置。并去建立兩者之間的聯(lián)系,然后完成數(shù)據(jù)的通訊。這里提供固定位置的通常稱為服務(wù)器,而建立聯(lián)系的通常叫做客戶端。目前,在互聯(lián)網(wǎng)上比較常見的聊天軟件通常都將程序分成兩個部分使用,即客戶機程序和服務(wù)器程序??蛻魴C程序在網(wǎng)上發(fā)布供用戶使用而服務(wù)器程序則只供服務(wù)器使用,一般不公開。采用這種模式可以方便管理員對所有用戶進(jìn)行管理,但它必須單獨提供一臺計算
9、機作為服務(wù)器。而對于在局域網(wǎng)內(nèi)使用的聊天軟件,由于計算機的數(shù)量有限,而且計算機之間的服務(wù)關(guān)系經(jīng)常變化或者根本沒有服務(wù)關(guān)系,采用這種模式就顯得力不從心了。所以,綜合考慮上述因素,本程序在服務(wù)關(guān)系上做了作了一個新的設(shè)計,就是將客戶機程序和服務(wù)器程序綁定在同一個軟件上。當(dāng)程序啟動時,服務(wù)器程序監(jiān)聽各自端口,只負(fù)責(zé)接受來自客戶機的信息并向客戶機發(fā)送文件,客戶機程序只負(fù)責(zé)向服務(wù)器發(fā)送信息并接受來自服務(wù)器的文件。java對c/s模型的支持有很多種api,本程序中運用的java socket編程包含兩個方面:一是基于udp協(xié)議的java datagramsocket和java datagrampacket,
10、二是基于tcp/ip協(xié)議的java socket和java serversocket。java datagramsocket/datagrampacket是包中用于udp通信協(xié)議的類,其中datagramsocket稱為報文套接字,主要用于創(chuàng)建udp通信中的報文套接字并發(fā)送報文,datagrampacket稱為數(shù)據(jù)報,主要用于裝載用戶即將發(fā)送的報文。java中運用這兩個類進(jìn)行udp通信,實現(xiàn)快速的不可靠的簡單數(shù)據(jù)傳輸。本程序中收發(fā)用戶消息和系統(tǒng)消息的工作都由它們來完成。java socket/serversocket是包中用于tcp/ip通信協(xié)議的類,其中socket稱為客戶機套接字,用于創(chuàng)建
11、客戶機程序,serversocket稱為服務(wù)器套接字,用于創(chuàng)建服務(wù)器。java中運用這兩個類進(jìn)行tcp/ip通信,實現(xiàn)面向數(shù)據(jù)鏈接的可靠數(shù)據(jù)傳輸,本程序中收發(fā)文件(文件夾)都是由這兩個類來完成的。由于計算機之間利用java socket進(jìn)行的信息收發(fā)和文件傳輸事先是沒有約定,要完成這些工作必須在程序中制定一個協(xié)議。本程序采用發(fā)送命令字的方式通知計算機完成相應(yīng)工作,具體實現(xiàn)本文將在后面的章節(jié)中作具體介紹。3 程序分析和具體實現(xiàn)3.1 目錄選擇器在當(dāng)前所有版本的jdk中,都沒有實現(xiàn)過windows風(fēng)格的目錄選取對話框,本程序考慮到保存文件的需要,重新定義了一個類似功能的目錄選取對話框,并具有跨平臺
12、特性。其效果圖如圖3-1:圖3-1 目錄選擇器實現(xiàn)目錄選擇器的類文件配置在networker.directorychooser包中,其中包含3個類:(1)treecell類treecell類封裝了一個java.io.file類,并分別通過4個方法返回了該file對象的文件名、文件圖標(biāo)、文件路徑、file類本身。其構(gòu)造函數(shù)如下:public treecell(file f)(2)dctreecellrenderer類dctreecellrenderer類重構(gòu)了樹形組件的節(jié)點ui,它繼承自javax.swing.jpanel,并實現(xiàn)了treecellrenderer接口,重寫方法:public c
13、omponent gettreecellrenderercomponent(jtree tree,object o,boolean sel,boolean ex,boolean leaf, int row,boolean focus)(3)directorychooser類directorychooser實現(xiàn)了目錄選取對話框的主體,它繼承自javax.swing.jdialog類,并實現(xiàn)了接口actionlistener,treeexpansionlistener,其中最重要的組件是樹形組件,它把文件系統(tǒng)所有目錄以樹形結(jié)構(gòu)轉(zhuǎn)化為節(jié)點顯示出來,用戶可以很方便的在樹形組件中瀏覽到文件系統(tǒng)中的所有目
14、錄。在directorychooser中有幾個方法是十分重要的,它們分別是:樹選擇事件:public void valuechanged(treeselectionevent tse)樹展開事件:public void treeexpanded(treeexpansionevent ee)初始化桌面:public void initdesk()為父節(jié)點添加子節(jié)點:public void addchild(defaultmutabletreenode node)這里重點指出顯示對話框并獲取用戶選擇的路徑:程序為directorychooser類定義了兩個靜態(tài)變量/判斷用戶是否點了“確定”按鈕pu
15、blic static boolean choose_flag=false;/提取用戶選取的路徑public static string directory_path=null;顯示對話框時,界面的阻塞狀態(tài),等待用戶的相關(guān)操作,當(dāng)用戶點擊“取消”或者是對話框關(guān)閉按鈕時,choose_flag的值設(shè)為false,除了對話框退出以外,不進(jìn)行任何操作,反之當(dāng)用戶點擊“確定”按鈕時,設(shè)為true,directory_path的值被設(shè)定為相應(yīng)的路徑值,實現(xiàn)語句如下:顯示對話框:public boolean showdialog()setvisible(true);return choose_flag;調(diào)
16、用方法:directorychooser dialog = new directorychooser(frame,title);boolean f=dialog.showdialog();if(f) /獲取選擇路徑system.out.println(directorychooser.directory_path);else ;/什么都不做3.2 重要圖形界面模塊的實現(xiàn)面向?qū)ο缶幊痰淖畲蠛锰幘驮谟趯⒁粋€大型的程序分成若干個模塊來實現(xiàn),而且模塊之間的實現(xiàn)過程一般不會互相影響,哪個模塊出了問題只需修改它本身,而不用改動其他模塊。本程序也毫不例外的運用了面向?qū)ο缶幊痰倪@種特點,下面將一一介紹本程序中
17、用到的程序模塊。3.2.1 在線用戶列表在線用戶列表用于顯示局域網(wǎng)內(nèi)其他在線用戶,它位于主面板的左側(cè),如圖3-2所示:圖3-2 在線用戶列表構(gòu)建在線用戶列表用到了ponents包中的useritem類、userlist類、myrenderer類和neworker.panels包中的userpane類。它們的實現(xiàn)方法分別為:useritem類useritem類是為構(gòu)建在線用戶列表而設(shè)計的類,用來存儲在線用戶信息(用戶名,ip地址,用戶頭像地址),其構(gòu)造函數(shù)為:public useritem (string name,string ipaddress,string imagepath) /name
18、載入用戶名,ipaddress,imagepathuserlist類userlist類是用來存儲在線用戶對象的列表類,它繼承自javax.swing.jlist。在userlist還有很多對用戶對象進(jìn)行操作的方法:添加本地用戶對象: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類重構(gòu)了列表類的列表項,使更復(fù)雜的信息能在jlist中顯示,它繼承自javax.swing.jpanel,并實現(xiàn)了javax.swing. listcellrenderer接口,重寫方法:public component getlistcellrenderercomponent(jlist list, object o, int index, boolean is
20、selected, boolean hasfocus)構(gòu)建myrenderer的意義是十分重大的,jlist在默認(rèn)情況下是不支持顯示多行文本和圖片的,只有通過構(gòu)建一個類,也就是像myrenderer這樣的類,并讓jlist的對象調(diào)用方法:setcellrenderer(new myrenderer()來實現(xiàn)。userpane類userpane類繼承自javax.swing.jpanel類,是裝載userlist的類,它的構(gòu)造函數(shù)為: public userpane(userlist list)3.2.2 文件發(fā)送區(qū)文件發(fā)送區(qū)用于存放即將發(fā)送的文件列表并發(fā)送文件和文件夾,它位于程序主面板的中上部
21、,其效果圖如圖3-3:圖3-3 文件發(fā)送區(qū)文件發(fā)送區(qū)由networker.panels.filepane包實現(xiàn),它包含labelrenderer、fileicon、filetable、mscroll和filepane五個類。在文件發(fā)送區(qū),用戶可以通過兩種方式向文件發(fā)送區(qū)添加發(fā)送對象:1.通過菜單欄或右鍵菜單中“傳送文件”、“傳送文件夾”菜單項或通過工具欄中相應(yīng)圖標(biāo)按鈕打開文件或文件夾選擇器;2.直接在windows資源管理器中將指定文件拖拽至文件發(fā)送區(qū)。filepane包主要圍繞javax.swing.jtable表格類進(jìn)行設(shè)計。labelrenderer類labelrenderer類繼承了j
22、avax.swing.jlabel類,實現(xiàn)了javax.swing.table. tablecellrenderer接口,從而改寫了jtabel表格的單元格,實現(xiàn)了帶圖標(biāo)的單元格。重寫方法:public component gettablecellrenderercomponent(jtable t,object value, boolean isselected,boolean hasfocus,int row,int col)fileicon類fileicon類封裝了一個file類對象,并通過一系列方法獲取該file對象的文件名、文件路徑、文件圖標(biāo)。這里重點提出javax.swing.fi
23、lechooser.filesystemview類,它是處理文件系統(tǒng)的一個很重要的類,在fileicon類中使用方法:imageicon icon=(imageicon)filesystemview.getsystemicon(file)獲取文件的系統(tǒng)圖標(biāo)。filetable類filetable類是filepane包中最重要的一個類,它是裝載文件列表的主體。它繼承了javax.swing.jtabel類,實現(xiàn)了接口droptargetlistener, draggesturelistener, dragsourcelistener, actionlistener。這里重點討論java swin
24、g的拖拽事件。實現(xiàn)組件的拖拽功能,必須讓組件實現(xiàn)droptargetlistener, draggesturelistener, dragsourcelistener接口,完成以下步驟:(1)創(chuàng)建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, 實現(xiàn)droptargetlistener, draggesturelistener, dragsourcelistener接口,用于給filetable添加滾動窗格,為完善filetable的拖拽功能而設(shè)計。在初始狀態(tài)下,filetable中沒有對象,這時拖拽功能不能依靠filetable來實現(xiàn),必須借助一個載體來實現(xiàn)拖拽功能,將發(fā)送對象添加入文件發(fā)送區(qū),而給filetable添加滾動窗格的jscrollpane則是最佳選擇,mscr
26、oll則由此而產(chǎn)生。filepane類:filepane類將文件發(fā)送區(qū)的最終形式添加到程序主面板中,用戶可以在在線用戶列表中選擇一個在線用戶點擊“發(fā)送”按鈕發(fā)送文件,當(dāng)欲發(fā)送對象不在在線用戶列表中時,可以點擊“發(fā)送至”按鈕,在彈出的輸入框中輸入對方的ip地址,即可發(fā)送文件。發(fā)送過程涉及到socket編程,本文在后面的篇幅中再作介紹。3.2.3 文本發(fā)送區(qū)文本發(fā)送區(qū)用于發(fā)送用戶自己輸入的信息,它位于程序主面板的中下部,由networker.panels包中的sendmsgpane類實現(xiàn),其效果圖如圖3-4所示:圖3-4 文本發(fā)送區(qū)sendmsgpane類繼承自javax.swing.jpanel
27、,并實現(xiàn)了actionlistener,itemlistener接口。它是程序中供用戶發(fā)送信息的主要模塊,其中心面板上是一個javax.swing.jtextarea文本域,操作和顯示相對簡單快捷,這里重點講右鍵菜單的用法。(1)右鍵彈出菜單的構(gòu)造函數(shù)jpopupmenu pop=new jpopupmenu();(2)添加菜單項:pop.add(new jmenuitem();(3)為使用右鍵菜單的組件添加鼠標(biāo)事件: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(););各菜單項和按鈕的功能及相關(guān)函數(shù):復(fù)制:textarea.copy();剪切:textarea.cut();粘貼:textarea.paste();全選:textarea.selectedall();清空:textar
29、ea.settext(“”);刪除:這個操作沒有給定方法,用自定義函數(shù)實現(xiàn):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);“發(fā)送”、“發(fā)送至”按鈕的功能同文件發(fā)送區(qū)類似,
30、此外文本發(fā)送區(qū)支持群發(fā)功能,當(dāng)點擊“群發(fā)”按鈕時,程序會給每個在線用戶發(fā)送同一個信息。發(fā)送過程同樣涉及到socket編程,本文在后面的章節(jié)中作進(jìn)一步的介紹。3.2.4超鏈接標(biāo)簽本文在3.2小節(jié)中介紹networker.about.javapage類時,曾經(jīng)提到過超級鏈接標(biāo)簽,它用于實現(xiàn)類似網(wǎng)頁上超級鏈接功能,點擊它,可以利用本地瀏覽器打開一個網(wǎng)頁。ponents.linklabel類實現(xiàn)了這種標(biāo)簽,它繼承自javax.swing.jlabel,并添加了鼠標(biāo)事件,重寫如下方法:public void mouseentered(mouseevent e)public void mouseexite
31、d(mouseevent e)public void mouseclicked(mouseevent e)利用本地瀏覽器打開網(wǎng)頁是jdk6.0中提供的新功能,其基本方法為:desktop.getdesktop().browse(new uri(new url(url);其中url為將要打開網(wǎng)頁的網(wǎng)址;3.3 任務(wù)欄托盤圖標(biāo)和任務(wù)欄彈出對話框3.3.1 任務(wù)欄托盤圖標(biāo)java實現(xiàn)系統(tǒng)托盤圖標(biāo)是sun公司在jdk6.0中新添加功能,它使用的api分別是位于java.awt包中的systemtray和trayicon,其實現(xiàn)方式如下:systemtray tray = systemtray.gets
32、ystemtray();trayicon icon=new trayicon(image,tooltiptext,menu);tray.add(icon);其中,image是一個裝載圖片的image,menu是一個菜單類popupmenu;而tooltiptext則是一個字符串string,當(dāng)鼠標(biāo)放在托盤圖標(biāo)上時,托盤圖標(biāo)會彈出一個解釋框顯示tooltiptext,菜單中的菜單項功能與主窗體的相應(yīng)菜單項功能一致。本程序中的networker.taskbaricon類利用了這些api為程序添加了一個托盤圖標(biāo),其效果圖如圖3-5:圖3-5 托盤圖標(biāo)3.3.2 任務(wù)欄彈出對話框有經(jīng)驗的朋友都知道,我
33、們在使用很多軟件的過程中,經(jīng)常會看到任務(wù)欄托盤的上方會彈出一些提示用戶的對話框,比如:卡巴斯基在檢測到計算機有病毒威脅時,會彈出對話框提示用戶是否清除病毒;騰訊qq報道一些小型新聞也會從任務(wù)欄彈出對話框提示用戶查看;web迅雷在下載完文件或下載失敗時,都會使用相同的方式提示用戶。由于它不會占用用戶太多的屏幕分量,而又達(dá)到了提示用戶的效果,這種方式得到了越來越多用戶和程序員的認(rèn)可。然而在java的世界里,考慮到程序的跨平臺性,目前在所有版本jdk的類庫中都沒有提供實現(xiàn)這種效果的api,幸運的是,java swing的設(shè)計十分巧妙,程序員可以利用其高度的可擴(kuò)展性構(gòu)建符合要求的功能模塊。本程序在ne
34、tworker.taskbardialog包中就利用java中已有的api實現(xiàn)了這種功能,效果圖如圖3-6:圖3-6 任務(wù)欄彈出對話框taskbardialog類taskbardialog類是完成此功能的基類,它繼承自javax.swing.jdialog類,并實現(xiàn)了runnable接口,程序啟動時開通一個線程,通過dialog.setbounds方法不斷改變窗體的大小和位置,當(dāng)窗體達(dá)到目標(biāo)大小和位置時,并使用方法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)然后獲取通過構(gòu)造函數(shù)傳入的參數(shù)(窗體最終大小和任務(wù)欄寬度)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類,并實現(xiàn)了接口java.awt.event. actionlistener。它最終實現(xiàn)了從任務(wù)欄托盤彈出提示對話框的動態(tài)效果,對話框彈出后,用戶可以根據(jù)提示進(jìn)行保存文件的操作,從效果圖上,可以清楚的看到,收到文件的文件名和文件大小,以及供用戶操作
37、的3個按鈕“保存到”、“確定”、“拒絕”,當(dāng)用戶點擊“拒絕”時,對話框退出,程序自動發(fā)送拒絕消息至文件發(fā)送方,通知對方取消操作;當(dāng)用戶點擊“保存到”按鈕時,會彈出目錄選擇對話框,供用戶選擇一個保存目錄,并通知發(fā)送方打開服務(wù)器準(zhǔn)備發(fā)送文件;當(dāng)用戶點擊“確定”按鈕時,程序直接將文件保存在用戶設(shè)定的默認(rèn)保存目錄,其中文件默認(rèn)保存目錄可以通過在主面板“設(shè)置”菜單中的“設(shè)置默認(rèn)存取目錄”菜單項來設(shè)置,taskbardialog包中的defaultsavapath類就是用來完成這個功能的。3.4 信息收發(fā)和文件傳輸?shù)膶崿F(xiàn)networker.system包是完成本程序網(wǎng)絡(luò)通信的中心包,它工作在計算機后臺,不
38、與用戶進(jìn)行交互,但計算機之間的數(shù)據(jù)交互都是由它來完成的,是一個功能巨大默默無聞的net worker。3.4.1 自定義的sys和systeminfo類networker.system包的基本功能都是由sys和systeminfo類提供的,這兩個類中的方法都是靜態(tài)的,程序調(diào)用這些方法只需直接利用類名而不用構(gòu)造它們的對象,大大簡化了本程序網(wǎng)絡(luò)通信設(shè)計的過程。sys類中提供的方法有:獲取系統(tǒng)時間public static string getdate()獲取文件大小常規(guī)表達(dá)public static string getfilelengthexpress(file f)獲取相對目錄public s
39、tatic string getrelativepath(string a,string p)獲取文件或文件夾總大小public static long getlength(file f)獲取局域網(wǎng)所有用戶的ip地址public static string getuserips()systeminfo類主要用于保存程序在使用過程中的配置信息,其中大量使用了外部程序包jdom.jar中java操作xml文檔的api,調(diào)用過程在后面的章節(jié)中再作詳細(xì)介紹。systeminfo類中提供的方法有:設(shè)置和獲取圖像路徑public static void setimagepath(string imagep
40、ath)public static string getimagepath()設(shè)置和獲取用戶名public static void setmyname(string name)public static string getmyname()設(shè)置和獲取皮膚public static void setlookandfeel(string laf)public static string getlookandfeel()設(shè)置默認(rèn)存取路徑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 數(shù)據(jù)交互基本思想和工作原理1.使用網(wǎng)絡(luò)通信協(xié)議考慮到局域網(wǎng)發(fā)生錯誤的可能性很低,本程序中的所有的信息收發(fā)工作都采用udp通信協(xié)議,原因是udp通信速度快,彌補了java程序運行速度的不足;而所有的文件傳輸工作都采用tcp/ip協(xié)議,因為文件傳輸要考慮到安全性,必須保證計算機之間建立連接之后才能
42、進(jìn)行文件傳輸。2.客戶端和服務(wù)器模式(c/s)由于本程序工作在局域網(wǎng)內(nèi)數(shù)量有限的若干臺計算機之間,像目前比較流行的網(wǎng)絡(luò)軟件(比如qq,msn等)一樣使用特定服務(wù)器的可能性不大,所以本程序必須考慮各終端的c/s通信機制。既然不能使用特定服務(wù)器,就要實現(xiàn)網(wǎng)絡(luò)通信,那么每臺計算機終端都必須有c/s程序,也就是說必須在同一臺計算機上同時運行c/s程序。為了保證計算機之間通信不致混亂,本程序合理的安排了c/s程序的任務(wù),即:程序啟動時,服務(wù)器程序監(jiān)聽各自端口,只負(fù)責(zé)接受來自客戶機的信息并向客戶機發(fā)送文件,客戶機程序只負(fù)責(zé)向服務(wù)器發(fā)送信息并接受來自服務(wù)器的文件,如此一來,客戶機和服務(wù)器各司其職,各盡其責(zé),
43、使網(wǎng)絡(luò)通信有條不紊,并且大大簡化了程序設(shè)計的過程。3.使用命令字由于計算機之間進(jìn)行互操作,不可避免的要使用到各種各樣的操作命令,為了區(qū)分它們以用戶信息,程序中設(shè)定了一系列的命令字,如下:首先定義一系列靜態(tài)整形數(shù)字和分隔符: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=|;然后設(shè)定命令字:(1)掃描用戶networker_connect|本地用戶名|本地ip|本地用戶頭像地址 (2)退出連接 networker_exit|本地用戶名|本地ip (3)發(fā)送消息 networker_message|本地用戶名|本地ip|當(dāng)前時間|消息內(nèi)容(4)發(fā)送文件提示 networker_file|本地用戶名|本地ip|當(dāng)前時間|文件名|文件大小描述|文件大小|文件本地路徑(5)發(fā)送文件夾提示 networker_file|本地用戶名|
45、本地ip|當(dāng)前時間|文件夾名|文件夾大小描述|文件夾大|總文件數(shù) (6)回復(fù)命令 yes_or_no|本地用戶名|本地ip|文件外地路徑(7)振動對話框 networker_jump|本地用戶名|本地ip3.4.3 數(shù)據(jù)交互過程在了解數(shù)據(jù)交互基本思想和工作原理之后,再來看看java是如何將這些數(shù)據(jù)發(fā)送出去的。networker.system包中提供了udpclient、udpserver、tcpclient、tcpserver四個類來實現(xiàn)數(shù)據(jù)交互,從類名可以看出它們分別用于udp和tcp/ip協(xié)議中的c/s模式。它們的實現(xiàn)過程分別為:udpclient類udpclient類主要完成程序的udp
46、通信的客戶端工作,系統(tǒng)信息和用戶發(fā)送的消息都是由它實現(xiàn)的,其中使用最頻繁的函數(shù)是java udp通信函數(shù),這里重點提出利用.datagramsocket類進(jìn)行報文發(fā)送的方法:(1)首先創(chuàng)建一個報文套接字datagramsocket ds=new datagramsocket();(2)然后獲取發(fā)送對象的ip地址inetaddress ia=inetaddress.getbyname(ip);(3)創(chuàng)建報文datagrampacket dp=new datagrampacket(byte d,int len,ia,int port);(4)最后發(fā)送報文并關(guān)閉套接字ds.send(dp);ds.c
47、lose();udpserver類 udpserver類負(fù)責(zé)接收其他客戶機發(fā)送的命令字,對所接收的命令字進(jìn)行處理,并通知本地終端完成相應(yīng)動作。接收并處理命令字步驟是:(1)首先開通一個線程監(jiān)聽某一固定端口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、義了一個函數(shù)專門用來處理命令字,即: public void managemsg(string msg)以接收的命令字為參數(shù),以分隔符“|”為界限,將這個參數(shù)中的信息一一分離出來,程序可以根據(jù)獲取的有用信息作出相關(guān)動作。比如:當(dāng)其他用戶給本地用戶發(fā)送消息時,本地用戶的計算機終端會受到命令字:networker_message|本地用戶名|本地ip|當(dāng)前時間|消息內(nèi)容利用java.util.stringtokenizer類將該字符串以分隔符“|” 為界限進(jìn)行拆分可以得到如表3-1所示信息:表3-1拆分命令字networker_message通知計算機收到的時外地用戶發(fā)送的消息本地用戶名是那一臺計
49、算機給本地用戶發(fā)送了消息本地ip獲取對方的ip地址,方便回復(fù)消息當(dāng)前時間通知本地用戶是什么時間收到的消息消息內(nèi)容顯示在文本接收區(qū),告知用戶接收消息的內(nèi)容tcpserver類tcpserver類主要用于開通文件服務(wù)器,向提出請求的客戶機發(fā)送文件和文件夾,其工作流程如下:(1)首先接收udpserver的命令開通文件服務(wù)器:new serversocket ss = new serversocket(port);(2)然后等待客戶端來建立連接socket s=ss.accept();(3)最后發(fā)送文件或文件夾public void sendfile(string filepath)public v
50、oid senddirfile(string relapath,string filepath)發(fā)送文件和文件夾的原理:本程序通過客戶機和服務(wù)器套接字的連接進(jìn)行文件傳輸,sendfile方法以一個即將發(fā)送文件的路徑為參數(shù),通過構(gòu)建datainputstream獲取該文件的輸入數(shù)據(jù)流,通過dataoutputstream獲取對方計算機的輸出流,將文件名和文件大小寫入輸出流的頭部,然后將輸出流傳送到對方計算機的套接字上。傳送文件夾是一個多次重復(fù)傳送文件的過程,其中單個文件傳輸?shù)脑砼c傳送文件的方法類似,區(qū)別在于程序會在每個輸出流頭部寫入帶相對路徑的文件名(比如:jdk1.6.0binjava.ex
51、e)。tcpclient類 tcpclient類主要用于接收文件,其工作流程如下:(1)連接服務(wù)器socket socket = new socket(host,port);(2)獲取輸入流datainputstream d=new datainputstream(s.getinputstream()(3)讀取輸入流的頭部獲取文件名和文件大?。唬?)將文件保存在用戶指定路徑。接收文件夾也是反復(fù)接收單個文件的過程,這里不再贅述。3.5 使用外部程序包對于當(dāng)前程序開發(fā)人員沒有能力寫出,而當(dāng)前版本jdk開發(fā)包中并沒提供的api,程序員可以根據(jù)需要調(diào)用第三方程序包。在本程序設(shè)計中,作者本人也得益于第三
52、方程序包的強大功能,才使得程序的結(jié)構(gòu)和功能得到了很大的改進(jìn)。本程序中共調(diào)用了兩個外部程序包,它們分別是:用于改變界面皮膚的jtattoo.jar和增強xml文檔操作功能的jdom.jar。調(diào)用外部程序包的方法分兩步:首先從網(wǎng)上下載相應(yīng)的第三方的程序包,在比較正式的網(wǎng)站(一般指官方網(wǎng)站)下載的程序包通常包含該程序包的源代碼、類庫、幫助文檔和幾個典型的使用實例,解壓后從中獲取該程序包類庫(jar格式)。然后將該類庫添加到工程的classpath中。添加類庫的方法有很多種,在此介紹一下本程序設(shè)計中利用eclipse添加類庫的方法:右擊包資源管理器中選中要添加類庫的工程,選取“屬性”菜單項,彈出屬性設(shè)置對話框,在該對話框右側(cè)的樹形目錄中選擇“路徑選擇”目錄,點擊“添加jar文件”按鈕,將相應(yīng)的jar文件加入類庫,點擊確定按鈕即可。3.5.1 美化界
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 創(chuàng)業(yè)合伙人分紅合同范本
- 農(nóng)村燃?xì)獍惭b合同范本
- 企業(yè)常用合同范本庫
- 別墅精裝修包工合同范本
- 勞動合同范本(社保)
- 勞動保密合同范例
- 北辰區(qū)勞務(wù)派遣合同范本
- 農(nóng)村鄰里土地糾紛合同范本
- 加工定做設(shè)備合同范本
- 勞動咨詢合同范本
- 2025年湖南城建職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫新版
- 企業(yè)級軟件開發(fā)作業(yè)指導(dǎo)書
- 《中國古代文學(xué)史及作品選II》教學(xué)大綱
- 代工生產(chǎn)合同范本
- 瑜伽課程合同轉(zhuǎn)讓協(xié)議書范本
- 個人經(jīng)營性貸款合同模板
- 人教版英語2025七年級下冊 Unit1Animal Friends教師版 語法講解+練習(xí)
- DeepSeek新手入門教程
- 課件:《教育強國建設(shè)規(guī)劃綱要(2024-2035年)》學(xué)習(xí)宣講
- 2025年山東化工職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測試近5年常考版參考題庫含答案解析
- 2025年全國幼兒園教師資格證考試教育理論知識押題試題庫及答案(共九套)
評論
0/150
提交評論