您好,欢迎访问三七文档
))))))))))))))贵州大学实验报告学院:计算机学院专业:软件工程班级:软件123班姓名***学号***实验组实验时间2015-5-9指导教师蔡丽成绩实验项目名称FTP上传下载器编程实验目的通过本实验掌握C#中FTP上传下载器编程的方法,了解其区别与适用场合。实验要求了解C#的UDP编程方法。实验原理使用.NET请求/响应模型的FtpWebRequest类和FtpWebResponse类实现简单的Web浏览器实验环境VisualStudio开发环境实验步骤1.设计程序界面。2.实现程序功能。))))))))))))))实验内容实现简单的Web浏览器,要求使用.NET请求/响应模型的FtpWebRequest类和FtpWebResponse类。实验数据服务器核心代码//FtpServerForm类:usingSystem;usingSystem.Collections.Generic;usingSystem.Globalization;usingSystem.IO;usingSystem.Net;usingSystem.Net.Sockets;usingSystem.Threading;usingSystem.Windows.Forms;namespaceFtpServer{publicpartialclassFtpServerForm:Form{TcpListenermyTcpListener=null;privateThreadlistenThread;))))))))))))))//保存用户名和密码Dictionarystring,stringusers;publicFtpServerForm(){InitializeComponent();//初始化用户名和密码users=newDictionarystring,string();users.Add(admin,admin);//设置默认的主目录tbxFtpRoot.Text=F:/MyFtpServerRoot/;IPAddress[]ips=Dns.GetHostAddresses();tbxFtpServerIp.Text=ips[1].ToString();tbxFtpServerPort.Text=21;lstboxStatus.Enabled=false;}//启动服务器privatevoidbtnFtpServerStartStop_Click(object))))))))))))))sender,EventArgse){if(myTcpListener==null){listenThread=newThread(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=启动;}}//监听端口,处理客户端连接privatevoidListenClientConnect(){myTcpListener=newTcpListener(IPAddress.Parse(tbxFtpServerIp.Text),int.Parse(tbxFtpServerPort.Text));//开始监听传入的请求myTcpListener.Start();AddInfo(启动FTP服务成功!);AddInfo(Ftp服务器运行中...[点击”停止“按钮停止FTP服务]);while(true){try{))))))))))))))//接收连接请求TcpClienttcpClient=myTcpListener.AcceptTcpClient();AddInfo(string.Format(客户端({0})与本机({1})建立Ftp连接,tcpClient.Client.RemoteEndPoint,myTcpListener.LocalEndpoint));Useruser=newUser();user.commandSession=newUserSeesion(tcpClient);user.workDir=tbxFtpRoot.Text;Threadt=newThread(UserProcessing);t.IsBackground=true;t.Start(user);}catch{break;}}}))))))))))))))//处理客户端用户请求privatevoidUserProcessing(objectobj){Useruser=(User)obj;stringsendString=220FTPServerv1.0;RepleyCommandToUser(user,sendString);while(true){stringreceiveString=null;try{//读取客户端发来的请求信息receiveString=user.commandSession.streamReader.ReadLine();}catch(Exceptionex){if(user.commandSession.tcpClient.Connected==false){AddInfo(string.Format(客户端({0}断开连接!),))))))))))))))user.commandSession.tcpClient.Client.RemoteEndPoint));}else{AddInfo(接收命令失败!+ex.Message);}break;}if(receiveString==null){AddInfo(接收字符串为null,结束线程!);break;}AddInfo(string.Format(来自{0}:[{1}],user.commandSession.tcpClient.Client.RemoteEndPoint,receiveString));))))))))))))))//分解客户端发来的控制信息中的命令和参数stringcommand=receiveString;stringparam=string.Empty;intindex=receiveString.IndexOf('');if(index!=-1){command=receiveString.Substring(0,index).ToUpper();param=receiveString.Substring(command.Length).Trim();}//处理不需登录即可响应的命令(这里只处理QUIT)if(command==QUIT){//关闭TCP连接并释放与其关联的所有资源user.commandSession.Close();return;}))))))))))))))else{switch(user.loginOK){//等待用户输入用户名:case0:CommandUser(user,command,param);break;//等待用户输入密码case1:CommandPassword(user,command,param);break;//用户名和密码验证正确后登陆case2:switch(command){caseCWD:CommandCWD(user,))))))))))))))param);break;casePWD:CommandPWD(user);break;casePASV:CommandPASV(user);break;casePORT:CommandPORT(user,param);break;caseLIST:CommandLIST(user,param);break;caseNLIST:CommandLIST(user,param);break;//处理下载文件命令caseRETR:))))))))))))))CommandRETR(user,param);break;//处理上传文件命令caseSTOR:CommandSTOR(user,param);break;//处理删除命令caseDELE:CommandDELE(user,param);break;//使用Type命令在ASCII和二进制模式进行变换caseTYPE:CommandTYPE(user,param);break;default:sendString=502commandisnotimplemented.;))))))))))))))RepleyCommandToUser(user,sendString);break;}break;}}}}//想客户端返回响应码privatevoidRepleyCommandToUser(Useruser,stringstr){try{user.commandSession.streamWriter.WriteLine(str);AddInfo(string.Format(向客户端({0})发送[{1}],user.commandSession.tcpClient.Client.RemoteEndPoint,))))))))))))))str));}catch{AddInfo(string.Format(向客户端({0})发送信息失败,user.commandSession.tcpClient.Client.RemoteEndPoint));}}//向屏幕输出显示状态信息(这里使用了委托机制)privatedelegatevoidAddInfoDelegate(stringstr);privatevoidAddInfo(stringstr){//如果调用AddInfo()方法的线程与创建ListView控件的线程不在一个线程时//此时利用委托在创建ListView的线程上调用if(lstboxStatus.InvokeRequired==true){AddInfoDelegated=newAddInfoDelegate(AddInfo);))))))))))))))this.Invoke(d,str);}else{lstboxStatus.Items.Add(str);lstboxStatus.TopIndex=lstboxStatus.Items.Count-1;lstboxStatus.ClearSelected();}}#region处理各个命令#region登录过程,即用户身份验证过程//处理USER命令,接收用户名但不进行验证privatevoidCommandUser(Useruser,stringcommand,stringparam){stringsendString=string.Empty;if(command==USER){sendString=331USERcommandOK,password))))))))))))))required.;user.userName=param;//设置loginOk=1为了确保后面紧接的要求输入密码//1表示已接收到用户名,等到接收密码user.loginOK=1;}else{sendString=501USERcommandsyntaxerror.;}RepleyCommandToUser(user,sendString);}//处理PASS命令,验证用户名和密码
本文标题:网络编程-实验报告
链接地址:https://www.777doc.com/doc-6053157 .html