計算機網(wǎng)絡(luò)課程設(shè)計_第1頁
計算機網(wǎng)絡(luò)課程設(shè)計_第2頁
計算機網(wǎng)絡(luò)課程設(shè)計_第3頁
計算機網(wǎng)絡(luò)課程設(shè)計_第4頁
計算機網(wǎng)絡(luò)課程設(shè)計_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、PING程序設(shè)計1、 實驗?zāi)康腜ING程序是我們使用的比較多的用于測試網(wǎng)絡(luò)連通性的程序。PING程序基于ICMP,使用ICMP的回送請求和回送應(yīng)答來工作。由計算機網(wǎng)絡(luò)課程知道,ICMP是基于IP的一個協(xié)議,ICMP包通過IP的封裝之后傳遞。課程設(shè)計中選取PING程序的設(shè)計,其目的是希望同學(xué)們通過PING程序的設(shè)計,能初步掌握TCP/IP網(wǎng)絡(luò)協(xié)議的基本實現(xiàn)方法,對網(wǎng)絡(luò)的實現(xiàn)機制有進一步的認識。2、 實驗內(nèi)容和要求1、RAW模式的SOCKET編程PING程序是面向用戶的應(yīng)用程序,該程序使用ICMP的封裝機制,通過IP協(xié)議來工作。為了實現(xiàn)直接對IP和ICMP包進行操作,實驗中使用RAW模式的SOCK

2、ET編程。熟悉SOCKET的編程,包括基本的系統(tǒng)調(diào)用如SOCKET、BIND等;2、具體內(nèi)容1) 定義數(shù)據(jù)結(jié)構(gòu)需要定義好IP數(shù)據(jù)報、ICMP包等相關(guān)的數(shù)據(jù)結(jié)構(gòu);2) 程序?qū)崿F(xiàn)在WINDOWS環(huán)境下實現(xiàn)PING程序;3) 程序要求在命令提示符下輸入: PING .其中為目的主機的IP地址,不要求支持域名,對是否帶有開關(guān)變量也不做要求。不帶開關(guān)變量時,要求返回4次響應(yīng)。返回信息的格式: REPLY FROM .或 REQUEST TimeOut (無法PING通的情況)。3、 實驗主要儀器設(shè)備和材料聯(lián)網(wǎng)計算機,VC+ 6.0, Window 7操作系統(tǒng)平臺4、 實驗方法、步驟及結(jié)構(gòu)測試 1、本程序

3、主要是通過main()函數(shù)調(diào)用自定義函數(shù)以及其本身的一些功能,例如:打開socket動態(tài)庫、設(shè)置接收和發(fā)送超時值、域名地址解析、分配內(nèi)存、創(chuàng)建及初始化ICMP報文、發(fā)送ICMP請求報文、接收ICMP 應(yīng)答報文以及解讀應(yīng)答報文和輸出Ping結(jié)果。程序流程圖如下:開始 定義及初始化各個全局變量判斷WSAStartup函數(shù)是否調(diào)用成功 否 輸出調(diào)用失敗 是創(chuàng)建套接字以及設(shè)置socket接收超時,發(fā)送超時選項輸入PING的IP地址解析輸入內(nèi)容,設(shè)置PING參數(shù)創(chuàng)建及填充ICMP數(shù)據(jù)報文判斷輸入的ip地址沒有-t并且已發(fā)四次 是Break 否 清除殘余 否發(fā)送,接收以及解析數(shù)據(jù)包結(jié)束輸出PIING結(jié)果2

