收藏 分销(赏)

文件传输协议的简单设计与实现模板.doc

上传人:w****g 文档编号:3001494 上传时间:2024-06-12 格式:DOC 页数:33 大小:341.04KB 下载积分:12 金币
下载 相关 举报
文件传输协议的简单设计与实现模板.doc_第1页
第1页 / 共33页
文件传输协议的简单设计与实现模板.doc_第2页
第2页 / 共33页


点击查看更多>>
资源描述
课 程 设 计 课程名称 计算机网络课程设计 题目名称 文件传输协议简单设计和实现 学生学院 专业班级___ _ 学 号 学生姓名______ _________ 指导老师______ _____ 年 1 月 5 日 设计摘要 关键词:SOCKET编程,FTPclient/server程序 摘要:本课程设计包含了文件传输协议简单设计和实现。 文件传送是多种计算机网络实现基础功效,文件传送协议是一个最基础应用层协议根据用户/服务器模式进行工作,提供交互式访问,是INTERNET使用最广泛协议之一。文件传输协议简单设计和实现建立在计算机网络试验环境TCP/IP 网络体系结构之上,使用socket 编程接口编写两个程序,分别为用户程序(client.c)和服务器程序(server.c),实现下述命令功效:get , put, pwd, dir, cd, ?, quit 等,利用了已经有网络环境设计并实现简单应用层协议。 本设计包含了具体设计任务,基础思绪及所包含相关理论,设计步骤图,调试过程中出现问题及对应处理措施,试验运行结果,关键程序,个人体会及提议等。 目录 1、文件传输协议简单设计和实现------------------------------18 1. 1 具体设计任务----------------------------------------------18 1.2 基础思绪及所包含相关理论--------------------------------18 1.2.1基础思绪-------------------------------------------------18 2.2.2 相关理论--------------------------------------------18 1.3设计步骤图------------------------------------------------19 1.4试验运行情况----------------------------------------------19 1.5 关键程序--------------------------------------------------22 2.5.1 服务器(sever)程序---------------------------------22 2.5.2 用户(client)程序----------------------------------29 1.6心得体会-----------------------------------------------------------------------------37 参考文件--------------------------------------------------------38 2、文件传输协议简单设计和实现 2. 1 具体设计任务 计算机网络试验环境建立在TCP/IP 网络体系结构之上。各计算机除了安装TCP/IP 软件外,还安装了TCP/IP 开发系统。试验室各计算机含有Windows环境中套接字socket 编程接口功效,可为用户提供全网范围进程通信功效。本试验要求利用这些功效,设计和实现一个简单文件传送协议。 用socket 编程接口编写两个程序,分别为用户程序(client.c)和服务器程序(server.c),该程序应能实现下述命令功效: get:取远方一个文件 put:传给远方一个文件 pwd:显示远主目前目录 dir:列出远方目前目录 cd :改变远方目前目录 ? :显示你提供命令 quit :退出返回 2.2基础思绪及所包含相关理论 2.2.1基础思绪 设计程序使用户端连接时候,服务器将会向用户端发回一条消息通知它IP地址,然后关闭连接并继续接收端口连接。建立各个命令功效对应函数,发送请求,等候服务器端服务。服务器端初始化WinSock,创建SOCKET,获取主机信息,并对用户端进行会话,发送回复讯息给用户端,响应完成后关闭连接,释放WinSock。 2.2.2 相关理论 文件传送是多种计算机网络全部实现基础功效,文件传送协议是一个最基础应用层协议根据用户/服务器模式进行工作,提供交互式访问,是INTERNET使用最广泛协议之一。 计算机网络试验环境建立在TCP/IP 网络体系结构之上。各计算机除了安装TCP/IP 软件外,还安装了TCP/IP 开发系统。试验室各计算机含有Windows环境中套接字socket 编程接口功效,可为用户提供全网范围进程通信功效。本设计利用这些功效,设计和实现一个简单文件传送协议。用socket 编程接口编写两个程序,分别为用户程序(client.c)和服务器程序(server.c)。 2.3 设计步骤图 2.4试验运行情况 服务器端运行,默认自动开启监听,情况以下图: 服务假如关闭监听,效果以下图: 客服端运行,以下图: 输入服务器端IP和端口号进行连接,效果图: 下面设置文件保留位置,图: 下面演示上传一个视频文件,然后再下载下来,其中上传过程进度信息: 上传完成后效果图: 下载文件进度提醒信息: 下载完成后,指定目录下就有了该文件了: 2.5 关键程序 2.5.1 服务器(server)程序以下 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文件传输_服务器 { class WorkThread { byte[] buffer; int bufferSize= 4096; Thread mythread; Socket handler; public WorkThread(Socket workSocket) { handler = workSocket; buffer = new byte[bufferSize]; mythread = new Thread(BeginCommunication); } public void Start() { mythread.Start(); } public void Abort() { mythread.Abort(); } private void BeginCommunication() { while (true)//从用户端接收数据,直到连接断开 { try { int reCount = handler.Receive(buffer); string insStr =Encoding.BigEndianUnicode. GetString(buffer, 0, reCount); if (insStr.Substring(0, 4) == "name")//收到下文件请求 { string fileName = insStr. Substring(5, insStr.Length - 5); SendFile(fileName, handler); } else if (insStr.Substring(0, 4) == "boot")//收到获取根目录请求 { string listStr = GetFileNames("F:", false); SendString(handler, listStr); } else if (insStr.Substring(0, 4) == "path")//收到获取指定目录内容请求 { string path = insStr.Substring(5, insStr.Length - 5); string listStr = GetFileNames(path, false); SendString(handler, listStr); } else if (insStr.Substring(0, 4) == "Queu")//获取下载文件夹请求,回复完整文件名列表 { string path = insStr.Substring(5, insStr.Length - 5); string listStr = GetFileNames(path, true); SendString(handler, listStr); } else if (insStr.Substring(0, 4) == "upld")//收到上传文件请求 { string reFileName = insStr.Substring(5, insStr.Length - 5); LoadFile(reFileName, handler); } else if (insStr.Substring(0, 4) == "quit")//收到断开连接命令 { HostQuit(); break; } } catch { HostQuit();break; } } } private void LoadFile(string reFileName, Socket handler) { try { FileStream fs = new FileStream(reFileName, FileMode.Create, FileAccess.Write); handler.Receive(buffer, 8, SocketFlags.None);//接收文件大小 long filesize = BitConverter.ToInt64(buffer, 0); long receiveCount = 0; while (receiveCount < filesize)//接收文件 { int readcount = handler.Receive(buffer, bufferSize, SocketFlags.None); fs.Write(buffer, 0, readcount); receiveCount += readcount; } fs.Close(); } catch { HostQuit(); } } private 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); handler.Send(bysize, 8, SocketFlags.None);//发送文件大小 BinaryReader br = new BinaryReader(fs); int sendcount = 0; while (sendcount < size)//发送文件 { int readcount = br.Read(buffer, 0, bufferSize); sendcount += readcount; handler.Send(buffer, readcount, SocketFlags.None); } } catch { HostQuit(); } } private void HostQuit() { GlobalValues.canControl.WaitOne(); GlobalValues.canControl.Release(); if (handler.Connected == true) { handler.Shutdown(SocketShutdown.Both); handler.Close(); } } private void SendString(Socket handler,string listStr) { byte[] list = Encoding.BigEndianUnicode.GetBytes(listStr); byte[] listcountbuffer = BitConverter.GetBytes(Convert.ToInt64(list.Length)); try { handler.Send(listcountbuffer, 8, SocketFlags.None);//发送列表大小 int sendcount = 0; while (sendcount < list.Length)//发送列表 { if (sendcount + bufferSize < list.Length)//不是最终一次 { int i = handler.Send(list, sendcount, bufferSize, SocketFlags.None); sendcount += i; } else { int i = handler.Send(list, sendcount, list.Length - sendcount, SocketFlags.None);//发送最终一次 sendcount += i; } } } catch (Exception e) { MessageBox.Show("连接断开."); } } //fileOnly=true则获取指定目录及子目录内全部文件信息,fileOnly=false则获取指定目录文件信息及文件夹信息 private string GetFileNames(string path, bool fileOnly) { string listStr = string.Empty; DirectoryInfo drct = new DirectoryInfo(path); foreach (FileSystemInfo fsi in drct.GetFileSystemInfos()) { if (fsi is FileInfo) { //文件 FileInfo fi = (FileInfo)fsi; listStr += fi.FullName; listStr += "\n"; if (fi.Length < 1024) { string sizeStr = fi.Length.ToString() + "字节"; listStr += sizeStr; } else if (fi.Length < 1024 * 1024) { double temp = Convert.ToDouble(fi.Length) / 1024; string sizeStr = string.Format("{0:F1}", temp) + "KB"; listStr += sizeStr; } 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; } else { double temp = Convert.ToDouble(fi.Length) / 1024 / 1024 / 1024; string sizeStr = string.Format("{0:F1}", temp) + "GB"; listStr += sizeStr; } listStr += "\n"; listStr += fi.LastWriteTime.ToString("yyyy-MM-dd hh:mm:ss"); listStr += "\n"; } else if (fsi is DirectoryInfo) { if (fileOnly) { listStr += GetFileNames(fsi.FullName, true); } else { //文件夹 DirectoryInfo di = (DirectoryInfo)fsi; listStr += di.FullName; listStr += "\n"; listStr += "dir"; listStr += "\n"; listStr += di.LastWriteTime.ToString("yyyy-MM-dd hh:mm:ss"); listStr += "\n"; } } } return listStr; } } } public 服务器() { InitializeComponent(); Control.CheckForIllegalCrossThreadCalls = false; string HostName = Dns.GetHostName(); //得到主机名 IPHostEntry IpEntry = Dns.GetHostEntry(HostName); //得到主机IP string strIPAddr = IpEntry.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); sock.Bind(Server); sock.Listen(10); string str = "正在监听端口 " + tsTxb_Port.Text + "..."; tsLbl_Status.Text = "状态:" + str; AcceptTh = new Thread(ThAccept); AcceptTh.Start();//开始监听端口 } //下面是监听和停止监听按钮事件 private void btn_Start_Click(object sender, EventArgs e) { 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); sock.Listen(10); string str = "正在监听端口 " + tsTxb_Port.Text + "..."; tsLbl_Status.Text = "状态:" + str; AcceptTh = new Thread(ThAccept); AcceptTh.Start(); } private void btn_stop_Click(object sender, EventArgs e) { tsBtn_Start.Enabled = true; tsBtn_Stop.Enabled = false; try { sock.Shutdown(SocketShutdown.Both); } catch { } sock.Close(); tsLbl_Status.Text = "状态:已停止监听"; } 2.5.2 用户(client)程序 //MyThread.cs中实现 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 downloadTh; Thread uploadTh; Socket wordSocket; string fileName; string savePath; byte[] buffer; const int bufferSize = 4096; ToolStripProgressBar tspBar; ToolStripStatusLabel speed; int startTime=0; long receivecount = 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) { wordSocket = workSock; fileName = FileName; savePath = SavePath; buffer = new byte[bufferSize]; downloadTh = new Thread(new ThreadStart(Download)); uploadTh = new Thread(new ThreadStart(Upload)); tspBar = TspBar; speed = Speed; } public myThread(Socket workSock, string FileName,ref ToolStripProgressBar TspBar, ref ToolStripStatusLabel Speed) { wordSocket = workSock; fileName = FileName; buffer = new byte[bufferSize]; downloadTh = new Thread(new ThreadStart(Download)); uploadTh = new Thread(new ThreadStart(Upload)); tspBar = TspBar; speed = Speed; } public void StartDownload() { upOrDown = 1; downloadTh.Start(); timer1.Enabled = true; timer1.Interval = 100; timer1.Tick += new EventHandler(timer1_Tick); startTime = System.Environment.TickCount; timer1.Start(); } public void StartUpload() { upOrDown = 0; uploadTh.Start(); timer1.Enabled = true; timer1.Interval = 50; timer1.Tick += new EventHandler(timer1_Tick); startTime = System.Environment.TickCount; timer1.Start(); }
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服