中南大学计算机网络课程设计 文件传输程序_第1页
中南大学计算机网络课程设计 文件传输程序_第2页
中南大学计算机网络课程设计 文件传输程序_第3页
中南大学计算机网络课程设计 文件传输程序_第4页
中南大学计算机网络课程设计 文件传输程序_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第三章 文件传输程序3.1设计要求包括客户端和服务器程序,应实现以下功能: (1) 客户端既能上传文件到服务器,也能从服务器下载文件; (2) 在客户端上可显示文件基本信息和传输状态信息,可浏览服务器上供下载的文件列表,选择某文件下载到本地某目录下; (3) 服务器端能接收客户端上传的文件,并保存在某一目录下;也能响应客户端的文件浏览与下载请求; (4)增加其它附加创新功能。程序应具有图形化界面,美观友好。3.2设计思想 随着计算机网络的迅速发展,人们的生活越来越离不开网络,如今网络编程已成为计算机发展的热点,而在众多的网络通信中,又以TCP/IP协议最为流行。本文讨论的Winsock控件,提

2、供了访问TCP/IP网络的捷径,使用它可以不必了解TCP/IP的细节和调用Winsock API,只要设置好相应的属性和触发事件后的处理,就可以实现计算机之间的数据通信。一、Winsock控件 Winsock即Windows Sockets规范的简称,是目前最流行的网络通信应用程序接口之一。所谓Socket,通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过“套接字”向网络发出请求或者应答网络请求。Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以较为方便的编写网络上数据的传递。Winsock控件

3、工作在传输层上,在这一层上,目前主要流行的协议包括TCP和UDP两种:TCP协议适用于那些对于数据的可靠性要求比较高的情况,目前大多数的网络应用层协议都是基于TCP协议的(例如常用的HTTP、FTP、SMTP、POP3等协议);UDP协议适用于对数据可靠性要求不高而对速度要求较高的情况,这里主要包括一些需要大流量的(例如Real公司的RTSP协议,腾讯公司的QQ协议等)。二、Winsock控件通信的工作原理 Winsock控件是基于Socket规范创建的,所以其通信的实质是对Socket接口进行数据的读写操作。如果两个应用程序需要通信,它们可以通过使用Socket类来建立套接字连接,可以将这个

4、过程想象为一次电话呼叫过程:呼叫者通过拨号与被呼叫者连接,当电话接通时,双方都可以自由通话了,只不过这里的呼叫者被称为“客户”,被呼叫者则称为“服务器”,而号码则为“IP地址+端口”,但在建立连接之前,必须由“客户”发出呼叫,且此时的“服务器” 正在监听。因此,基于TCP/IP协议的通信,需要分别建立客户端应用程序和服务器端应用程序。其大致流程如图1所示: 图1 Winsock工作原理 端口号被规定在065535范围内的某一个整数,其中01023被预先定义的服务器通信所占用(如telnet占用23,http占用端口80),所以最好使用102465535这些端口中的某一个,以免发生端口冲突。三、

5、基本方法 客户端要与服务器端进行通信,首先,必须知道服务器端的域名或IP地址(RemoteHost属性),就像要和某人打电话前,必须知道对方的电话号码;其次,还必须和服务器端约定相同的端口(RemotePort属性),用于数据的输入和输出;最后,调用Connect方法与服务器端建立连接。 服务器端应设置一个监听端口(LocalPort属性),端口应与客户端的端口相同,同时调用Listen方法时刻监听客户端的连接请求(ConnectionRequest事件);当接收到客户端的连接请求时,可调用ConnectionRequest事件的Accept方法,这样与客户端的连接就建立了。 客户端和服务器端

6、成功建立连接后,任何一方都可以自由的发送数据(SendData方法)和接收数据(GetData方法),这些方法都在DataArrival事件中。3.3编程实现过程 3.3.1 开发环境 操作系统:Windows 7旗舰版开发语言:C+ / MFC编译环境:MS Visual C+6.0 3.3.2 程序界面设计此程序根据功能需求,分别设计了客户端(图3-3-2-1)和服务器端(图3-3-2-2),实例如下:图3-3-2-1图3-3-2-2 3.3.3 关键模块分析1. 文件选取void CTCPClientDlg:OnSelect() int i;CFile MyFile;CString st

7、rlen;CFileDialog FileDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,"All Files (*.*)|*.*|",NULL);if(FileDlg.DoModal() = IDOK)m_FilePath = FileDlg.GetPathName();GetDlgItem(IDC_FLIENAME)->SetWindowText(m_FilePath);i = m_FilePath.ReverseFind('');m_Fi

