【正文】
Object Pascal 語言是在 Pascal 語言的基礎(chǔ)上發(fā)展起來的,簡單易學??蛻舳瞬? 服務器主機 客戶機 A 客戶機 B 客戶機 C 客戶機 N 第 4 頁 共 26頁 需要指定打開的端口 。 綜上所述 ,依靠 Inter 網(wǎng)絡(luò)等方式實現(xiàn)文件資源交互的 準確性,快速性及 安全性遠達不到理想的要求。文件傳輸需要建立有效的連接后,通 第 5 頁 共 26頁 過 TCP/IP 協(xié)議實現(xiàn)點對點的文件傳輸。 //新用戶上線 以 LOGIN 為頭信息 var wsadata:twsadata。 //獲取主機名 myname:=strpas(pmyname)。 。 (myinfobuf,9000)。,[39。 mylogoutinfo:string。 // 廣播自己離線信息 。 Ind : Integer。 := RESOURCETYPE_DISK。//資源列舉完畢 If (Res NO_ERROR) then Exit。 Res := WNetCloseEnum(lphEnum)。 var readbuf:array[0..2030]of char。 head:=trim(copy(msg,1,headlen))。 recvname:=copy(msg,headlen+1,namelen)。,myname,myworkgroup])。)。)。LOGOUT39。 lphEnum : THandle。 //得到網(wǎng)絡(luò)中的所有工作組的名稱 If Res NO_ERROR Then exit。 For I := 0 To Count 1 Do //列舉各個工作組的信息 Begin ( StrPAS( P^.lpRemoteName )) 。 FreeMem(Buf)。直到文件傳輸完畢關(guān)閉套節(jié)字連接并釋放空間。連接成功后發(fā)送文件流。提示 39。 end。 //表示創(chuàng)建線程后立刻執(zhí)行 end。 //創(chuàng)建文件流和文件建立關(guān)聯(lián)設(shè)置 //參 數(shù) fmopenread=file mode openread try (39。 end。 //服務器端 ... var cmd,tmpfn,msg,targetname,localdir,:string。 // (cmd)。 getmem(hostname,255)。 end。 if lsize=0 then begin disconnect。START39。 if not directoryexists(localdir) then createdir(localdir)。 exit。 end。 如果用戶忘記選擇文件接收者,系統(tǒng)彈出提示框“請選擇消息接收者”,然后打開本地文件路徑, 并將本地文件夾路徑得出來 。 var dir:string。,39。 第 17 頁 共 26頁 文件夾選取以后 調(diào)用 (toip,dir)建立文件夾傳輸流, 其源代碼如下: 文件夾傳輸流建立以后,由函數(shù) inherited create(false)提示立刻執(zhí)行文件傳輸流函數(shù) 。 // Fremotename:=remotename。我的電腦 39。\39。 var csocket:tidtcpclient。)。 finally 。*.*39。 putfile(localfile,Iremotefile)。 end。 Sfilename:string。START39。 end。 var cmd,tmpfn,msg,targetname,localdir,:string。 if cmd=39。 then Savedir:=Savedir+39。 end else writeln(39。\39。 //本地文件 名 writeln(39。 readstream(fs,lsize)。文件傳輸完畢關(guān)閉套節(jié)字連接。 savedir,cmd,tempdir:string。)。 then Savedir:=Savedir+39。 end。 C. 對窗體設(shè)計中有大量需要改進的地方。 經(jīng)過這幾個月畢 業(yè)設(shè)計的制作, 我 確實學到了大量網(wǎng)絡(luò)通訊方面的知識,同時也對自己知識的欠缺有了深刻的認識。 [5]施新剛 .Delphi實效編程百例 [M]. 北京 :人民郵電出版社 ,2021。 [3]鮑敏 ,吳昊 .Delphi 網(wǎng)絡(luò)高級編程 [M]. 北京 :人民郵電出版 ,2021。 通過測試和試用,我發(fā)現(xiàn)該系統(tǒng)還存在以下的問題: 如果軟件運行環(huán)境安裝有防火墻,用戶列表中工作組的顯示可能會出現(xiàn)異常; 整個系統(tǒng)功能不夠全面,比如說不能實現(xiàn)文件的斷點傳輸; 操作界面的問題:盡管在設(shè)計的過程中,我時刻考慮到了操作界面的友好性,但做出的系統(tǒng)友好性仍不高。 由于時間倉促,一些技術(shù)和設(shè)備所限,本系統(tǒng)依然存在大量不足之處,有待進一 步改進和完善,具體說來有: A. 如果系統(tǒng)運行環(huán)境 WINDOWS系統(tǒng)裝有防火墻有可能導致服務列表中工作組的顯示出現(xiàn)問題。 //取得本地磁盤路徑 move(localpath[1],localroot^,length(localpath))。,Savedir)=true then begin if trim(copy(Savedir,length(Savedir),1))39。 取得文件夾名字 // ldir:=split(string(filename),39。否則用戶選擇文Procedure (var msg:tmessage)。 文件傳輸系統(tǒng)在 WINDOWS 操作系統(tǒng)下,以 C/S 的模式客戶端主動向服務器端發(fā)送 SOCKET 套節(jié)字連接請求后,服務器收到連接請求后對其進行響應并初始化臨時內(nèi)存空間,建立連接。 end。 //創(chuàng)建接收到的文件夾下邊的文件夾 end。then begin msg:=readln()。TRUE39。,Savedir)=true then begin if trim(copy(Savedir,length(Savedir),1))39。 lSavePath,Savedir:String。 end。then begin (inttostr(lsize))。 if then begin lstream:=(localname,fmopenread)。 2)服務器端接收到文件夾傳輸請求以后,初始化分配臨時空間,獲取 文 件夾基本信息。 until FindNext(F)0。 localfile:=localdir+。 Iremotefile,localfile:string。then 。 if then 第 18 頁 共 26頁 begin (39。 end。 for i:=0 to high(rdir)1 do begin remotefilename:=remotefilename+rdir[i]。目錄文 件夾 39。 begin FIP:=IP。 Dir := 39。 if (not assigned(tempItem)) or (tempItem=nil) then begin MessageBox( ,39。 end。其過程同樣的分為服務器與客戶口端兩部分:首先是客戶口端向 服務器發(fā)送連接請求,服務器響應后建立連接實現(xiàn)文件傳輸 。 end。 //發(fā)送開始信號 lsize:=strtointdef(readln,0)。 for i:=0 to high(ldir)1 do begin localdir:=localdir+ldir[i]+39。 end。)。 //post fname and size move(FFileName[1],pname^,length(FFileName))。 //寫入文件 finally 。 lSavePath,Savedir:String。當傳輸完畢后斷開連接。 //獲 取文件名 ([1],extractfilename(filename))。 //寫入 IP ()。 FreeonTerminate:=true。 //顯示在線人數(shù) var f:textfile。請選擇消息接收者! 39。在 機的 IP及端口號。 源代碼如下: 文件 以及文件夾 傳輸功能是本設(shè)計能夠?qū)崿F(xiàn)的理論核心。//執(zhí)行失敗 End。 //獲取計算機名稱 If ( Res = ERROR_NO_MORE_ITEMS ) //資源列舉完畢 or (Res NO_ERROR) //執(zhí)行失敗 then break。 //獲取局域網(wǎng)中的工作組信息 。 //初始化網(wǎng)絡(luò)層次信息 Buf : Pointer。 END。 THEN //處理握手信息 添加對方 ip 返回對方 ip BEgin // (39。then //添加對方返回的自己的 ip (對比 ) begin // (39。,[39。login recv39。 msg:=Trim(String(Pchar(Readbuf[0])))。 AData: TStream。 End。//申請內(nèi)存,用于獲取工作組信息 /獲取計算機名稱 Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize)。////初始化網(wǎng)絡(luò)層次信息 := RESOURCEDISPLAYTYPE_SERVER。 Buf : Pointer。 strpcopy(mylogoutbuf,mylogoutinfo)。 procedure (Sender: TObject)。 begin minfo:=format(39。,myname,myworkgroup])。 //獲 本機工作 組 end。 //把程序圖標顯示在系統(tǒng)托盤里邊 if wsastartup($101,wsadata)0 then exit。局域網(wǎng)內(nèi)所有在線主機收到該廣播信息以后將新上線的主機名,端口, IP 地址以及工作組信息添加到 自己的在線用戶列表并都以 HAND 為頭信息向局域網(wǎng)廣播本機的握手信息;當包括剛上線主機在內(nèi)的局域網(wǎng)所有主機收到這個握手信息以后線判斷自 己的在線用戶列表中是否存在這個主機廣播的主機信息,如果不存在就 說明 它 是剛上線主機,最后將這個信息添加到自己在線列表,否則就不加;當用戶下線的時候也將自己的信息以LOGOUT 為頭信息廣播給局域網(wǎng),其他在線用戶收到這個消息以后將其主機信息從本地在線用戶列表刪除。 第二部分:文件傳輸是本設(shè)計功能實現(xiàn)的核心。 如果 通過 局域網(wǎng)內(nèi)主機之間復制 粘貼來 實現(xiàn)文件 資源 共享,將浪費 大量的 網(wǎng)絡(luò) 帶寬,極大程度上影響了網(wǎng)內(nèi)用戶的工作效率 ,甚至導致用戶不能正常工作 ;如果依靠移動磁盤實現(xiàn)文件的共享,將花費 大量 的金錢 ,