計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告文件傳輸協(xié)議的簡(jiǎn)單實(shí)現(xiàn)
《計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告文件傳輸協(xié)議的簡(jiǎn)單實(shí)現(xiàn)》由會(huì)員分享,可在線閱讀,更多相關(guān)《計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告文件傳輸協(xié)議的簡(jiǎn)單實(shí)現(xiàn)(24頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、蚅袃裊肀薁袂羈芅蕆袁膀肈蒃袀袀莃荿衿羂膆蚈衿肄莂薄袈膇膄蒀羇袆莀莆羆罿膃蚅羅肁莈薀羄芃膁薆羃羃蒆蒂薀肅艿莈蕿膈蒅蚇薈袇羋薃薇罿蒃葿蚇肂芆蒞蚆膄聿蚄蚅羄芄蝕蚄肆膇薆蚃膈莂蒂螞袈膅莈蟻羀莁蚆蟻肅膄薂螀膅荿蒈蝿裊膂莄螈肇莇莀螇腿芀蠆螆衿蒆薅螅羈羋蒁螅肅蒄莇襖膆芇蚅袃裊肀薁袂羈芅蕆袁膀肈蒃袀袀莃荿衿羂膆蚈衿肄莂薄袈膇膄蒀羇袆莀莆羆罿膃蚅羅肁莈薀羄芃膁薆羃羃蒆蒂薀肅艿莈蕿膈蒅蚇薈袇羋薃薇罿蒃葿蚇肂芆蒞蚆膄聿蚄蚅羄芄蝕蚄肆膇薆蚃膈莂蒂螞袈膅莈蟻羀莁蚆蟻肅膄薂螀膅荿蒈蝿裊膂莄螈肇莇莀螇腿芀蠆螆衿蒆薅螅羈羋蒁螅肅蒄莇襖膆芇蚅袃裊肀薁袂羈芅蕆袁膀肈蒃袀袀莃荿衿羂膆蚈衿肄莂薄袈膇膄蒀羇袆莀莆羆罿膃蚅羅肁莈薀羄芃膁
2、薆羃羃蒆蒂薀肅艿莈蕿膈蒅蚇薈袇羋薃薇罿蒃葿蚇肂芆蒞蚆膄聿蚄蚅羄芄蝕蚄肆膇薆蚃膈莂蒂螞袈膅莈蟻羀莁蚆蟻肅膄薂螀膅荿蒈蝿裊膂莄螈肇莇莀螇腿芀蠆螆衿蒆薅螅羈羋蒁螅肅蒄莇襖膆芇蚅袃裊肀薁袂羈芅蕆袁膀肈蒃袀袀莃荿衿羂膆蚈衿肄莂薄袈膇膄蒀羇袆莀莆羆罿膃蚅羅肁莈薀羄芃膁薆羃羃蒆蒂薀肅艿莈蕿膈蒅蚇薈袇羋薃薇罿蒃葿蚇肂芆蒞蚆膄聿蚄蚅羄芄蝕蚄肆膇薆蚃膈莂蒂螞袈膅莈蟻羀莁蚆蟻肅膄薂螀膅荿蒈蝿裊膂莄螈肇莇莀螇腿芀蠆螆衿蒆薅螅羈羋蒁螅肅蒄莇襖膆芇蚅袃裊肀薁袂羈芅蕆袁膀肈蒃袀袀莃荿衿羂膆蚈衿肄莂薄袈膇膄蒀羇袆莀莆羆罿膃蚅羅肁莈薀羄芃膁薆羃羃蒆蒂薀肅艿莈蕿膈蒅蚇薈袇羋薃薇罿蒃葿蚇肂芆蒞蚆膄聿蚄蚅羄芄蝕蚄肆膇薆蚃膈莂蒂螞袈膅
3、莈蟻羀莁蚆蟻肅膄薂螀膅荿蒈蝿裊膂莄螈肇莇莀螇腿芀蠆螆衿蒆薅螅羈羋蒁螅肅蒄莇襖膆芇蚅袃裊肀薁袂羈芅蕆袁膀肈蒃袀袀莃荿衿羂膆蚈衿肄莂薄袈膇膄蒀羇袆莀莆羆罿膃蚅羅肁莈薀羄芃膁薆羃羃蒆蒂薀肅艿莈蕿膈蒅蚇薈袇羋薃薇罿蒃葿蚇肂芆蒞蚆膄聿蚄蚅羄芄蝕蚄肆膇薆蚃膈莂蒂螞袈膅莈蟻羀莁蚆蟻肅膄薂螀膅荿蒈蝿裊膂莄螈肇莇莀螇腿芀蠆螆衿蒆薅螅羈羋蒁螅肅蒄莇襖膆芇蚅袃裊肀薁袂羈芅蕆袁膀肈蒃袀袀莃荿衿羂膆蚈衿肄莂薄袈膇膄蒀羇袆莀莆羆罿膃蚅羅肁莈薀羄芃膁薆羃羃蒆蒂薀肅艿莈蕿膈蒅蚇薈袇羋薃薇罿蒃葿蚇肂芆蒞蚆膄聿蚄蚅羄芄蝕蚄肆膇薆蚃膈莂蒂螞袈膅莈蟻羀莁蚆蟻肅膄薂螀膅荿蒈蝿裊膂莄螈肇莇莀螇腿芀蠆螆衿蒆薅螅羈羋蒁螅肅蒄莇襖膆芇蚅袃裊肀
4、薁袂羈芅蕆袁膀肈蒃袀袀莃荿衿羂膆蚈衿肄莂薄袈膇膄蒀羇袆莀莆羆罿膃蚅羅肁莈薀羄芃膁薆羃羃蒆蒂薀肅艿莈蕿膈蒅蚇薈袇羋薃薇罿蒃葿蚇肂芆蒞蚆膄聿蚄蚅羄芄蝕蚄肆膇薆蚃膈莂蒂螞袈膅莈蟻羀莁蚆蟻肅膄薂螀膅荿蒈蝿裊膂莄螈肇莇莀螇腿芀蠆螆衿蒆薅螅羈羋蒁螅肅蒄莇襖膆芇蚅袃裊肀薁袂羈芅蕆袁膀肈蒃袀袀莃荿衿羂膆蚈衿肄莂薄袈膇膄蒀羇袆莀莆羆罿膃蚅羅肁莈薀羄芃膁薆羃羃蒆蒂薀肅艿莈蕿膈蒅蚇薈袇羋薃薇罿蒃葿蚇肂芆蒞蚆膄聿蚄蚅羄芄蝕蚄肆膇薆蚃膈莂蒂螞袈膅莈蟻羀莁蚆蟻肅膄薂螀膅荿蒈蝿裊膂莄螈肇莇莀螇腿芀蠆螆衿蒆薅螅羈羋蒁螅肅蒄莇襖膆芇蚅袃裊肀薁袂羈芅蕆袁膀肈蒃袀袀莃荿衿羂膆蚈衿肄莂薄袈膇膄蒀羇袆莀莆羆罿膃蚅羅肁莈薀羄芃膁薆羃羃蒆
5、蒂薀肅艿莈蕿膈蒅蚇薈袇羋薃薇罿蒃葿蚇肂芆蒞蚆膄聿蚄蚅羄芄蝕蚄肆膇薆蚃膈莂蒂螞袈膅莈蟻羀莁蚆蟻肅膄薂螀膅荿蒈蝿裊膂莄螈肇莇莀螇腿芀蠆螆衿蒆薅螅羈羋蒁螅肅蒄莇襖膆芇蚅袃裊肀薁袂羈芅蕆袁膀肈蒃袀袀莃荿衿羂膆蚈衿肄莂薄袈膇膄蒀羇袆莀莆羆罿膃蚅羅肁莈薀羄芃膁薆羃羃蒆蒂薀肅艿莈蕿膈蒅蚇薈袇羋薃薇罿蒃葿蚇肂芆蒞蚆膄聿蚄蚅羄芄蝕蚄肆膇薆蚃膈莂蒂螞袈膅莈蟻羀莁蚆蟻肅膄薂螀膅荿蒈蝿裊膂莄螈肇莇莀螇腿芀蠆螆衿蒆薅螅羈羋蒁螅肅蒄莇襖膆芇蚅袃裊肀薁袂羈芅蕆袁膀肈蒃袀袀莃荿衿羂膆蚈衿肄莂薄袈膇膄蒀羇袆莀莆羆罿膃蚅羅肁莈薀羄芃膁薆羃羃蒆蒂薀肅艿莈蕿膈蒅蚇薈袇羋薃薇罿蒃葿蚇肂芆蒞蚆膄聿蚄蚅羄芄蝕蚄肆膇薆蚃膈莂蒂螞袈膅莈蟻羀莁
6、蚆蟻肅膄薂螀膅荿蒈蝿裊膂莄螈肇莇莀螇腿芀蠆螆衿蒆薅螅羈羋蒁螅肅蒄莇襖膆芇蚅袃裊肀薁袂羈芅蕆袁膀肈蒃袀袀莃荿衿羂膆蚈衿肄莂薄袈膇膄蒀羇袆莀莆羆罿膃蚅羅肁莈薀羄芃膁薆羃羃蒆蒂薀肅艿莈蕿膈蒅蚇薈袇羋薃薇罿蒃葿蚇肂芆蒞蚆膄聿蚄蚅羄芄蝕蚄肆膇薆蚃膈莂蒂螞袈膅莈蟻羀莁蚆蟻肅膄薂螀膅荿蒈蝿裊膂莄螈肇莇莀螇腿芀蠆螆衿蒆薅螅羈羋蒁螅肅蒄莇襖膆芇蚅袃裊肀薁袂羈芅蕆袁膀肈蒃袀袀莃荿衿羂膆蚈衿肄莂薄袈膇膄蒀羇袆莀莆羆罿膃蚅羅肁莈薀羄芃膁薆羃羃蒆蒂薀肅艿莈蕿膈蒅蚇薈袇羋薃薇罿蒃葿蚇肂芆蒞蚆膄聿蚄蚅羄芄蝕蚄肆膇薆蚃膈莂蒂螞袈膅莈蟻羀莁蚆蟻肅膄薂螀膅荿蒈蝿裊膂莄螈肇莇莀螇腿芀蠆螆衿蒆薅螅羈羋蒁螅肅蒄莇襖膆芇蚅袃裊肀薁袂羈芅
7、蕆袁膀肈蒃袀袀莃荿衿羂膆蚈衿肄莂薄袈膇膄蒀羇袆莀莆羆罿膃蚅羅肁莈薀羄芃膁薆羃羃蒆蒂薀肅艿莈蕿膈蒅蚇薈袇羋薃薇罿蒃葿蚇肂芆蒞蚆膄聿蚄蚅羄芄蝕蚄肆膇薆蚃膈莂蒂螞袈膅莈蟻羀莁蚆蟻肅膄薂螀膅荿蒈蝿裊膂莄螈肇莇莀螇腿芀蠆螆衿蒆薅螅羈羋蒁螅肅蒄莇襖膆芇蚅袃裊肀薁袂羈芅蕆袁膀肈蒃袀袀莃荿衿羂膆蚈衿肄莂薄袈膇膄蒀羇袆莀莆羆罿膃蚅羅肁莈薀羄芃膁薆羃羃蒆蒂薀肅艿莈蕿膈蒅蚇薈袇羋薃薇罿蒃葿蚇肂芆蒞蚆膄聿蚄蚅羄芄蝕蚄肆膇薆蚃膈莂蒂螞袈膅莈蟻 課 程 設(shè) 計(jì) 課程名稱 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì) 題目名稱 文件傳輸協(xié)議的簡(jiǎn)單設(shè)計(jì)與實(shí)現(xiàn) 學(xué)生學(xué)院
8、 專業(yè)班級(jí)___ _ 學(xué) 號(hào) 學(xué)生姓名______ _________ 指導(dǎo)教師______ _____ 2010 年 1 月 5 日 設(shè)計(jì)摘要 關(guān)鍵詞:SOCKET編程,F(xiàn)TPclient/server程序 摘要:本課程設(shè)計(jì)包含了文件傳輸協(xié)議的簡(jiǎn)單設(shè)計(jì)與實(shí)現(xiàn)。 文件傳送是各種計(jì)算機(jī)網(wǎng)絡(luò)實(shí)現(xiàn)的基本功能,文件傳送協(xié)議是一種最基本的應(yīng)用層協(xié)議按照客戶/服務(wù)器的模式進(jìn)行工作,提供交互式的訪問,是INTERNET使用最廣泛的協(xié)議之一。文件傳輸協(xié)議的簡(jiǎn)單設(shè)計(jì)與實(shí)
9、現(xiàn)建立在計(jì)算機(jī)網(wǎng)絡(luò)實(shí)驗(yàn)環(huán)境TCP/IP 網(wǎng)絡(luò)體系結(jié)構(gòu)之上,使用socket 編程接口編寫兩個(gè)程序,分別為客戶程序(client.c)和服務(wù)器程序(server.c),實(shí)現(xiàn)下述命令功能:get , put, pwd, dir, cd, ?, quit 等,利用了已有網(wǎng)絡(luò)環(huán)境設(shè)計(jì)并實(shí)現(xiàn)簡(jiǎn)單應(yīng)用層協(xié)議。 本設(shè)計(jì)包括了具體設(shè)計(jì)任務(wù),基本思路及所涉及的相關(guān)理論,設(shè)計(jì)流程圖,調(diào)試過(guò)程中出現(xiàn)的問題及相應(yīng)解決辦法,實(shí)驗(yàn)運(yùn)行結(jié)果,核心程序,個(gè)人體會(huì)及建議等。 目錄 1、文件傳輸協(xié)議的簡(jiǎn)單設(shè)計(jì)與實(shí)現(xiàn)---------------------------
10、---18 1. 1 具體設(shè)計(jì)任務(wù)----------------------------------------------18 1.2 基本思路及所涉及的相關(guān)理論--------------------------------18 1.2.1基本思路-------------------------------------------------18 2.2.2 相關(guān)理論--------------------------------------------18 1.3設(shè)計(jì)流程圖------------------------------------------------19
11、 1.4實(shí)驗(yàn)運(yùn)行情況----------------------------------------------19 1.5 核心程序--------------------------------------------------22 2.5.1 服務(wù)器(sever)程序---------------------------------22 2.5.2 客戶(client)程序----------------------------------29 1.6心得體會(huì)----------------------------------------------------
12、-------------------------37 參考文獻(xiàn)--------------------------------------------------------38 2、文件傳輸協(xié)議的簡(jiǎn)單設(shè)計(jì)與實(shí)現(xiàn) 2. 1 具體設(shè)計(jì)任務(wù) 計(jì)算機(jī)網(wǎng)絡(luò)實(shí)驗(yàn)環(huán)境建立在TCP/IP 網(wǎng)絡(luò)體系結(jié)構(gòu)之上。各計(jì)算機(jī)除了安裝TCP/IP 軟件外,還安裝了TCP/IP 開發(fā)系統(tǒng)。實(shí)驗(yàn)室各計(jì)算機(jī)具備Windows環(huán)境中套接字socket 的編程接口功能,可為用戶提供全網(wǎng)范圍的進(jìn)程通信功能。本實(shí)驗(yàn)要求利用這些功能,設(shè)計(jì)和實(shí)現(xiàn)一個(gè)簡(jiǎn)單的文件傳送協(xié)議。
13、 用socket 編程接口編寫兩個(gè)程序,分別為客戶程序(client.c)和服務(wù)器程序(server.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 :退出返回 2.2基本思路及所涉及的相關(guān)理論 2.2.1基本思路 設(shè)計(jì)程序使客戶端連接的時(shí)候,服務(wù)器將會(huì)向客戶端發(fā)回一條消息告知它的IP地址,然后關(guān)閉連接并繼續(xù)接收端口的連接。建立各個(gè)命令功能對(duì)應(yīng)的函數(shù),發(fā)送請(qǐng)求,等待服務(wù)器端的服務(wù)。服務(wù)器端初始化WinSock,創(chuàng)建SO
14、CKET,獲取主機(jī)信息,并對(duì)客戶端進(jìn)行會(huì)話,發(fā)送回復(fù)訊息給客戶端,響應(yīng)完畢后關(guān)閉連接,釋放WinSock。 2.2.2 相關(guān)理論 文件傳送是各種計(jì)算機(jī)網(wǎng)絡(luò)都實(shí)現(xiàn)的基本功能,文件傳送協(xié)議是一種最基本的應(yīng)用層協(xié)議按照客戶/服務(wù)器的模式進(jìn)行工作,提供交互式的訪問,是INTERNET使用最廣泛的協(xié)議之一。 計(jì)算機(jī)網(wǎng)絡(luò)實(shí)驗(yàn)環(huán)境建立在TCP/IP 網(wǎng)絡(luò)體系結(jié)構(gòu)之上。各計(jì)算機(jī)除了安裝TCP/IP 軟件外,還安裝了TCP/IP 開發(fā)系統(tǒng)。實(shí)驗(yàn)室各計(jì)算機(jī)具備Windows環(huán)境中套接字socket 的編程接口功能,可為用戶提供全網(wǎng)范圍的進(jìn)程通信功能。本設(shè)計(jì)利用這些功能,設(shè)計(jì)和實(shí)現(xiàn)一個(gè)簡(jiǎn)單的文件傳送協(xié)議
15、。用socket 編程接口編寫兩個(gè)程序,分別為客戶程序(client.c)和服務(wù)器程序(server.c)。 2.3 設(shè)計(jì)流程圖 2.4實(shí)驗(yàn)運(yùn)行情況 服務(wù)器端運(yùn)行,默認(rèn)自動(dòng)啟動(dòng)監(jiān)聽,情況如下圖: 服務(wù)如果關(guān)閉監(jiān)聽,效果如下圖: 客服端運(yùn)行,如下圖: 輸入服務(wù)器端的IP和端口號(hào)進(jìn)行連接,效果如圖: 下面設(shè)置文件保存位置,如圖: 下面演示上傳一個(gè)視頻文件,然后再下載下來(lái),其中上傳過(guò)程的進(jìn)度信息: 上傳完成后的效果圖: 下載文件的進(jìn)度提示信息: 下載完成后,指定目錄下就有了該文件了: 2.5 核心程序 2.5.1 服務(wù)器(server
16、)程序如下 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Net; using System.Net.Sockets; using System.IO; using System.Windows.Forms; namespace TCP文件傳輸_服務(wù)器 { class WorkThread { byte[] buffer;
17、 int bufferSize= 4096; Thread mythread; Socket handler; public WorkThread(Socket workSocket) { handler = workSocket; buffer = new byte[bufferSize]; mythread = new Thread(BeginCommunication); } p
18、ublic void Start() { mythread.Start(); } public void Abort() { mythread.Abort(); } private void BeginCommunication() { while (true)//從客戶端接收數(shù)據(jù),直到連接斷開 { try
19、 { int reCount = handler.Receive(buffer); string insStr =Encoding.BigEndianUnicode. GetString(buffer, 0, reCount); if (insStr.Substring(0, 4) == "name")//收到下文件請(qǐng)求 { string fileName = insSt
20、r. Substring(5, insStr.Length - 5); SendFile(fileName, handler); } else if (insStr.Substring(0, 4) == "boot")//收到獲取根目錄請(qǐng)求 { string listStr = GetFileNames("F:", false);
21、 SendString(handler, listStr); } else if (insStr.Substring(0, 4) == "path")//收到獲取指定目錄內(nèi)容請(qǐng)求 { string path = insStr.Substring(5, insStr.Length - 5); string listStr = GetFileNames(path,
22、false); SendString(handler, listStr); } else if (insStr.Substring(0, 4) == "Queu")//獲取下載文件夾請(qǐng)求,回復(fù)完整文件名列表 { string path = insStr.Substring(5, insStr.Length - 5); s
23、tring listStr = GetFileNames(path, true); SendString(handler, listStr); } else if (insStr.Substring(0, 4) == "upld")//收到上傳文件請(qǐng)求 { string reFileName = insStr.Substring(5, insStr.Length - 5)
24、; LoadFile(reFileName, handler); } else if (insStr.Substring(0, 4) == "quit")//收到斷開連接命令 { HostQuit(); break; }
25、 } catch { HostQuit();break; } } } private void LoadFile(string reFileName, Socket handler) { try { FileStream fs = new FileStream(reFileName, FileMode.Create, FileAccess.Write);
26、 handler.Receive(buffer, 8, SocketFlags.None);//接收文件大小 long filesize = BitConverter.ToInt64(buffer, 0); long receiveCount = 0; while (receiveCount < filesize)//接收文件 { int readcount = handler.Receive(buffer, buf
27、ferSize, SocketFlags.None); fs.Write(buffer, 0, readcount); receiveCount += readcount; } fs.Close(); } catch { HostQuit(); } } private
28、void SendFile(string fileNmae, Socket handler) { try { FileStream fs = new FileStream(fileNmae, FileMode.Open, FileAccess.Read); long size = fs.Length; byte[] bysize = BitConverter.GetBytes(size);
29、 handler.Send(bysize, 8, SocketFlags.None);//發(fā)送文件大小 BinaryReader br = new BinaryReader(fs); int sendcount = 0; while (sendcount < size)//發(fā)送文件 { int readcount = br.Read(buffer, 0, bufferSize);
30、 sendcount += readcount; handler.Send(buffer, readcount, SocketFlags.None); } } catch { HostQuit(); } } private void HostQuit() { GlobalValues.canCont
31、rol.WaitOne(); GlobalValues.canControl.Release(); if (handler.Connected == true) { handler.Shutdown(SocketShutdown.Both); handler.Close(); } } private void SendString(Socket handler,
32、string listStr) { byte[] list = Encoding.BigEndianUnicode.GetBytes(listStr); byte[] listcountbuffer = BitConverter.GetBytes(Convert.ToInt64(list.Length)); try { handler.Send(listcountbuffer, 8, SocketFlags.None);//發(fā)送列表大小
33、 int sendcount = 0; while (sendcount < list.Length)//發(fā)送列表 { if (sendcount + bufferSize < list.Length)//不是最后一次 { int i = handler.Send(list, sendcount, bufferSize, SocketFlags.None);
34、 sendcount += i; } else { int i = handler.Send(list, sendcount, list.Length - sendcount, SocketFlags.None);//發(fā)送最后一次 sendcount += i; }
35、 } } catch (Exception e) { MessageBox.Show("連接斷開."); } } //fileOnly=true則獲取指定目錄及子目錄內(nèi)所有文件信息,fileOnly=false則獲取指定目錄文件信息及文件夾信息 private string GetFileNames(string path, bool fileOnly) {
36、 string listStr = string.Empty; DirectoryInfo drct = new DirectoryInfo(path); foreach (FileSystemInfo fsi in drct.GetFileSystemInfos()) { if (fsi is FileInfo) { //文件 FileInfo fi =
37、(FileInfo)fsi; listStr += fi.FullName; listStr += "\n"; if (fi.Length < 1024) { string sizeStr = fi.Length.ToString() + "字節(jié)"; listStr += sizeStr;
38、 } else if (fi.Length < 1024 * 1024) { double temp = Convert.ToDouble(fi.Length) / 1024; string sizeStr = string.Format("{0:F1}", temp) + "KB"; listStr += sizeStr;
39、 } else if (fi.Length < 1024 * 1024 * 1024) { double temp = Convert.ToDouble(fi.Length) / 1024 / 1024; string sizeStr = string.Format("{0:F1}", temp) + "MB"; listStr += sizeStr;
40、 } else { double temp = Convert.ToDouble(fi.Length) / 1024 / 1024 / 1024; string sizeStr = string.Format("{0:F1}", temp) + "GB"; listStr += sizeStr;
41、 } listStr += "\n"; listStr += fi.LastWriteTime.ToString("yyyy-MM-dd hh:mm:ss"); listStr += "\n"; } else if (fsi is DirectoryInfo) { if (fileOnly)
42、 { listStr += GetFileNames(fsi.FullName, true); } else { //文件夾 DirectoryInfo di = (DirectoryInfo)fsi; listStr += di.FullName;
43、 listStr += "\n"; listStr += "dir"; listStr += "\n"; listStr += di.LastWriteTime.ToString("yyyy-MM-dd hh:mm:ss"); listStr += "\n"; } }
44、 } return listStr; } } } public 服務(wù)器() { InitializeComponent(); Control.CheckForIllegalCrossThreadCalls = false; string HostName = Dns.GetHostName(); //得到主機(jī)名 IPHostEntry IpEntry = Dns.GetHostEntry(HostName); //得到主機(jī)IP string strIPAddr = IpE
45、ntry.AddressList[0].ToString(); tsTxb_IPAdd.Text = strIPAddr; hostIPAddress = IPAddress.Parse(strIPAddr); Server = new IPEndPoint(hostIPAddress, Convert.ToInt32(tsTxb_Port.Text)); sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); soc
46、k.Bind(Server); sock.Listen(10); string str = "正在監(jiān)聽端口 " + tsTxb_Port.Text + "..."; tsLbl_Status.Text = "狀態(tài):" + str; AcceptTh = new Thread(ThAccept); AcceptTh.Start();//開始監(jiān)聽端口 } //下面是監(jiān)聽和停止監(jiān)聽的按鈕事件 private void btn_Start_Click(object sender, EventArgs e) {
47、 tsBtn_Start.Enabled = false; tsBtn_Stop.Enabled = true; Server = new IPEndPoint(hostIPAddress, Convert.ToInt32(tsTxb_Port.Text)); sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); sock.Bind(Server);
48、 sock.Listen(10); string str = "正在監(jiān)聽端口 " + tsTxb_Port.Text + "..."; tsLbl_Status.Text = "狀態(tài):" + str; AcceptTh = new Thread(ThAccept); AcceptTh.Start(); } private void btn_stop_Click(object sender, EventArgs e) {
49、 tsBtn_Start.Enabled = true; tsBtn_Stop.Enabled = false; try { sock.Shutdown(SocketShutdown.Both); } catch { } sock.Close(); tsLbl_Status.Text = "狀態(tài):已停止監(jiān)聽"; } 2.5.2 客戶
50、(client)程序 //MyThread.cs中的實(shí)現(xiàn) using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Net.Sockets; using System.Threading; using System.Windows.Forms; namespace 客戶端_TCP文件傳輸 { public class myThread { Thread dow
51、nloadTh; Thread uploadTh; Socket wordSocket; string fileName; string savePath; byte[] buffer; const int bufferSize = 4096; ToolStripProgressBar tspBar; ToolStripStatusLabel speed; int startTime=0; long receivec
52、ount = 0; long sendCount = 0; int upOrDown = 1;//指示上傳或下載 System.Windows.Forms.Timer timer1 = new System.Windows.Forms.Timer(); public myThread(Socket workSock, string FileName,string SavePath, ref ToolStripProgressBar TspBar, ref ToolStripStatusLabel Speed)
53、 { wordSocket = workSock; fileName = FileName; savePath = SavePath; buffer = new byte[bufferSize]; downloadTh = new Thread(new ThreadStart(Download)); uploadTh = new Thread(new ThreadStart(Upload)); tspBar =
54、 TspBar; speed = Speed; } public myThread(Socket workSock, string FileName,ref ToolStripProgressBar TspBar, ref ToolStripStatusLabel Speed) { wordSocket = workSock; fileName = FileName; buffer = new byte[bufferSize];
55、 downloadTh = new Thread(new ThreadStart(Download)); uploadTh = new Thread(new ThreadStart(Upload)); tspBar = TspBar; speed = Speed; } public void StartDownload() { upOrDown = 1; downloadTh.Start();
56、 timer1.Enabled = true; timer1.Interval = 100; timer1.Tick += new EventHandler(timer1_Tick); startTime = System.Environment.TickCount; timer1.Start(); } public void StartUpload() { upOrDown = 0;
57、 uploadTh.Start(); timer1.Enabled = true; timer1.Interval = 50; timer1.Tick += new EventHandler(timer1_Tick); startTime = System.Environment.TickCount; timer1.Start(); } void timer1_Tick(object sender, Event
58、Args e) { int spentTime = System.Environment.TickCount - startTime; if (spentTime != 0) { if (upOrDown == 1) { double sp = Convert.ToDouble(receivecount) / Convert.ToDouble(spentTime) * 1000 / 1024
59、; if (sp < 1024) speed.Text = tspBar.Value.ToString() + "% 下載速度:" + string.Format("{0:F1}", sp) + "KB"; else speed.Text = tspBar.Value.ToString() + "% 下載速度:" + string.Format("{0:F1}", sp / 1024) + "MB/S"; }
60、 else { double sp = Convert.ToDouble(sendCount) / Convert.ToDouble(spentTime) * 1000 / 1024; if (sp < 1024) speed.Text = tspBar.Value.ToString() + "% 上傳速度:" + string.Format("{0:F1}", sp) + "KB";
61、 else speed.Text = tspBar.Value.ToString() + "% 上傳速度:" + string.Format("{0:F1}", sp / 1024) + "MB/S"; } } } private void Download() { try { string ins = "name=" + fileName;
62、byte[] data = Encoding.BigEndianUnicode.GetBytes(ins); wordSocket.Send(data, data.Length, SocketFlags.None);//發(fā)送下載請(qǐng)求 string reFileName = savePath + "\\" + GetFileName(fileName); Directory.CreateDirectory(savePath); FileStream fs = n
63、ew FileStream(reFileName, FileMode.Create, FileAccess.Write); wordSocket.Receive(buffer, 8, SocketFlags.None);//接收文件大小 long filesize = BitConverter.ToInt64(buffer, 0); while (receivecount < filesize)//接收文件 { int
64、 readcount = wordSocket.Receive(buffer, bufferSize, SocketFlags.None); fs.Write(buffer, 0, readcount); receivecount += readcount; tspBar.Value = Convert.ToInt32(Convert.ToDouble(receivecount) / Convert.ToDouble(filesize) * 100);
65、 } tspBar.Value = 100; timer1_Tick(new object(), new EventArgs()); fs.Close(); timer1.Stop(); StaticValue.isBusy = false; } catch { MessageBox.Show("連接
66、斷開."); timer1.Stop(); if (wordSocket.Connected == true) { wordSocket.Shutdown(SocketShutdown.Both); wordSocket.Close(); timer1.Stop(); StaticValue.isBusy = false; } } } private void Upload() { try { string shortFileName = fileName.Substring(fileName.LastIndexOf(\\
- 溫馨提示:
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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 藥事管理與法規(guī)楊世民第2版第一章
- 初中語(yǔ)法-形容詞和副詞
- 《公民的基本權(quán)利和義務(wù)》人教部編版道德與法治課件
- 五年級(jí)上冊(cè)音樂課件-豐收的節(jié)日(2)|人音版(簡(jiǎn)譜)最新
- 企業(yè)家商業(yè)計(jì)劃培訓(xùn)教程75275
- 員工保密意識(shí)及技能教育培訓(xùn)課件
- [精選]CAINA肖爾布拉克營(yíng)銷戰(zhàn)略規(guī)劃(PPT 174頁(yè))5799
- 教育專題:18___跨越百年的美麗
- 北魏孝文帝的改革措施
- 教育專題:兒童防拐教案1
- 數(shù)據(jù)隔離級(jí)別
- 最新2018清新簡(jiǎn)約工作匯報(bào)模板【ppt精美模板】
- 電子工藝第5章(精品)
- [精選]中化公司銷售培訓(xùn)77824
- (連云港專版)中考?xì)v史復(fù)習(xí) 第2單元 中國(guó)近代史 第9課時(shí) 抗日戰(zhàn)爭(zhēng)和人民解放戰(zhàn)爭(zhēng)的勝利課件 北師大版