已閱讀5頁,還剩73頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
貴州大學實驗報告學院:計算機學院 專業(yè):軟件工程 班級:軟件123班 姓名*學號*實驗組實驗時間2015-5-9指導教師蔡麗成績實驗項目名稱FTP上傳下載器編程實驗目的通過本實驗掌握C#中FTP上傳下載器編程的方法,了解其區(qū)別與適用場合。實驗要求了解C#的UDP編程方法。實驗原理使用.NET請求/響應模型的FtpWebRequest類和FtpWebResponse類實現(xiàn)簡單的Web瀏覽器實驗環(huán)境Visual Studio開發(fā)環(huán)境實驗步驟1. 設計程序界面。2. 實現(xiàn)程序功能。實驗內容實現(xiàn)簡單的Web瀏覽器,要求使用.NET請求/響應模型的FtpWebRequest類和FtpWebResponse類。實驗數(shù)據服務器核心代碼/FtpServerForm類:using System;using System.Collections.Generic;using System.Globalization;using System.IO;using System.Net;using System.Net.Sockets;using System.Threading;using System.Windows.Forms;namespace FtpServer public partial class FtpServerForm : Form TcpListener myTcpListener = null; private Thread listenThread; / 保存用戶名和密碼 Dictionary users; public FtpServerForm() InitializeComponent(); / 初始化用戶名和密碼 users = new Dictionary(); users.Add(admin, admin); / 設置默認的主目錄 tbxFtpRoot.Text = F:/MyFtpServerRoot/; IPAddress ips = Dns.GetHostAddresses(); tbxFtpServerIp.Text = ips1.ToString(); tbxFtpServerPort.Text = 21; lstboxStatus.Enabled = false; / 啟動服務器 private void btnFtpServerStartStop_Click(object sender, EventArgs e) if (myTcpListener = null) listenThread = new Thread(ListenClientConnect); listenThread.IsBackground = true; listenThread.Start(); lstboxStatus.Enabled = true; lstboxStatus.Items.Clear(); lstboxStatus.Items.Add(已經啟動Ftp服務.); btnFtpServerStartStop.Text = 停止; else myTcpListener.Stop(); myTcpListener = null; listenThread.Abort(); lstboxStatus.Items.Add(Ftp服務已停止!); lstboxStatus.TopIndex = lstboxStatus.Items.Count - 1; btnFtpServerStartStop.Text = 啟動; / 監(jiān)聽端口,處理客戶端連接 private void ListenClientConnect() myTcpListener = new TcpListener(IPAddress.Parse(tbxFtpServerIp.Text), int.Parse(tbxFtpServerPort.Text); / 開始監(jiān)聽傳入的請求 myTcpListener.Start(); AddInfo(啟動FTP服務成功!); AddInfo(Ftp服務器運行中.點擊”停止“按鈕停止FTP服務); while (true) try / 接收連接請求 TcpClient tcpClient = myTcpListener.AcceptTcpClient(); AddInfo(string.Format(客戶端(0)與本機(1)建立Ftp連接, tcpClient.Client.RemoteEndPoint, myTcpListener.LocalEndpoint); User user = new User(); mandSession = new UserSeesion(tcpClient); user.workDir = tbxFtpRoot.Text; Thread t = new Thread(UserProcessing); t.IsBackground = true; t.Start(user); catch break; / 處理客戶端用戶請求 private void UserProcessing(object obj) User user = (User)obj; string sendString = 220 FTP Server v1.0; RepleyCommandToUser(user, sendString); while (true) string receiveString = null; try / 讀取客戶端發(fā)來的請求信息 receiveString = mandSession.streamReader.ReadLine(); catch(Exception ex) if (mandSession.tcpClient.Connected = false) AddInfo(string.Format(客戶端(0斷開連接!), mandSession.tcpClient.Client.RemoteEndPoint); else AddInfo(接收命令失??! + ex.Message); break; if (receiveString = null) AddInfo(接收字符串為null,結束線程!); break; AddInfo(string.Format(來自0:1, mandSession.tcpClient.Client.RemoteEndPoint, receiveString); / 分解客戶端發(fā)來的控制信息中的命令和參數(shù) string command = receiveString; string param = string.Empty; int index = receiveString.IndexOf( ); if (index != -1) command = receiveString.Substring(0, index).ToUpper(); param = receiveString.Substring(command.Length).Trim(); / 處理不需登錄即可響應的命令(這里只處理QUIT) if (command = QUIT) / 關閉TCP連接并釋放與其關聯(lián)的所有資源 mandSession.Close(); return; else switch (user.loginOK) / 等待用戶輸入用戶名: case 0: CommandUser(user, command, param); break; / 等待用戶輸入密碼 case 1: CommandPassword(user, command, param); break; / 用戶名和密碼驗證正確后登陸 case 2: switch (command) case CWD: CommandCWD(user, param); break; case PWD: CommandPWD(user); break; case PASV: CommandPASV(user); break; case PORT: CommandPORT(user, param); break; case LIST: CommandLIST(user, param); break; case NLIST: CommandLIST(user, param); break; / 處理下載文件命令 case RETR: CommandRETR(user, param); break; / 處理上傳文件命令 case STOR: CommandSTOR(user, param); break; / 處理刪除命令 case DELE: CommandDELE(user, param); break; / 使用Type命令在ASCII和二進制模式進行變換 case TYPE: CommandTYPE(user, param); break; default: sendString = 502 command is not implemented.; RepleyCommandToUser(user, sendString); break; break; / 想客戶端返回響應碼 private void RepleyCommandToUser(User user, string str) try mandSession.streamWriter.WriteLine(str); AddInfo(string.Format(向客戶端(0)發(fā)送1, mandSession.tcpClient.Client.RemoteEndPoint, str); catch AddInfo(string.Format(向客戶端(0)發(fā)送信息失敗, mandSession.tcpClient.Client.RemoteEndPoint); / 向屏幕輸出顯示狀態(tài)信息(這里使用了委托機制) private delegate void AddInfoDelegate(string str); private void AddInfo(string str) / 如果調用AddInfo()方法的線程與創(chuàng)建ListView控件的線程不在一個線程時 / 此時利用委托在創(chuàng)建ListView的線程上調用 if (lstboxStatus.InvokeRequired = true) AddInfoDelegate d = new AddInfoDelegate(AddInfo); this.Invoke(d, str); else lstboxStatus.Items.Add(str); lstboxStatus.TopIndex = lstboxStatus.Items.Count - 1; lstboxStatus.ClearSelected(); #region 處理各個命令 #region 登錄過程,即用戶身份驗證過程 / 處理USER命令,接收用戶名但不進行驗證 private void CommandUser(User user, string command, string param) string sendString = string.Empty; if (command = USER) sendString = 331 USER command OK, password required.; user.userName = param; / 設置loginOk=1為了確保后面緊接的要求輸入密碼 / 1表示已接收到用戶名,等到接收密碼 user.loginOK = 1; else sendString = 501 USER command syntax error.; RepleyCommandToUser(user, sendString); / 處理PASS命令,驗證用戶名和密碼 private void CommandPassword(User user, string command, string param) string sendString = string.Empty; if (command = PASS) string password = null; if (users.TryGetValue(user.userName, out password) if (password = param) sendString = 230 User logged in success; / 2表示登錄成功 user.loginOK = 2; else sendString = 530 Password incorrect.; else sendString = 530 User name or password incorrect.; else sendString = 501 PASS command Syntax error.; RepleyCommandToUser(user, sendString); / 用戶當前工作目錄 user.currentDir = user.workDir; #endregion #region 文件管理命令 / 處理CWD命令,改變工作目錄 private void CommandCWD(User user, string temp) string sendString = string.Empty; try string dir = user.workDir.TrimEnd(/) + temp; / 是否為當前目錄的子目錄,且不包含父目錄名稱 if (Directory.Exists(dir) user.currentDir = dir; sendString = 250 Directory changed to + dir + successfully; else sendString = 550 Directory + dir + does not exist; catch sendString = 502 Directory changed unsuccessfully; RepleyCommandToUser(user,sendString); / 處理PWD命令,顯示工作目錄 private void CommandPWD(User user) string sendString = string.Empty; sendString = 257 + user.currentDir + is the current directory; RepleyCommandToUser(user, sendString); / 處理LIST/NLIST命令,想客戶端發(fā)送當前或指定目錄下的所有文件名和子目錄名 private void CommandLIST(User user, string parameter) string sendString = string.Empty; DateTimeFormatInfo dateTimeFormat = new CultureInfo(en-US, true).DateTimeFormat; / 得到目錄列表 string dir = Directory.GetDirectories(user.currentDir); if (string.IsNullOrEmpty(parameter) = false) if (Directory.Exists(user.currentDir + parameter) dir = Directory.GetDirectories(user.currentDir + parameter); else string s = user.currentDir.TrimEnd(/); user.currentDir = s.Substring(0, s.LastIndexOf(/) + 1); for (int i = 0; i dir.Length; i+) string folderName = Path.GetFileName(diri); DirectoryInfo d = new DirectoryInfo(diri); / 按下面的格式輸出目錄列表 sendString += dwr-t + Dns.GetHostName() + t + dateTimeFormat.GetAbbreviatedMonthName(d.CreationTime.Month) + d.CreationTime.ToString( dd yyyy) + t + folderName + Environment.NewLine; / 得到文件列表 string files = Directory.GetFiles(user.currentDir); if (string.IsNullOrEmpty(parameter) = false) if (Directory.Exists(user.currentDir + parameter + /) files = Directory.GetFiles(user.currentDir + parameter + /); for (int i = 0; i 1024的隨機端口 / 下面這個運算算法只是為了得到一個大于1024的端口值 port = random1 8 | random2; try user.dataListener = new TcpListener(localip, port); AddInfo(TCP 數(shù)據連接已打開(被動模式)- + localip.ToString() + : + port); catch continue; user.isPassive = true; string temp = localip.ToString().Replace(., ,); / 必須把端口號IP地址告訴客戶端,客戶端接收到響應命令后, / 再通過新的端口連接服務器的端口P,然后進行文件數(shù)據傳輸 sendString = 227 Entering Passive Mode( + temp + , + random1 + , + random2 + ); RepleyCommandToUser(user, sendString
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 服務類合同的續(xù)簽事宜
- 商品采購合同新版格式
- 空氣源熱泵安裝招標啟事
- 股東借款合同范本英文
- 監(jiān)理合同條款范本
- 道路標志牌批量訂購
- 檢討保證書撰寫
- 國慶節(jié)活動承包合同
- 安全供貨合作協(xié)議
- 房屋購買委托協(xié)議書
- 管道拆除施工方案
- 專題19《生于憂患死于安樂》(過關檢測)-2024年中考語文課內39篇文言文閱讀
- 《常見地貌類型-風沙地貌與海岸地貌》導學案
- 廠區(qū)快餐配送方案
- 2024年大學生心理健康知識考試題庫300題(含答案)
- 統(tǒng)編版(2024)道德與法治七年級上冊第十一課《確立人生目標》教案(2課時)
- 2024二十屆三中全會知識競賽題庫及答案
- 2024年考評員國家職業(yè)技能鑒定考試題庫(核心400題)
- 消化系統(tǒng)常見疾病課件(完美版)
- 排水渠承包合同協(xié)議書
- 蛋白質組學知識考試題庫與答案
評論
0/150
提交評論