MFC之HTTP客户端应用程序

MFC之HTTP客户端应用程序

一、建立会话(Session)对象:

       CInternetSession mysession;

二、连接到Http服务器:

      CHttpConnection *myconn=mysession.GetHttpConnection("www.baidu.com");

三、打开Http请求:

      CHttpFile *myfile=myconn->OpenRequest("GET","/index.html");

四、发送Http请求:

      myfile->SendRequest();

五、从服务器读取字节流(bytes):

      CString mystr;
      CString tmp;
      while(myfile->ReadString(tmp))
      {
           mystr+=tmp;
      }

六、释放资源:

     myfile->Close();
      myconn->Close();
     mysession.Close();
     delete myfile;
     delete myconn;
     myfile=0;
     myconn=0;

     步骤基本如上,上例各函数参数主要使用默认参数,具体函数声明请查阅MSDN。另外别忘了异常处理!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1、下载文件
Download(const CString& strFileURLInServer, //待下载文件的URL
const CString & strFileLocalFullPath)//存放到本地的路径
{
 ASSERT(strFileURLInServer != "");
 ASSERT(strFileLocalFullPath != "");
 CInternetSession session;
 CHttpConnection* pHttpConnection = NULL;
 CHttpFile* pHttpFile = NULL;
 CString strServer, strObject;
 INTERNET_PORT wPort;

 

 DWORD dwType;
 const int nTimeOut = 2000;
 session.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, nTimeOut); //重试之间的等待延时
 session.SetOption(INTERNET_OPTION_CONNECT_RETRIES, 1);   //重试次数
 char* pszBuffer = NULL;  

 

 try
 {
  AfxParseURL(strFileURLInServer, dwType, strServer, strObject, wPort);
  pHttpConnection = session.GetHttpConnection(strServer, wPort);
  pHttpFile = pHttpConnection->OpenRequest(CHttpConnection::HTTP_VERB_GET, strObject);
  if(pHttpFile->SendRequest() == FALSE)
   return false;
  DWORD dwStateCode;

 

  pHttpFile->QueryInfoStatusCode(dwStateCode);
  if(dwStateCode == HTTP_STATUS_OK)
  {
    HANDLE hFile = CreateFile(strFileLocalFullPath, GENERIC_WRITE,
         FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,
         NULL);  //创建本地文件
   if(hFile == INVALID_HANDLE_VALUE)
   {
    pHttpFile->Close();
    pHttpConnection->Close();
    session.Close();
    return false;
   }
 
   char szInfoBuffer[1000];  //返回消息
   DWORD dwFileSize = 0;   //文件长度
   DWORD dwInfoBufferSize = sizeof(szInfoBuffer);
   BOOL bResult = FALSE;
   bResult = pHttpFile->QueryInfo(HTTP_QUERY_CONTENT_LENGTH,
           (void*)szInfoBuffer,&dwInfoBufferSize,NULL);

 

   dwFileSize = atoi(szInfoBuffer);
   const int BUFFER_LENGTH = 1024 * 10;
   pszBuffer = new char[BUFFER_LENGTH];  //读取文件的缓冲
   DWORD dwWrite, dwTotalWrite;
   dwWrite = dwTotalWrite = 0;
   UINT nRead = pHttpFile->Read(pszBuffer, BUFFER_LENGTH); //读取服务器上数据

 

   while(nRead > 0)
   {
    WriteFile(hFile, pszBuffer, nRead, &dwWrite, NULL);  //写到本地文件
    dwTotalWrite += dwWrite;
    nRead = pHttpFile->Read(pszBuffer, BUFFER_LENGTH);
   }

 

   delete[]pszBuffer;
   pszBuffer = NULL;
   CloseHandle(hFile);
  }
  else
  {
   delete[]pszBuffer;
   pszBuffer = NULL;
   if(pHttpFile != NULL)
   {
    pHttpFile->Close();
    delete pHttpFile;
    pHttpFile = NULL;
   }
   if(pHttpConnection != NULL)
   {
    pHttpConnection->Close();
    delete pHttpConnection;
    pHttpConnection = NULL;
   }
   session.Close();
    return false;
  }
 }
 catch(...)
 {
  delete[]pszBuffer;
  pszBuffer = NULL;
  if(pHttpFile != NULL)
  {
   pHttpFile->Close();
   delete pHttpFile;
   pHttpFile = NULL;
  }
  if(pHttpConnection != NULL)
  {
   pHttpConnection->Close();
   delete pHttpConnection;
   pHttpConnection = NULL;
  }
  session.Close();
  return false;
 }

 

 if(pHttpFile != NULL)
  pHttpFile->Close();
 if(pHttpConnection != NULL)
  pHttpConnection->Close();
 session.Close();
 return true;
}