8、leName = m_FilePath.Mid(i + 1);/m_FileName = FileDlg.GetFileTitle();MyFile.Open(m_FilePath,CFile:modeRead);m_FileLen = MyFile.GetLength();strlen.Format("%u bytes",m_FileLen);GetDlgItem(IDC_STATIC_LEN)->SetWindowText(strlen);MyFile.Close();/MyFile.Open(m_FilePath,CFile:modeRead);/UpdateD

9、ata(FALSE);2. 文件发送UINT SendTread(LPVOID lpParam) int iRxNum=0,iTxNum=0;/每次接受,发送,读取文件的字符数UINT iTotal = 0;/已发送文件长度CFile MyFile;CString TempName,str;CTCPClientDlg* m_pDlg=(CTCPClientDlg*)lpParam;CProgressCtrl* m_ProgressCtrl1=&(m_pDlg->m_ProgressCtrl);ClientSocket* pSocket = m_pDlg->m_pMySock

10、et; memset(sendbuf1,0,M);/发送文件大小以及名字sendbuf10=m_FileLen/1000000000+48; sendbuf11=m_FileLen%1000000000/100000000+48;sendbuf12=m_FileLen%100000000/10000000+48;sendbuf13=m_FileLen%10000000/1000000+48;sendbuf14=m_FileLen%1000000/100000+48;sendbuf15=m_FileLen%100000/10000+48;sendbuf16=m_FileLen%10000/100

11、0+48;sendbuf17=m_FileLen%1000/100+48;sendbuf18=m_FileLen%100/10+48;sendbuf19=m_FileLen%10+48; a=strlen(m_FilePath);sendbuf110=a/1000+48; sendbuf111=a%1000/100+48;sendbuf112=a%100/10+48;sendbuf113=a%10+48;if(N-10-4-a)>=m_FileLen) times=1; else times=1+(m_FileLen-(N-10-4-a)/N+1;/表示最少两次,第一次和最后一次 /进度

12、条初始化m_ProgressCtrl1->SetRange(0,times-1) ;m_ProgressCtrl1->SetPos(0) ; m_ProgressCtrl1->SetStep(1); strcat(sendbuf1,(char*)m_FilePath.GetBuffer(m_FileLen); pSocket->Send(sendbuf1,10+4+a,0); /m_ProgressCtrl;/开始传输文件数据str.Format("开始传送文件.");m_pDlg->UpdateMGData(str);MyFile.Open(

13、m_FilePath,CFile:modeRead);if(times=1) memset(rx_buf,0,4); memset(SendBuff,0,sizeof(SendBuff); MyFile.Read(SendBuff,m_FileLen); iTxNum = pSocket->Send(SendBuff,m_FileLen,0); pSocket->Receive(rx_buf,4,0); while(rx_buf0!='K') pSocket->Receive(rx_buf,4,0); m_ProgressCtrl1->StepIt();

14、 MyFile.Close(); str.Format("文件传送完毕,断开连接!"); m_pDlg->UpdateMGData(str);else memset(SendBuff,0,sizeof(SendBuff); full_times=times-2; Times=times; Times=Times-1; MyFile.Read(SendBuff,N-10-4-a); iTxNum = pSocket->Send(SendBuff,N-10-4-a,0); while(Times-) if(Times=0) memset(rx_buf,0,4);me

15、mset(SendBuff,0,sizeof(SendBuff);MyFile.Read(SendBuff,m_FileLen-(N-10-4-a)-N*full_times); pSocket->Receive(rx_buf,4,0);/如果收到K,则完成 while(rx_buf0!='K')pSocket->Receive(rx_buf,4,0);iTxNum = pSocket->Send(SendBuff,m_FileLen-(N-10-4-a)-N*full_times,0);m_ProgressCtrl1->StepIt(); str.Fo

16、rmat("文件传送完毕,断开连接!"); m_pDlg->UpdateMGData(str); break; if(Times>0) memset(rx_buf,0,4); memset(SendBuff,0,sizeof(SendBuff); MyFile.Read(SendBuff,N); pSocket->Receive(rx_buf,4,0);/如果收到K,则完成 while(rx_buf0!='K') pSocket->Receive(rx_buf,4,0); iTxNum = pSocket->Send(SendBuff,N,0); m_ProgressCtrl1->StepIt(); /对应whilere

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论