4、、校驗和函數(shù)、釋放資源函數(shù)流程圖如下:cleanup開始Checksu開始 if (m_hSocket != INVALID_SOCKE定義初始化cksum(size > 1) 是關(guān)閉套接字 否 是 否定cksum及size大小釋放占用資源清除ICMP包數(shù)據(jù)以及接受緩沖區(qū)if (size)WSACleanup(); 是cksum+=*(UCHAR*)buffer; 否 結(jié)束計算校驗cksum,獲得結(jié)果結(jié)束3、ICMP報首部函數(shù)流程圖如下:DecodeICMPHeader定義相關(guān)變量以及初始化tick = GetTickCount()我們所要的回應(yīng)報文輸出不是我們所要tick0icmpco

5、unt=tick -icmphdr->timestamp結(jié)束判斷時間是否小于1msprintf("Reply from %s: dytes=%d time=%d icmp_seq = %dn",inet_ntoa(from->sin_addr)printf("Reply from %s: dytes=%d time<1ms icmp_seq = %dn",inet_ntoa(from->sin_addr)icmpcount+結(jié)束5、 程序的結(jié)構(gòu)與分析 運行結(jié)果截圖如下:結(jié)果分析:1、Request timed out(請求超時)(

6、1) 對方已關(guān)機,或者網(wǎng)絡(luò)上根本沒有這個地址:比如在上圖中Ping 22(2)對方與自己不在同一網(wǎng)段內(nèi),通過路由也無法找到對方,但有時對方確實是存在的,當(dāng)然不存在也是返回超時的信息。(3)對方確實存在,但設(shè)置了ICMP數(shù)據(jù)包過濾(比如防火墻設(shè)置)。2、Destination host Unreachable(目標(biāo)不可達)(1)錯誤設(shè)置IP地址6、 課程設(shè)計心得體會本次課程設(shè)計中,我和同隊組員查找資料發(fā)現(xiàn)使用java實現(xiàn)Ping程序需要導(dǎo)入java包,只能調(diào)用其中已經(jīng)封裝好的函數(shù),故我們決定使用c+進行編程。在這個題目中我負責(zé)查找相關(guān)資料,協(xié)助隊友完成代碼的編寫。在查找資

7、料的過程中,我加深了對Socket的原始套接字編程的理解,經(jīng)過實現(xiàn)Ping程序,熟悉了IP、ICMP等,掌握TCP/IP網(wǎng)絡(luò)協(xié)議的基本實現(xiàn)方法。也熟悉了Window網(wǎng)絡(luò)編程的技術(shù)。能熟悉地使用套接字進行網(wǎng)絡(luò)通信。熟悉了數(shù)據(jù)通信的網(wǎng)絡(luò)技術(shù),同時學(xué)會了跟同學(xué)合作交流完成項目的討論方法和解決問題的能力。學(xué)會如果通過討論、交流、找資料來獨立解決所遇到的問題和不懂。更多地鍛煉了獨立解決問題的能力。在編寫函數(shù)的過程中,時不時會出現(xiàn)一些意想不到的bug,編譯通過,但是得不到想要的結(jié)果,于是我們是用單步調(diào)試的方式很好的解決了問題。附錄一:參考文獻【1】 計算機網(wǎng)絡(luò) 謝希仁編著 電子工業(yè)出版社【2】 C程序設(shè)計

8、 譚浩強編著 北京清華大學(xué)出版社程序源代碼及部分注釋:typedef struct iphdr unsigned int h_len:4; / 頭長度unsigned int version:4; / IP版本 unsigned char service; / 服務(wù)類型 unsigned short total_len; / 包的總長度 unsigned short ident; / 包標(biāo)示身份 unsigned short frag_and_flags; / 標(biāo)志 unsigned char ttl; / 包生命周期 unsigned char proto; / 協(xié)議類型 unsigned

9、short checksum; / IP 校驗 unsigned int sourceIP; /源IP unsigned int destIP; /目標(biāo)IP IpHeader;#define ICMP_ECHO 8 /ICMP報文類型,回顯請求 #define ICMP_ECHOREPLY 0 /ICMP報文類型,回顯響應(yīng)應(yīng)答#define ICMP_MIN 8 /最小的ICMP數(shù)據(jù)報大小 typedef struct icmphdr BYTE i_type; /ICMP報文類型 BYTE i_code; /該類型中的代碼號 USHORT i_cksum; /校驗和 USHORT i_id;

10、/惟一的標(biāo)識符 USHORT i_seq; /序列號 ULONG timestamp; /時間戳 IcmpHeader;#define DEF_PACKET_SIZE 32 /默認數(shù)據(jù)報大小#define MAX_PACKET 1024 / 最大的ICMP數(shù)據(jù)報大小 #define MAX_IP_HDR_SIZE 60 / 最大IP頭長度 /初始化全局變量 int datasize=DEF_PACKET_SIZE;char *icmp_data=NULL;char *recvbuf=NULL;SOCKET m_hSocket= INVALID_SOCKET;char *lpdest=NULL;

11、/填充ICMP數(shù)據(jù)報字段函數(shù)void FillICMPData(char *icmp_data, int datasize) IcmpHeader *icmp_hdr = NULL; char *datapart = NULL; icmp_hdr = (IcmpHeader*)icmp_data; icmp_hdr->i_type = ICMP_ECHO; icmp_hdr->i_code = 0; icmp_hdr->i_id = (USHORT)GetCurrentProcessId();/GetCurrentProcessId()獲取當(dāng)前進程的標(biāo)示符(PID) icmp

12、_hdr->i_cksum = 0; icmp_hdr->i_seq = 0; datapart = icmp_data + sizeof(IcmpHeader);/校驗和函數(shù)USHORT checksum(USHORT *buffer, int size) unsigned long cksum=0; while (size > 1) cksum += *buffer+; size -= sizeof(USHORT); if (size) cksum += *(UCHAR*)buffer; cksum = (cksum >> 16) + (cksum &

13、 0xffff); cksum += (cksum >>16); return (USHORT)(cksum);/解讀ICMP報首部函數(shù)void DecodeICMPHeader(char *buf, int bytes, SOCKADDR_IN *from) IpHeader *iphdr = NULL; IcmpHeader *icmphdr = NULL; unsigned short iphdrlen; DWORD tick; static int icmpcount = 0; iphdr = (IpHeader *)buf;/從buf中獲取IP數(shù)據(jù)包頭指針 iphdrle

14、n = iphdr->h_len * 4; tick = GetTickCount(); if (bytes < iphdrlen + ICMP_MIN) printf("Too few bytes from %s rn",inet_ntoa(from->sin_addr); icmphdr = (IcmpHeader*)(buf + iphdrlen);/定位ICMP包頭起始位置 if (icmphdr->i_type != ICMP_ECHOREPLY) printf("nonecho type %d received rn"

15、, icmphdr->i_type); if (icmphdr->i_id != (USHORT)GetCurrentProcessId() printf("其他程序的回應(yīng)報文! t錯誤代碼 %dn", WSAGetLastError(); int tick0;tick0=tick - icmphdr->timestamp;if(tick0<1)printf("Reply from%s: bytes=%d time<1ms icmp_seq =%dn",inet_ntoa(from->sin_addr), bytes,

16、 icmphdr->i_seq );else printf("Reply from %s: bytes=%d time=%dms icmp_seq =%dn",inet_ntoa(from->sin_addr), bytes,tick0, icmphdr->i_seq); /釋放資源函數(shù)void Cleanup() if (m_hSocket != INVALID_SOCKET) closesocket(m_hSocket); HeapFree(GetProcessHeap(), 0, recvbuf); HeapFree(GetProcessHeap()

17、, 0, icmp_data); WSACleanup();/主函數(shù)void main()WSADATA wsaData;char a100;printf("ping ");gets(a);lpdest=a;SOCKADDR_IN m_addrDest;/結(jié)構(gòu)體SOCKADDR_IN m_addrFrom;int timeout=1000;USHORT seq_no=0;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)printf("Sorry, you cannot load socket dll!"

18、);m_hSocket = WSASocket (AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0,WSA_FLAG_OVERLAPPED);/創(chuàng)建原始套接字,該套接字用于ICMP協(xié)議 if (m_hSocket = INVALID_SOCKET) /如果套接字創(chuàng)建不成功 printf("socket 創(chuàng)建失敗!"); int bread = setsockopt(m_hSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout);/設(shè)置接收的超時值 if(brea

19、d = SOCKET_ERROR) printf("設(shè)置socket接收超時選項錯誤!"); timeout = 1000; bread = setsockopt(m_hSocket, SOL_SOCKET, SO_SNDTIMEO, (char*)&timeout, sizeof(timeout);/設(shè)置發(fā)送的超時值 if (bread = SOCKET_ERROR) printf("設(shè)置socket發(fā)送超時選項錯誤!"); memset(&m_addrDest, 0, sizeof(m_addrDest);/ 用0初始化目的地地址 m

20、_addrDest.sin_family = AF_INET;/設(shè)置地址族,這里表示使用IP地址族 if (m_addrDest.sin_addr.s_addr = inet_addr(lpdest) = INADDR_NONE)/地址轉(zhuǎn)化 struct hostent *hp = NULL; if (hp = gethostbyname(lpdest) != NULL) /名字解析,根據(jù)主機名獲取IP地址 memcpy(&(m_addrDest.sin_addr), hp->h_addr, hp->h_length);/將獲取到的IP值賦給目的地地址中的相應(yīng)字段m_add

21、rDest.sin_family = hp->h_addrtype; /將獲取到的地址族值賦給目的地地址中的相應(yīng)字段 else printf("不能找到名為 %s 的主機t錯誤代碼 %dn",lpdest, WSAGetLastError();/獲取不成功exit(0); printf("Pinging %s with 64 bytes of data: nn", inet_ntoa(m_addrDest.sin_addr); /inet_ntoa()將網(wǎng)絡(luò)地址轉(zhuǎn)換成“.”點隔的字符串格式 datasize += sizeof(IcmpHeader

22、); /數(shù)據(jù)報文大小需要包含ICMP報頭/根據(jù)默認堆句柄,從堆中分配MAX_PACKET內(nèi)存塊,新分配內(nèi)存的內(nèi)容將被初始化為0 icmp_data=(char*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,MAX_PACKET); recvbuf =(char*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,MAX_PACKET); if (!icmp_data) /如果分配內(nèi)存不成功 printf("堆分配錯誤!"); memset(icmp_data,0,MAX_PACKET);/

23、將已開辟內(nèi)存空間 icmp_data 的首 MAX_PACKET 個字節(jié)的值設(shè)為值 0。 FillICMPData(icmp_data,datasize);/創(chuàng)建ICMP報文, / 開始發(fā)送或接受ICMP包int nCount=0; while(1) int bwrote; if(strstr(a,"-t")=NULL&&nCount+=4) /判斷a字符數(shù)組中是否包含-t參數(shù)并且已發(fā)ICMP包4次 break;/超過指定的記錄條數(shù)則退出 (IcmpHeader*)icmp_data)->i_cksum

24、 = 0;/計算校驗和前要把校驗和字段設(shè)置為0 (IcmpHeader*)icmp_data)->timestamp = GetTickCount();/獲取操作系統(tǒng)啟動到現(xiàn)在所經(jīng)過的毫秒數(shù),設(shè)置時間戳 (IcmpHeader*)icmp_data)->i_seq = seq_no+;/設(shè)置序列號 (IcmpHeader*)icmp_data)->i_cksum = checksum(USHORT*)icmp_data, datasize);/計算校驗和 bwrote = sendto(m_hSocket, icmp_data, datasize, 0, (struct so

25、ckaddr*)&m_addrDest, sizeof(m_addrDest);/開始發(fā)送ICMP請求 if (bwrote = SOCKET_ERROR)/如果發(fā)送不成功 if (WSAGetLastError() = WSAETIMEDOUT) /如果是由于超時不成功 printf("Requrest timed out ! rn"); continue; printf("目標(biāo)不可達!t錯誤代碼 %dn", WSAGetLastError();/其他發(fā)送不成功原因continue; if (bwrote < datasize) prin

26、tf("Wrote %d bytes rn", bwrote); int fromlen = sizeof(m_addrFrom);/開始接收ICMP應(yīng)答 bread=recvfrom(m_hSocket,recvbuf,MAX_PACKET,0,(struct sockaddr*)&m_addrFrom, &fromlen);/recvfrom()用來接收遠程主機經(jīng)指定的socket傳來的數(shù)據(jù),并把數(shù)據(jù)傳到由參數(shù)recvbuf指向的內(nèi)存空間 if (bread = SOCKET_ERROR)/如果接收不成功 if (WSAGetLastError() =

27、WSAETIMEDOUT) /如果是由于超時不成功 printf("Requrest timed out !rn"); continue; printf("接收數(shù)據(jù)函數(shù)調(diào)用錯誤!t錯誤代碼 %dn", WSAGetLastError();/其他接收不成功原因exit(0); DecodeICMPHeader(recvbuf, bread, &m_addrFrom);/解讀接收到的ICMP數(shù)據(jù)報 Sleep(800); Cleanup();文件傳輸協(xié)議的簡單設(shè)計與實現(xiàn)摘要文件傳送是各種計算機網(wǎng)絡(luò)都實現(xiàn)的基本功能,文件傳送協(xié)議是一種最基本的應(yīng)用層協(xié)議

28、按照客戶/服務(wù)器的模式進行工作,提供交互式的訪問。本設(shè)計是基于Eclipse平臺下使用Java實現(xiàn)的FTP文件傳輸。實現(xiàn)基本的文件傳輸操作。建立客戶端和服務(wù)器、客戶端基于TCP Socket進行數(shù)據(jù)傳輸,采用多線程進行數(shù)據(jù)傳輸。沒有采用Java里面的FTPClient類來實現(xiàn)文件傳輸,而是采用套接字來實現(xiàn)。而且在實現(xiàn)過程中采用抽象數(shù)據(jù)類型進行規(guī)劃,體驗一個軟件開發(fā)過程的具體實現(xiàn)步驟。關(guān)鍵字:Java網(wǎng)絡(luò)編程 FTP文件傳輸 文件上傳下載 文件操作 一、 實驗?zāi)康奈募魉褪歉鞣N計算機網(wǎng)絡(luò)都實現(xiàn)的基本功能,文件傳送協(xié)議是一種最基本的應(yīng)用層協(xié)議按照客戶/服務(wù)器的模式進行工作,提供交互式的訪問,是IN

29、TERNET使用最廣泛的協(xié)議之一。本實驗的目的是,學(xué)會利用已有網(wǎng)絡(luò)環(huán)境設(shè)計并實現(xiàn)簡單應(yīng)用層協(xié)議,掌握TCP/IP 網(wǎng)絡(luò)應(yīng)用程序基本的設(shè)計方法和實現(xiàn)技巧。二、 實驗內(nèi)容和要求1、實驗內(nèi)容我們的計算機網(wǎng)絡(luò)實驗環(huán)境建立在TCP/IP 網(wǎng)絡(luò)體系結(jié)構(gòu)之上。各計算機除了安裝TCP/IP 軟件外,還安裝了TCP/IP 開發(fā)系統(tǒng)。實驗室各計算機具備Windows環(huán)境中套接字socket 的編程接口功能,可為用戶提供全網(wǎng)范圍的進程通信功能。本實驗要求學(xué)生利用這些功能,設(shè)計和實現(xiàn)一個簡單的文件傳送協(xié)議。2、具體要求用socket 編程接口編寫兩個程序,分別為客戶程序(client.c)和服務(wù)器程序(server.

30、c),該程序應(yīng)能實現(xiàn)下述命令功能:get:取遠方的一個文件put:傳給遠方一個文件pwd:顯示遠主當(dāng)前目錄dir:列出遠方當(dāng)前目錄cd :改變遠方當(dāng)前目錄? :顯示你提供的命令quit :退出返回這此命令的具體工作方式(指給出結(jié)果的形式)可以參照FTP 的相應(yīng)命令,有余力的同學(xué)可以多實現(xiàn)幾個命令。最后,寫出實驗報告。三、 實驗主要儀器設(shè)備和材料聯(lián)網(wǎng)計算機 Eclipse 4.2 JDK1.7幫助文檔 智能手機四、 基本原理1.FTP系統(tǒng)模型FTP是Internet上傳文件的應(yīng)用層協(xié)議。FTP規(guī)定數(shù)據(jù)包的格式、數(shù)據(jù)包頭部結(jié)構(gòu)和命令結(jié)構(gòu)等等。FTP應(yīng)用TCP傳輸而不用UDP。由FTP提供的文件傳輸

31、將一個完整的文件從一個系統(tǒng)復(fù)雜然后通過TCP套接字發(fā)送傳輸個另一個系統(tǒng)中。一方為服務(wù)器。一方為客戶端。FTP建立兩個TCP連接,一個用于數(shù)據(jù)傳輸,一個用于傳輸命令。每一個FTP主機都有一個“協(xié)議解析器”模塊。FTP以純文本形式發(fā)送,其響應(yīng)同樣也是純文本形式。在進行文件傳輸時,F(xiàn)TP的客戶端和服務(wù)器之間要建立兩個并行的TCP連接:“控制連接”和“數(shù)據(jù)連接”??刂七B接在整個連接回話的期間一直保持打開狀態(tài)。當(dāng)FTP客戶端通過控制連接發(fā)送請求,并告訴服務(wù)器自己的數(shù)據(jù)連接的端口號(2493),服務(wù)器通過控制連接(2121)接收到請求信息,然后,創(chuàng)建數(shù)據(jù)連接(2020)進程進行連接客戶端的端口。由于FTP

32、采用兩個不同的端口,所以數(shù)據(jù)連接和控制連接不會混亂。原理圖看圖1客戶端服務(wù)器控制進程數(shù)據(jù)傳輸進程控制進程用戶界面數(shù)據(jù)傳輸進程 FTP采用兩個TCP進行連接 2. 系統(tǒng)功能設(shè)計2.1總體設(shè)計基本功能:Client Server界面設(shè)計 ;上傳文件;下載文件;查看服務(wù)器的根目錄;更改目錄。2.2系統(tǒng)實現(xiàn)系統(tǒng)功能實現(xiàn):FTPServer開啟創(chuàng)建一個ServerSocket建立控制連接端口號2493 進行實況監(jiān)聽訪問。FTPClient開啟,啟動用戶界面,提示使用說明,用戶輸入想實現(xiàn)的操作Code 和Information,然后FTPClient開啟控制連接的子線程訪問PTPServer的2493端口

33、進行控制連接,并新建數(shù)據(jù)連接線程DataTransPro。服務(wù)器接收到FTPClient的請求和相關(guān)信息,進行啟動數(shù)據(jù)連接,等待客戶端的數(shù)據(jù)連接。完成相應(yīng)請求后。服務(wù)器關(guān)閉套接字,關(guān)閉數(shù)據(jù)連接線程。進入監(jiān)聽狀態(tài)。五、 實現(xiàn)的算法、數(shù)據(jù)結(jié)構(gòu)1.客戶端的抽象數(shù)據(jù)類型ADT Client數(shù)據(jù)對象:控制線程Socket數(shù)據(jù)傳輸線程Socket()數(shù)據(jù)關(guān)系:控制線程程 控制 數(shù)據(jù)傳輸線程程基本操作:UserInterface();/用戶界面ClientControlPro();/控制進程ClientDataTransPro();/數(shù)據(jù)傳輸進程1.1FTPClient用戶界面顯示ADT Client -U

34、serInterface()showUserMsg();/用戶提示信息Switch(code)Case “h”:/幫助信息Break;Case “get”:/獲取一個文件ClientDataTransPro(“get”,finleName)Break;Case “put”:/發(fā)送一個文件DataTransPro(put,fileName);Break;Case “dir”:/列出遠方當(dāng)前目錄DataTransPro(“dir”);Case “pwd”:/顯示遠主當(dāng)前目錄!DataTransPro(dir);Case “cd”:/更改當(dāng)前目錄DataTransPro(cd,dirName);Ca

35、se “quit”:/退出系統(tǒng)1.2FTPClient控制連接線程ADT Client- ControlPro extended ThreadCode ;/用戶輸入的命令controlDataTransPro();/控制數(shù)據(jù)連接進程的函數(shù)connectServer();/連接服務(wù)器回話的函數(shù)1.3FTPClient數(shù)據(jù)連接線程ADTClient- DataTransPro extended ThreadControl ;/控制命令FileRecvFormSer();/接收文件操作FileSendToSer();/發(fā)送文件操作showSerDir();/顯示目錄信息changeSerDir();

36、/更改文件路徑2. 服務(wù)器的抽象數(shù)據(jù)類型ADT Server數(shù)據(jù)對象:控制線程Socket(21)數(shù)據(jù)傳輸線程Socket(20)數(shù)據(jù)關(guān)系:控制線程程 控制 數(shù)據(jù)傳輸線程程基本操作:ServerControlPro();/控制進程ServerDataTransPro();/數(shù)據(jù)傳輸進程2.1 FTPServer的控制連接ADT Server-DataTransProControl ;/控制命令FileRecvFormClient();/接收文件從客戶端操作FileSendToClient();/發(fā)送文件給服客戶端操作ChangeFileDir();/更改文件的存放目錄GetDirToClien

37、t();/獲取指定文件的目錄GetFileNameToClient();/獲取主機目錄下的所有文件名2.2FTPServer的數(shù)據(jù)連接ADT Server-ControlPro extender ThreadSwitch(request)Case “get”:/發(fā)送一個文件個客戶端DataTransPro(“get”,fileName)Break;Case “put”:/發(fā)送一個文件DataTransPro(“put”,fileName);Break;Case “dir”:/列出當(dāng)前目錄DataTransPro(“dir”);Case “pwd”:/顯示當(dāng)前目錄!DataTransPro(pw

38、d);Case “cd”:/更改當(dāng)前目錄DataTransPro(cd);3. 文件操作ADT FileOperator 數(shù)據(jù)對象:FileOutputStream ,F(xiàn)ileInputStream socket.getInputStream socket.getOutputStream基本操作:private void fileRecvFormSer() /接收文件操作private void fileSendToSer();/發(fā)送文件操作六 實驗方法、步驟及結(jié)構(gòu)測試客戶端登陸流程圖:客戶端登陸界面:客戶端登陸成功界面:服務(wù)器端登陸流程圖:服務(wù)器登陸界面:服務(wù)器端登陸成功界面:H功能演示:H

39、功能說明:H功能用于向用戶提供幫助信息,闡述本系統(tǒng)的提供的主要功能。顯示H功能的代碼:<div class="widget-content"><p>h :顯示你提供的命令</p><p>get:取遠方的一個文件</p><p>put:傳給遠方一個文件</p><p>pwd:顯示遠主當(dāng)前目錄</p><p>dir:列出遠方當(dāng)前目錄</p><p>cd :改變遠方當(dāng)前目錄</p></div>GET功能演示:GET功能說明:

40、GET功能能將服務(wù)器端PUT文件夾下的文件下載到客戶端GET文件夾中。GET功能傳輸?shù)奈募袷綖槿我馕募袷?,使用選擇文件按鈕還可以打開txt,doc,java等格式文件并顯示在網(wǎng)頁的文本域中,方便用戶查看下載的文件。實現(xiàn)代碼:public void download()/ 下載文件操作/ 先進套接字訪問服務(wù)器數(shù)據(jù)傳輸線程:Socket socket;trysocket = new Socket(serverIP, randomPort);/ 建立輸入輸出流進行數(shù)據(jù)通信:OutputStream outputStream = socket.getOutputStream();InputStre

41、am inputStream = socket.getInputStream();/ 根據(jù)control進行相應(yīng)調(diào)用函數(shù)讀寫數(shù)據(jù)操作,新建文件進行保存下載的數(shù)據(jù)。當(dāng)前版本的是固定保存名稱,/ 而可以優(yōu)化為根據(jù)用戶輸入名稱保存文件名。/ 然后就進行接收下載數(shù)據(jù)到緩存再讀入文件中。代碼如下:File file_out = new File("E:/GET/"+houzui);FileOutputStream os = new FileOutputStream(file_out);byte bytes = new byte10024;while (c = inputStream.

42、read(bytes) != -1)os.write(bytes, 0, c);/ 關(guān)閉流和套接字socket.close();os.close();outputStream.close();inputStream.close(); catch (UnknownHostException e1)e1.printStackTrace(); catch (IOException e1)e1.printStackTrace();服務(wù)器端的PUT文件夾客戶端的GET文件夾1) 演示傳輸mp4格式文件:1 輸入服務(wù)器端的IP地址和服務(wù)器端的文件路徑并點擊確認提交按鈕:2 下載成功后,頁面會彈出一條信息提

43、示用戶下載成功,點擊選擇文件按鈕便可看到客戶端的GET文件夾下看到下載成功的12.mp4文件。2) 演示傳輸txt格式文件:1 輸入服務(wù)器端的IP地址和服務(wù)器端的文件路徑并點擊確認提交按鈕:2 下載成功后頁面會彈出一條提示用戶下載成功的消息框,點擊選擇文件按鈕便可在客戶端的GET文件夾下看到下載的text.txt文件,選擇test.txt文件并打開可在網(wǎng)頁的文本域中查看test.txt文件的內(nèi)容。PUT功能演示:PUT功能說明:PUT功能能將客戶端GET文件夾下的文件上傳到到服務(wù)器端的PUT文件夾中。PUT功能上傳的文件格式為任意文件格式,使用選擇文件按鈕還可以打開需要上傳的txt,doc,j

44、ava等格式文件并顯示在網(wǎng)頁的文本域中,方便用戶編輯并上傳。實現(xiàn)代碼:public void upload(String filename)try/上傳文件操作 先進套接字訪問服務(wù)器數(shù)據(jù)傳輸線程和輸入輸出流的實現(xiàn):Socket socket = new Socket(serverIP, randomPort);OutputStream outputStream = socket.getOutputStream();InputStream inputStream = socket.getInputStream();/ 根據(jù)用戶選擇的文件路徑進行讀取本地文件到緩存中然后發(fā)送給服務(wù)器的數(shù)據(jù)傳輸線程。

45、具體如下:File file_in = new File(filename);FileInputStream fis = new FileInputStream(file_in);byte bytes = new byte1024;while (c = fis.read(bytes) != -1)outputStream.write(bytes, 0, c);fis.close();inputStream.close();socket.close(); catch (IOException e)e.printStackTrace();1 輸入服務(wù)器端的IP地址和需要上傳的文件路徑,并點擊提交按

46、鈕(上傳文件格式為txt)2 點擊選擇文件按鈕便可在服務(wù)器端的PUT文件夾下看到上傳的文件3 輸入服務(wù)器端的IP地址和需要上傳的文件路徑,并點擊提交按鈕(上傳文件格式為mp4)4 點擊選擇文件按鈕便可在服務(wù)器端的PUT文件夾下看到上傳的文件DIR功能演示:DIR功能說明:DIR功能能列出服務(wù)器端的文件夾目錄。實現(xiàn)代碼:public void dir()trySocket socket = new Socket(serverIP, randomPort);InputStream inputStream = socket.getInputStream();/ 緩存接收數(shù)據(jù),然后進行顯示服務(wù)器的目錄

47、。byte recvbuf = new byte1024;int len;while (len = inputStream.read(recvbuf) != -1)len = inputStream.read(recvbuf);String str = new String(recvbuf);String dir = str.split(",");for (int i = 0; i < dir.length; i+)catalogueai=diri;inputStream.close();socket.close(); catch (IOException e)e.p

48、rintStackTrace();1 輸入服務(wù)器端的IP地址并點擊確定提交按鈕。2 確定提交后便可在頁面上列出服務(wù)器端的文件夾目錄。PWD功能演示:PWD功能說明:PWD功能能顯示服務(wù)器端的文件夾目錄實現(xiàn)代碼:public void show()trySocket socket = new Socket(serverIP, randomPort);InputStream inputStream = socket.getInputStream();/ 緩存接收數(shù)據(jù),然后進行顯示服務(wù)器的路徑:byte recvbuf = new byte1024;int len;while (len = inputStream.read(recvbuf) != -1)len = inputStream.read(recvbuf);cataloguea0=new String(recvbuf)

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論