您的位置:首页 > 理论基础 > 计算机网络

MFC之HTTP协议编程

2014-01-09 16:36 197 查看
一、建立会话(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、下载文件

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;

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: