掌握实现网络文件传输的方法,并了解TCP连接是字符流的
使用CSocket实现单线程文件传输
应用多线程技术结合CAsyncSocket实现文件传输
加入异常控制语句,增强程序的鲁棒性(Robust)
了解如何提高套接字传输的速率及如何加强传输的稳定性
·单线程文件传输:
在第一章中曾经讲过用windows socket传输数据的方法,本章的单线程文件传输实验要在这个基础上融入文件操作,以实现基本的文件传输。
·多线程文件传输:
在文件传输程序中,一个线程是一个搬运工,负责把文件数据从网络(看作是一条走廊)的一个端点搬到另一个端点;使用多线程,就相当于请了多个搬运工来做这项工作,效率自然会提高。但是有一个疑问:“既然多个工人一起搬会提高工作进度,那是不是人越多越好呢?”——当然不是。因为既然把网络看成一条走廊,那么当走廊中拥满了人的时候,这些人就成了搬运工作的瓶颈。所以选择一个适当的线程数,对多线程传输的性能(传输速率)会有重要的影响(这一问题还会在后面探讨)。
由于多线程文件传输的实现涉及线程的同步的问题,所以实现和调试起来都有一定的困难。但应当相信这是一项有趣的工作,因为多线程技术能把局域网传输的潜力充分的挖掘出来!
建议读者再看实验步骤之前,先阅读一下文章末尾的【注意事项】一节。这将有助于更好的理解本章的实现。
一.单线程文件传输 (I):
·服务器端(负责发送数据)的实现
建立一个基于对话框的工程Server,并在建立的过程中选择支持windows socket。
在对话框上添加“发送”按钮。
为“发送”按钮添加事件BN_CLICKED的响应函数OnSend()。
void CServerDlg::OnSend()
{
// TODO: Add your control notification handler code here
C fd(TRUE); // C是MFC提供的一个用于选择文件的对话框类
CString ;
char fn[40];
CSocket listenSocket, socketSend;
C;
long ;
char* data;
if(IDOK==()) // 启动用于选择文件的对话框
{
//选择了文件
(); // 获取用户选择的文件的文件名
if(!((0),C ))
{
AfxMessageBox(" 打开文件错误,取消发送!");
return;
}
strcpy(fn,(0));
}
else return; //按了取消按钮
(7000,SOCK_STREAM);
(5);
(socketSend);
= (); // 获取文件的长度
(&, 4); // 把要发送的文件的长度传送给对方
(fn,40); // 发送要传送的文件的文件名
data = new char[]; //分配一块和要传输的文件一样大小的内存空间
(data, ); //把文件中所有的数据一次性读入data
(data, ); //把data中的数据都发送出去
();
delete data;
();
}
·客户端(负责接收数据)的实现
建立一个基于对话框的工程,并在建立的过程中选择支持windows socket。(为了能够利用Server端的代码,在程序编写时,可以复制Server的代码到Client目录,并在Server的基础上修改或添加代码)
在对话框上添加“接收”按钮。
为“发送”按钮添加事件BN_CLICKED的响应函数OnReceive ()。
void CServerDlg::OnReceive()
{
// TODO: Add your control notification handler code here
CSocket socketReceive;
C;
long ;
char * data;
char fn[40];
();
("", 7000);
vc 网络文件传输 来自淘豆网m.daumloan.com转载请标明出处.