版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、PING程序設(shè)計(jì)1、 實(shí)驗(yàn)?zāi)康腜ING程序是我們使用的比較多的用于測(cè)試網(wǎng)絡(luò)連通性的程序。PING程序基于ICMP,使用ICMP的回送請(qǐng)求和回送應(yīng)答來(lái)工作。由計(jì)算機(jī)網(wǎng)絡(luò)課程知道,ICMP是基于IP的一個(gè)協(xié)議,ICMP包通過(guò)IP的封裝之后傳遞。課程設(shè)計(jì)中選取PING程序的設(shè)計(jì),其目的是希望同學(xué)們通過(guò)PING程序的設(shè)計(jì),能初步掌握TCP/IP網(wǎng)絡(luò)協(xié)議的基本實(shí)現(xiàn)方法,對(duì)網(wǎng)絡(luò)的實(shí)現(xiàn)機(jī)制有進(jìn)一步的認(rèn)識(shí)。2、 實(shí)驗(yàn)內(nèi)容和要求1、RAW模式的SOCKET編程PING程序是面向用戶的應(yīng)用程序,該程序使用ICMP的封裝機(jī)制,通過(guò)IP協(xié)議來(lái)工作。為了實(shí)現(xiàn)直接對(duì)IP和ICMP包進(jìn)行操作,實(shí)驗(yàn)中使用RAW模式的SOCK
2、ET編程。熟悉SOCKET的編程,包括基本的系統(tǒng)調(diào)用如SOCKET、BIND等;2、具體內(nèi)容1) 定義數(shù)據(jù)結(jié)構(gòu)需要定義好IP數(shù)據(jù)報(bào)、ICMP包等相關(guān)的數(shù)據(jù)結(jié)構(gòu);2) 程序?qū)崿F(xiàn)在WINDOWS環(huán)境下實(shí)現(xiàn)PING程序;3) 程序要求在命令提示符下輸入: PING .其中為目的主機(jī)的IP地址,不要求支持域名,對(duì)是否帶有開(kāi)關(guān)變量也不做要求。不帶開(kāi)關(guān)變量時(shí),要求返回4次響應(yīng)。返回信息的格式: REPLY FROM .或 REQUEST TimeOut (無(wú)法PING通的情況)。3、 實(shí)驗(yàn)主要儀器設(shè)備和材料聯(lián)網(wǎng)計(jì)算機(jī),VC+ 6.0, Window 7操作系統(tǒng)平臺(tái)4、 實(shí)驗(yàn)方法、步驟及結(jié)構(gòu)測(cè)試 1、本程序
3、主要是通過(guò)main()函數(shù)調(diào)用自定義函數(shù)以及其本身的一些功能,例如:打開(kāi)socket動(dòng)態(tài)庫(kù)、設(shè)置接收和發(fā)送超時(shí)值、域名地址解析、分配內(nèi)存、創(chuàng)建及初始化ICMP報(bào)文、發(fā)送ICMP請(qǐng)求報(bào)文、接收ICMP 應(yīng)答報(bào)文以及解讀應(yīng)答報(bào)文和輸出Ping結(jié)果。程序流程圖如下:開(kāi)始 定義及初始化各個(gè)全局變量判斷WSAStartup函數(shù)是否調(diào)用成功 否 輸出調(diào)用失敗 是創(chuàng)建套接字以及設(shè)置socket接收超時(shí),發(fā)送超時(shí)選項(xiàng)輸入PING的IP地址解析輸入內(nèi)容,設(shè)置PING參數(shù)創(chuàng)建及填充ICMP數(shù)據(jù)報(bào)文判斷輸入的ip地址沒(méi)有-t并且已發(fā)四次 是Break 否 清除殘余 否發(fā)送,接收以及解析數(shù)據(jù)包結(jié)束輸出PIING結(jié)果2
4、、校驗(yàn)和函數(shù)、釋放資源函數(shù)流程圖如下:cleanup開(kāi)始Checksu開(kāi)始 if (m_hSocket != INVALID_SOCKE定義初始化cksum(size > 1) 是關(guān)閉套接字 否 是 否定cksum及size大小釋放占用資源清除ICMP包數(shù)據(jù)以及接受緩沖區(qū)if (size)WSACleanup(); 是cksum+=*(UCHAR*)buffer; 否 結(jié)束計(jì)算校驗(yàn)cksum,獲得結(jié)果結(jié)束3、ICMP報(bào)首部函數(shù)流程圖如下:DecodeICMPHeader定義相關(guān)變量以及初始化tick = GetTickCount()我們所要的回應(yīng)報(bào)文輸出不是我們所要tick0icmpco
5、unt=tick -icmphdr->timestamp結(jié)束判斷時(shí)間是否小于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)與分析 運(yùn)行結(jié)果截圖如下:結(jié)果分析:1、Request timed out(請(qǐng)求超時(shí))(
6、1) 對(duì)方已關(guān)機(jī),或者網(wǎng)絡(luò)上根本沒(méi)有這個(gè)地址:比如在上圖中Ping 22(2)對(duì)方與自己不在同一網(wǎng)段內(nèi),通過(guò)路由也無(wú)法找到對(duì)方,但有時(shí)對(duì)方確實(shí)是存在的,當(dāng)然不存在也是返回超時(shí)的信息。(3)對(duì)方確實(shí)存在,但設(shè)置了ICMP數(shù)據(jù)包過(guò)濾(比如防火墻設(shè)置)。2、Destination host Unreachable(目標(biāo)不可達(dá))(1)錯(cuò)誤設(shè)置IP地址6、 課程設(shè)計(jì)心得體會(huì)本次課程設(shè)計(jì)中,我和同隊(duì)組員查找資料發(fā)現(xiàn)使用java實(shí)現(xiàn)Ping程序需要導(dǎo)入java包,只能調(diào)用其中已經(jīng)封裝好的函數(shù),故我們決定使用c+進(jìn)行編程。在這個(gè)題目中我負(fù)責(zé)查找相關(guān)資料,協(xié)助隊(duì)友完成代碼的編寫。在查找資
7、料的過(guò)程中,我加深了對(duì)Socket的原始套接字編程的理解,經(jīng)過(guò)實(shí)現(xiàn)Ping程序,熟悉了IP、ICMP等,掌握TCP/IP網(wǎng)絡(luò)協(xié)議的基本實(shí)現(xiàn)方法。也熟悉了Window網(wǎng)絡(luò)編程的技術(shù)。能熟悉地使用套接字進(jìn)行網(wǎng)絡(luò)通信。熟悉了數(shù)據(jù)通信的網(wǎng)絡(luò)技術(shù),同時(shí)學(xué)會(huì)了跟同學(xué)合作交流完成項(xiàng)目的討論方法和解決問(wèn)題的能力。學(xué)會(huì)如果通過(guò)討論、交流、找資料來(lái)獨(dú)立解決所遇到的問(wèn)題和不懂。更多地鍛煉了獨(dú)立解決問(wèn)題的能力。在編寫函數(shù)的過(guò)程中,時(shí)不時(shí)會(huì)出現(xiàn)一些意想不到的bug,編譯通過(guò),但是得不到想要的結(jié)果,于是我們是用單步調(diào)試的方式很好的解決了問(wèn)題。附錄一:參考文獻(xiàn)【1】 計(jì)算機(jī)網(wǎng)絡(luò) 謝希仁編著 電子工業(yè)出版社【2】 C程序設(shè)計(jì)
8、 譚浩強(qiáng)編著 北京清華大學(xué)出版社程序源代碼及部分注釋:typedef struct iphdr unsigned int h_len:4; / 頭長(zhǎng)度unsigned int version:4; / IP版本 unsigned char service; / 服務(wù)類型 unsigned short total_len; / 包的總長(zhǎng)度 unsigned short ident; / 包標(biāo)示身份 unsigned short frag_and_flags; / 標(biāo)志 unsigned char ttl; / 包生命周期 unsigned char proto; / 協(xié)議類型 unsigned
9、short checksum; / IP 校驗(yàn) unsigned int sourceIP; /源IP unsigned int destIP; /目標(biāo)IP IpHeader;#define ICMP_ECHO 8 /ICMP報(bào)文類型,回顯請(qǐng)求 #define ICMP_ECHOREPLY 0 /ICMP報(bào)文類型,回顯響應(yīng)應(yīng)答#define ICMP_MIN 8 /最小的ICMP數(shù)據(jù)報(bào)大小 typedef struct icmphdr BYTE i_type; /ICMP報(bào)文類型 BYTE i_code; /該類型中的代碼號(hào) USHORT i_cksum; /校驗(yàn)和 USHORT i_id;
10、/惟一的標(biāo)識(shí)符 USHORT i_seq; /序列號(hào) ULONG timestamp; /時(shí)間戳 IcmpHeader;#define DEF_PACKET_SIZE 32 /默認(rèn)數(shù)據(jù)報(bào)大小#define MAX_PACKET 1024 / 最大的ICMP數(shù)據(jù)報(bào)大小 #define MAX_IP_HDR_SIZE 60 / 最大IP頭長(zhǎng)度 /初始化全局變量 int datasize=DEF_PACKET_SIZE;char *icmp_data=NULL;char *recvbuf=NULL;SOCKET m_hSocket= INVALID_SOCKET;char *lpdest=NULL;
11、/填充ICMP數(shù)據(jù)報(bào)字段函數(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)前進(jìn)程的標(biāo)示符(PID) icmp
12、_hdr->i_cksum = 0; icmp_hdr->i_seq = 0; datapart = icmp_data + sizeof(IcmpHeader);/校驗(yàn)和函數(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報(bào)首部函數(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)報(bào)文! t錯(cuò)誤代碼 %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è)置接收的超時(shí)值 if(brea
19、d = SOCKET_ERROR) printf("設(shè)置socket接收超時(shí)選項(xiàng)錯(cuò)誤!"); timeout = 1000; bread = setsockopt(m_hSocket, SOL_SOCKET, SO_SNDTIMEO, (char*)&timeout, sizeof(timeout);/設(shè)置發(fā)送的超時(shí)值 if (bread = SOCKET_ERROR) printf("設(shè)置socket發(fā)送超時(shí)選項(xiàng)錯(cuò)誤!"); 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ù)主機(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 的主機(jī)t錯(cuò)誤代碼 %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)換成“.”點(diǎn)隔的字符串格式 datasize += sizeof(IcmpHeader
22、); /數(shù)據(jù)報(bào)文大小需要包含ICMP報(bào)頭/根據(jù)默認(rèn)堆句柄,從堆中分配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("堆分配錯(cuò)誤!"); memset(icmp_data,0,MAX_PACKET);/
23、將已開(kāi)辟內(nèi)存空間 icmp_data 的首 MAX_PACKET 個(gè)字節(jié)的值設(shè)為值 0。 FillICMPData(icmp_data,datasize);/創(chuàng)建ICMP報(bào)文, / 開(kāi)始發(fā)送或接受ICMP包int nCount=0; while(1) int bwrote; if(strstr(a,"-t")=NULL&&nCount+=4) /判斷a字符數(shù)組中是否包含-t參數(shù)并且已發(fā)ICMP包4次 break;/超過(guò)指定的記錄條數(shù)則退出 (IcmpHeader*)icmp_data)->i_cksum
24、 = 0;/計(jì)算校驗(yàn)和前要把校驗(yàn)和字段設(shè)置為0 (IcmpHeader*)icmp_data)->timestamp = GetTickCount();/獲取操作系統(tǒng)啟動(dòng)到現(xiàn)在所經(jīng)過(guò)的毫秒數(shù),設(shè)置時(shí)間戳 (IcmpHeader*)icmp_data)->i_seq = seq_no+;/設(shè)置序列號(hào) (IcmpHeader*)icmp_data)->i_cksum = checksum(USHORT*)icmp_data, datasize);/計(jì)算校驗(yàn)和 bwrote = sendto(m_hSocket, icmp_data, datasize, 0, (struct so
25、ckaddr*)&m_addrDest, sizeof(m_addrDest);/開(kāi)始發(fā)送ICMP請(qǐng)求 if (bwrote = SOCKET_ERROR)/如果發(fā)送不成功 if (WSAGetLastError() = WSAETIMEDOUT) /如果是由于超時(shí)不成功 printf("Requrest timed out ! rn"); continue; printf("目標(biāo)不可達(dá)!t錯(cuò)誤代碼 %dn", WSAGetLastError();/其他發(fā)送不成功原因continue; if (bwrote < datasize) prin
26、tf("Wrote %d bytes rn", bwrote); int fromlen = sizeof(m_addrFrom);/開(kāi)始接收ICMP應(yīng)答 bread=recvfrom(m_hSocket,recvbuf,MAX_PACKET,0,(struct sockaddr*)&m_addrFrom, &fromlen);/recvfrom()用來(lái)接收遠(yuǎn)程主機(jī)經(jīng)指定的socket傳來(lái)的數(shù)據(jù),并把數(shù)據(jù)傳到由參數(shù)recvbuf指向的內(nèi)存空間 if (bread = SOCKET_ERROR)/如果接收不成功 if (WSAGetLastError() =
27、WSAETIMEDOUT) /如果是由于超時(shí)不成功 printf("Requrest timed out !rn"); continue; printf("接收數(shù)據(jù)函數(shù)調(diào)用錯(cuò)誤!t錯(cuò)誤代碼 %dn", WSAGetLastError();/其他接收不成功原因exit(0); DecodeICMPHeader(recvbuf, bread, &m_addrFrom);/解讀接收到的ICMP數(shù)據(jù)報(bào) Sleep(800); Cleanup();文件傳輸協(xié)議的簡(jiǎn)單設(shè)計(jì)與實(shí)現(xiàn)摘要文件傳送是各種計(jì)算機(jī)網(wǎng)絡(luò)都實(shí)現(xiàn)的基本功能,文件傳送協(xié)議是一種最基本的應(yīng)用層協(xié)議
28、按照客戶/服務(wù)器的模式進(jìn)行工作,提供交互式的訪問(wèn)。本設(shè)計(jì)是基于Eclipse平臺(tái)下使用Java實(shí)現(xiàn)的FTP文件傳輸。實(shí)現(xiàn)基本的文件傳輸操作。建立客戶端和服務(wù)器、客戶端基于TCP Socket進(jìn)行數(shù)據(jù)傳輸,采用多線程進(jìn)行數(shù)據(jù)傳輸。沒(méi)有采用Java里面的FTPClient類來(lái)實(shí)現(xiàn)文件傳輸,而是采用套接字來(lái)實(shí)現(xiàn)。而且在實(shí)現(xiàn)過(guò)程中采用抽象數(shù)據(jù)類型進(jìn)行規(guī)劃,體驗(yàn)一個(gè)軟件開(kāi)發(fā)過(guò)程的具體實(shí)現(xiàn)步驟。關(guān)鍵字:Java網(wǎng)絡(luò)編程 FTP文件傳輸 文件上傳下載 文件操作 一、 實(shí)驗(yàn)?zāi)康奈募魉褪歉鞣N計(jì)算機(jī)網(wǎng)絡(luò)都實(shí)現(xiàn)的基本功能,文件傳送協(xié)議是一種最基本的應(yīng)用層協(xié)議按照客戶/服務(wù)器的模式進(jìn)行工作,提供交互式的訪問(wèn),是IN
29、TERNET使用最廣泛的協(xié)議之一。本實(shí)驗(yàn)的目的是,學(xué)會(huì)利用已有網(wǎng)絡(luò)環(huán)境設(shè)計(jì)并實(shí)現(xiàn)簡(jiǎn)單應(yīng)用層協(xié)議,掌握TCP/IP 網(wǎng)絡(luò)應(yīng)用程序基本的設(shè)計(jì)方法和實(shí)現(xiàn)技巧。二、 實(shí)驗(yàn)內(nèi)容和要求1、實(shí)驗(yàn)內(nèi)容我們的計(jì)算機(jī)網(wǎng)絡(luò)實(shí)驗(yàn)環(huán)境建立在TCP/IP 網(wǎng)絡(luò)體系結(jié)構(gòu)之上。各計(jì)算機(jī)除了安裝TCP/IP 軟件外,還安裝了TCP/IP 開(kāi)發(fā)系統(tǒng)。實(shí)驗(yàn)室各計(jì)算機(jī)具備Windows環(huán)境中套接字socket 的編程接口功能,可為用戶提供全網(wǎng)范圍的進(jìn)程通信功能。本實(shí)驗(yàn)要求學(xué)生利用這些功能,設(shè)計(jì)和實(shí)現(xiàn)一個(gè)簡(jiǎn)單的文件傳送協(xié)議。2、具體要求用socket 編程接口編寫兩個(gè)程序,分別為客戶程序(client.c)和服務(wù)器程序(server.
30、c),該程序應(yīng)能實(shí)現(xiàn)下述命令功能:get:取遠(yuǎn)方的一個(gè)文件put:傳給遠(yuǎn)方一個(gè)文件pwd:顯示遠(yuǎn)主當(dāng)前目錄dir:列出遠(yuǎn)方當(dāng)前目錄cd :改變遠(yuǎn)方當(dāng)前目錄? :顯示你提供的命令quit :退出返回這此命令的具體工作方式(指給出結(jié)果的形式)可以參照FTP 的相應(yīng)命令,有余力的同學(xué)可以多實(shí)現(xiàn)幾個(gè)命令。最后,寫出實(shí)驗(yàn)報(bào)告。三、 實(shí)驗(yàn)主要儀器設(shè)備和材料聯(lián)網(wǎng)計(jì)算機(jī) Eclipse 4.2 JDK1.7幫助文檔 智能手機(jī)四、 基本原理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、將一個(gè)完整的文件從一個(gè)系統(tǒng)復(fù)雜然后通過(guò)TCP套接字發(fā)送傳輸個(gè)另一個(gè)系統(tǒng)中。一方為服務(wù)器。一方為客戶端。FTP建立兩個(gè)TCP連接,一個(gè)用于數(shù)據(jù)傳輸,一個(gè)用于傳輸命令。每一個(gè)FTP主機(jī)都有一個(gè)“協(xié)議解析器”模塊。FTP以純文本形式發(fā)送,其響應(yīng)同樣也是純文本形式。在進(jìn)行文件傳輸時(shí),F(xiàn)TP的客戶端和服務(wù)器之間要建立兩個(gè)并行的TCP連接:“控制連接”和“數(shù)據(jù)連接”??刂七B接在整個(gè)連接回話的期間一直保持打開(kāi)狀態(tài)。當(dāng)FTP客戶端通過(guò)控制連接發(fā)送請(qǐng)求,并告訴服務(wù)器自己的數(shù)據(jù)連接的端口號(hào)(2493),服務(wù)器通過(guò)控制連接(2121)接收到請(qǐng)求信息,然后,創(chuàng)建數(shù)據(jù)連接(2020)進(jìn)程進(jìn)行連接客戶端的端口。由于FTP
32、采用兩個(gè)不同的端口,所以數(shù)據(jù)連接和控制連接不會(huì)混亂。原理圖看圖1客戶端服務(wù)器控制進(jìn)程數(shù)據(jù)傳輸進(jìn)程控制進(jìn)程用戶界面數(shù)據(jù)傳輸進(jìn)程 FTP采用兩個(gè)TCP進(jìn)行連接 2. 系統(tǒng)功能設(shè)計(jì)2.1總體設(shè)計(jì)基本功能:Client Server界面設(shè)計(jì) ;上傳文件;下載文件;查看服務(wù)器的根目錄;更改目錄。2.2系統(tǒng)實(shí)現(xiàn)系統(tǒng)功能實(shí)現(xiàn):FTPServer開(kāi)啟創(chuàng)建一個(gè)ServerSocket建立控制連接端口號(hào)2493 進(jìn)行實(shí)況監(jiān)聽(tīng)訪問(wèn)。FTPClient開(kāi)啟,啟動(dòng)用戶界面,提示使用說(shuō)明,用戶輸入想實(shí)現(xiàn)的操作Code 和Information,然后FTPClient開(kāi)啟控制連接的子線程訪問(wèn)PTPServer的2493端口
33、進(jìn)行控制連接,并新建數(shù)據(jù)連接線程DataTransPro。服務(wù)器接收到FTPClient的請(qǐng)求和相關(guān)信息,進(jìn)行啟動(dòng)數(shù)據(jù)連接,等待客戶端的數(shù)據(jù)連接。完成相應(yīng)請(qǐng)求后。服務(wù)器關(guān)閉套接字,關(guān)閉數(shù)據(jù)連接線程。進(jìn)入監(jiān)聽(tīng)狀態(tài)。五、 實(shí)現(xiàn)的算法、數(shù)據(jù)結(jié)構(gòu)1.客戶端的抽象數(shù)據(jù)類型ADT Client數(shù)據(jù)對(duì)象:控制線程Socket數(shù)據(jù)傳輸線程Socket()數(shù)據(jù)關(guān)系:控制線程程 控制 數(shù)據(jù)傳輸線程程基本操作:UserInterface();/用戶界面ClientControlPro();/控制進(jìn)程ClientDataTransPro();/數(shù)據(jù)傳輸進(jìn)程1.1FTPClient用戶界面顯示ADT Client -U
34、serInterface()showUserMsg();/用戶提示信息Switch(code)Case “h”:/幫助信息Break;Case “get”:/獲取一個(gè)文件ClientDataTransPro(“get”,finleName)Break;Case “put”:/發(fā)送一個(gè)文件DataTransPro(put,fileName);Break;Case “dir”:/列出遠(yuǎn)方當(dāng)前目錄DataTransPro(“dir”);Case “pwd”:/顯示遠(yuǎn)主當(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ù)連接進(jìn)程的函數(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ù)對(duì)象:控制線程Socket(21)數(shù)據(jù)傳輸線程Socket(20)數(shù)據(jù)關(guān)系:控制線程程 控制 數(shù)據(jù)傳輸線程程基本操作:ServerControlPro();/控制進(jìn)程ServerDataTransPro();/數(shù)據(jù)傳輸進(jìn)程2.1 FTPServer的控制連接ADT Server-DataTransProControl ;/控制命令FileRecvFormClient();/接收文件從客戶端操作FileSendToClient();/發(fā)送文件給服客戶端操作ChangeFileDir();/更改文件的存放目錄GetDirToClien
37、t();/獲取指定文件的目錄GetFileNameToClient();/獲取主機(jī)目錄下的所有文件名2.2FTPServer的數(shù)據(jù)連接ADT Server-ControlPro extender ThreadSwitch(request)Case “get”:/發(fā)送一個(gè)文件個(gè)客戶端DataTransPro(“get”,fileName)Break;Case “put”:/發(fā)送一個(gè)文件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ù)對(duì)象:FileOutputStream ,F(xiàn)ileInputStream socket.getInputStream socket.getOutputStream基本操作:private void fileRecvFormSer() /接收文件操作private void fileSendToSer();/發(fā)送文件操作六 實(shí)驗(yàn)方法、步驟及結(jié)構(gòu)測(cè)試客戶端登陸流程圖:客戶端登陸界面:客戶端登陸成功界面:服務(wù)器端登陸流程圖:服務(wù)器登陸界面:服務(wù)器端登陸成功界面:H功能演示:H
39、功能說(shuō)明:H功能用于向用戶提供幫助信息,闡述本系統(tǒng)的提供的主要功能。顯示H功能的代碼:<div class="widget-content"><p>h :顯示你提供的命令</p><p>get:取遠(yuǎn)方的一個(gè)文件</p><p>put:傳給遠(yuǎn)方一個(gè)文件</p><p>pwd:顯示遠(yuǎn)主當(dāng)前目錄</p><p>dir:列出遠(yuǎn)方當(dāng)前目錄</p><p>cd :改變遠(yuǎn)方當(dāng)前目錄</p></div>GET功能演示:GET功能說(shuō)明:
40、GET功能能將服務(wù)器端PUT文件夾下的文件下載到客戶端GET文件夾中。GET功能傳輸?shù)奈募袷綖槿我馕募袷?,使用選擇文件按鈕還可以打開(kāi)txt,doc,java等格式文件并顯示在網(wǎng)頁(yè)的文本域中,方便用戶查看下載的文件。實(shí)現(xiàn)代碼:public void download()/ 下載文件操作/ 先進(jìn)套接字訪問(wèn)服務(wù)器數(shù)據(jù)傳輸線程:Socket socket;trysocket = new Socket(serverIP, randomPort);/ 建立輸入輸出流進(jìn)行數(shù)據(jù)通信:OutputStream outputStream = socket.getOutputStream();InputStre
41、am inputStream = socket.getInputStream();/ 根據(jù)control進(jìn)行相應(yīng)調(diào)用函數(shù)讀寫數(shù)據(jù)操作,新建文件進(jìn)行保存下載的數(shù)據(jù)。當(dāng)前版本的是固定保存名稱,/ 而可以優(yōu)化為根據(jù)用戶輸入名稱保存文件名。/ 然后就進(jìn)行接收下載數(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ù)器端的文件路徑并點(diǎn)擊確認(rèn)提交按鈕:2 下載成功后,頁(yè)面會(huì)彈出一條信息提
43、示用戶下載成功,點(diǎn)擊選擇文件按鈕便可看到客戶端的GET文件夾下看到下載成功的12.mp4文件。2) 演示傳輸txt格式文件:1 輸入服務(wù)器端的IP地址和服務(wù)器端的文件路徑并點(diǎn)擊確認(rèn)提交按鈕:2 下載成功后頁(yè)面會(huì)彈出一條提示用戶下載成功的消息框,點(diǎn)擊選擇文件按鈕便可在客戶端的GET文件夾下看到下載的text.txt文件,選擇test.txt文件并打開(kāi)可在網(wǎng)頁(yè)的文本域中查看test.txt文件的內(nèi)容。PUT功能演示:PUT功能說(shuō)明:PUT功能能將客戶端GET文件夾下的文件上傳到到服務(wù)器端的PUT文件夾中。PUT功能上傳的文件格式為任意文件格式,使用選擇文件按鈕還可以打開(kāi)需要上傳的txt,doc,j
44、ava等格式文件并顯示在網(wǎng)頁(yè)的文本域中,方便用戶編輯并上傳。實(shí)現(xiàn)代碼:public void upload(String filename)try/上傳文件操作 先進(jìn)套接字訪問(wèn)服務(wù)器數(shù)據(jù)傳輸線程和輸入輸出流的實(shí)現(xiàn):Socket socket = new Socket(serverIP, randomPort);OutputStream outputStream = socket.getOutputStream();InputStream inputStream = socket.getInputStream();/ 根據(jù)用戶選擇的文件路徑進(jìn)行讀取本地文件到緩存中然后發(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地址和需要上傳的文件路徑,并點(diǎn)擊提交按
46、鈕(上傳文件格式為txt)2 點(diǎn)擊選擇文件按鈕便可在服務(wù)器端的PUT文件夾下看到上傳的文件3 輸入服務(wù)器端的IP地址和需要上傳的文件路徑,并點(diǎn)擊提交按鈕(上傳文件格式為mp4)4 點(diǎn)擊選擇文件按鈕便可在服務(wù)器端的PUT文件夾下看到上傳的文件DIR功能演示:DIR功能說(shuō)明:DIR功能能列出服務(wù)器端的文件夾目錄。實(shí)現(xiàn)代碼:public void dir()trySocket socket = new Socket(serverIP, randomPort);InputStream inputStream = socket.getInputStream();/ 緩存接收數(shù)據(jù),然后進(jìn)行顯示服務(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地址并點(diǎn)擊確定提交按鈕。2 確定提交后便可在頁(yè)面上列出服務(wù)器端的文件夾目錄。PWD功能演示:PWD功能說(shuō)明:PWD功能能顯示服務(wù)器端的文件夾目錄實(shí)現(xiàn)代碼:public void show()trySocket socket = new Socket(serverIP, randomPort);InputStream inputStream = socket.getInputStream();/ 緩存接收數(shù)據(jù),然后進(jìn)行顯示服務(wù)器的路徑:byte recvbuf = new byte1024;int len;while (len = inputStream.read(recvbuf) != -1)len = inputStream.read(recvbuf);cataloguea0=new String(recvbuf)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 44916-2024船舶和海上技術(shù)船用超低溫閘閥設(shè)計(jì)與試驗(yàn)要求
- 工作總結(jié)之仿真實(shí)習(xí)總結(jié)報(bào)告
- 2023年環(huán)保特種電線電纜投資申請(qǐng)報(bào)告
- 銀行內(nèi)部資金調(diào)撥制度
- 部編版小學(xué)一年級(jí)語(yǔ)文閱讀練習(xí)題四十篇+全冊(cè)練習(xí)題+全冊(cè)《識(shí)字表》生字帶拼音三詞
- 熱力管道施工合同
- 陜西省漢中市寧強(qiáng)縣2023-2024學(xué)年八年級(jí)上學(xué)期期末學(xué)業(yè)水平檢測(cè)數(shù)學(xué)試卷(含解析)
- 《保護(hù)珍稀野生動(dòng)物》課件
- 反腐倡廉課件
- 廣東省陽(yáng)東廣雅學(xué)校2025屆高三第二次診斷性檢測(cè)語(yǔ)文試卷含解析
- 【MOOC】新媒體文化十二講-暨南大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 2024年度智能制造生產(chǎn)線改造項(xiàng)目合同
- 2024年度食堂檔口承包合同(含菜品研發(fā))3篇
- DB32T 4578.2-2023 丙型病毒性肝炎防治技術(shù)指南 第2部分:患者管理
- 護(hù)理輪科心得
- 廣東省茂名市崇文學(xué)校2023-2024學(xué)年九年級(jí)上學(xué)期期末英語(yǔ)試卷(無(wú)答案)
- 眼科??祁}庫(kù)+答案
- 智能化安裝合同補(bǔ)充協(xié)議
- 英語(yǔ)期末復(fù)習(xí)講座模板
- 2024年學(xué)校食堂工作計(jì)劃(五篇)
- 京東管理培訓(xùn)生
評(píng)論
0/150
提交評(píng)論