2、上传文件
bool Download(const CString& strFileURLInServer, //待下载文件的URL 
const CString & strFileLocalFullPath)//存放到本地的路径 

ASSERT(strFileURLInServer != ""); 
ASSERT(strFileLocalFullPath != ""); 
CInternetSession session; 
CHttpConnection* pHttpConnection = NULL; 
CHttpFile* pHttpFile = NULL; 
CString strServer, strObject; 
INTERNET_PORT wPort; 
bool bReturn = false; 

DWORD dwType; 
const int nTimeOut = 2000; 
session.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, nTimeOut); //重试之间的等待延时 
session.SetOption(INTERNET_OPTION_CONNECT_RETRIES, 1); //重试次数 
char* pszBuffer = NULL; 

try 

AfxParseURL(strFileURLInServer, dwType, strServer, strObject, wPort); 
pHttpConnection = session.GetHttpConnection(strServer, wPort); 
pHttpFile = pHttpConnection->OpenRequest(CHttpConnection::HTTP_VERB_GET, strObject); 
if(pHttpFile->SendRequest() == FALSE) 
return false; 
DWORD dwStateCode; 

pHttpFile->QueryInfoStatusCode(dwStateCode); 
if(dwStateCode == HTTP_STATUS_OK) 

HANDLE hFile = CreateFile(strFileLocalFullPath, GENERIC_WRITE, 
FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 
NULL); //创建本地文件 
if(hFile == INVALID_HANDLE_VALUE) 

pHttpFile->Close(); 
pHttpConnection->Close(); 
session.Close(); 
return false; 


char szInfoBuffer[1000]; //返回消息 
DWORD dwFileSize = 0; //文件长度 
DWORD dwInfoBufferSize = sizeof(szInfoBuffer); 
BOOL bResult = FALSE; 
bResult = pHttpFile->QueryInfo(HTTP_QUERY_CONTENT_LENGTH, 
(void*)szInfoBuffer,&dwInfoBufferSize,NULL); 

dwFileSize = atoi(szInfoBuffer); 
const int BUFFER_LENGTH = 1024 * 10; 
pszBuffer = new char[BUFFER_LENGTH]; //读取文件的缓冲 
DWORD dwWrite, dwTotalWrite; 
dwWrite = dwTotalWrite = 0; 
UINT nRead = pHttpFile->Read(pszBuffer, BUFFER_LENGTH); //读取服务器上数据 

while(nRead > 0) 

WriteFile(hFile, pszBuffer, nRead, &dwWrite, NULL); //写到本地文件 
dwTotalWrite += dwWrite; 
nRead = pHttpFile->Read(pszBuffer, BUFFER_LENGTH); 


delete[]pszBuffer; 
pszBuffer = NULL; 
CloseHandle(hFile); 
bReturn = true; 


catch(CInternetException* e) 

TCHAR tszErrString[256]; 
e->GetErrorMessage(tszErrString, ArraySize(tszErrString)); 
TRACE(_T("Download XSL error! URL: %s,Error: %s"), strFileURLInServer, tszErrString); 
e->Delete(); 

catch(...) 



if(pszBuffer != NULL) 

delete[]pszBuffer; 

if(pHttpFile != NULL) 

pHttpFile->Close(); 
delete pHttpFile; 

if(pHttpConnection != NULL) 

pHttpConnection->Close(); 
delete pHttpConnection; 

session.Close(); 
return bReturn; 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值