二、實現步驟
大家知道,每個Internet客戶端程序都伴隨有一定的目的行為,如讀文件、寫文件、刪除文件等等。客戶端的程序要實現這些行為的先決條件是建立Internet連接。然後再根據不同的目的進行具體的操作。為了方便起見,下面這這些張表格針對不同的應用行為列出了所需要的具體操作。其中列出了一般的Internet URL (FTP、或者 HTTP)客戶端行為要實現某個目標所必須使用的方法。這張表格的內容來自MSDN。我對部分我認為重要的地方做了補充。
(表一)一個典型的Internet客戶端程序的處理流程 目的 方法 結果 開始一個Internet session 創建 CInternetSession 對象 初始化WinInet,並連接服務器 讀取或設置 InternetQuery 選項 (如超時或重試次數) 調用 CInternetSession::SetOption 不成功返回FALSE 建立回調函數監視session狀態 調用CInternetSession::EnableStatusCallback
建立回調函數
CInternetSession::OnStatusCallback,重寫OnStatusCallback,創建自己的回調例程 Internet服務器Intranet服務器或本地文件 調用 CInternetSession::OpenURL 解析並打開到指定服務器的連接,返回CStdioFile(如果你傳遞的OpenURL是本地文件名)或CInternetFile對象,通過存取這個對象,獲得服務器或文件的數據 讀文件 調用 CInternetFile::Read 用你提供的Buffer讀指定的字節數 異常處理 在 CInternetException 類中處理 處理所有普通的 Internet 異常類型 結束 Internet session 處理 CInternetSession對象 自動清除打開的句柄的連接(表二)典型的 FTP 客戶端程序實現的一般步驟
目的 方法 結果 開始一個FTP會話,建立一個FTP連接 創建一個CInternetSession對象,調用CInternetSession::GetFtpConnection 初始化WinInet
並聯接服務器
連接到一個FTP Server 用CInternetSession::GetFtpConnection 返回一個CFtpConnection對象 CD到 FTP 服務器的一個新目錄 用CFtpConnection::SetCurrentDirectory CD到FTP服務器的一個新目錄
Find 第一個FTP目錄中的文件 創建一個CFtpFileFind對象,調用CFtpFileFind::FindFile,OpenURL函數返回一個只讀資源對象;調用CFtpFileFind::FindFile Find第一個文件,如果文件每找到返回FALSE 枚舉所有可獲得的資源,Find下一個FTP目錄中的文件 Find下一個資源,調用CFtpFileFind::FindNextFile直到返回FALSE。 Find下一個文件如果文件沒找到返回FALSE
打開FindFile或FindNextFile找到的文件(用於讀寫) 調用CFtpConnection::OpenFile,參數為FindFile或FindNextFile返回的文件名 ,創建並打開一個CInternetFile對象 打開FindFile或FindNextFile找到的文件(用於讀寫),返回一個CInternetFile對象 讀寫文件 以讀方式打開FTP文件,用CInternetFile::Read 使用你指定的緩沖讀指定的字節數
寫FTP文件 以寫方式打開FTP文件,調用CInternetFile::Write,重寫CInternetSession::OnStatusCallback 使用你指定的緩沖寫指定的字節數
改變客戶端在服務器上的目錄 調用CFtpConnection::SetCurrentDirectory 進入新的目錄 獲取客戶端在服務器上的當前目錄 調用CFtpConnection::GetCurrentDirectory 獲取目錄信息 異常處理 用CInternetException類 處理所有普通的Internet異常類型 結束FTP session 處理CInternetSession對象 自動清除打開的句柄的連接
(表三)顯示了一個典型的刪除文件的FTP客戶端應用要實現的一般步驟:
目的 方法 結果 開始一個FTP session 創建一個CInternetSession對象 初始化WinInet
並聯接服務器
連接到一個FTP Server 用CInternetSession::GetFtpConnection 返回一個CFtpConnection對象 檢查FTP目錄是否正確 用CFtpConnection::GetCurrentDirectory或CFtpConnection::GetCurrentDirectoryAsURL 返回目錄名字服務器目錄或返回目錄的URL
CD(改變目錄)到 FTP 服務器的一個新目錄 用CFtpConnection::SetCurrentDirectory CD到FTP服務器的一個新目錄
Find 第一個FTP目錄中的文件 用CFtpFileFind::FindFile Find第一個文件,如果文件每找到返回FALSE Find 下一個FTP目錄中的文件 用CFtpFileFind::FindNextFile Find下一個文件如果文件沒找到返回FALSE
刪除FindFile或FindNextFile找到的文件 用CFtpConnection::Remove用FindFile或FindNextFile返回的文件名 刪除FindFile或FindNextFile找到的文件
異常處理 用CInternetException類 處理所有普通的Internet異常類型 結束FTP session 處理CInternetSession對象 自動清除打開的句柄的連接(表四)顯示了實現一個典型的 HTTP 客戶端應用程序的一般步驟:
目的 方法 結果 開始HTTP會話,建立HTTP連接 創建 CInternetSession對象,調用CInternetSession::GetHttpConnection
創建CHttpConnection對象
初始化WinInet並聯接服務器,返回一個CHttpConnection對象 創建一個 HTTP 請求 調用CHttpConnection::OpenRequest創建一個CHttpFile對象;
返回一個CHttpFile對象 發送一個HTTP 請求 用CHttpFile::AddRequestHeaders 並且用CHttpFile::SendRequest Find一個文件如果文件沒找到返回FALSE
讀文件 調用CInternetFile::Read 使用你提供的緩沖讀指定的字節 獲取HTTP請求信息 調用CHttpFile::QueryInfo 從服務器獲取HTTP請求頭信息 異常處理 利用CInternetException類 處理所有普通的Internet異常類型 結束 HTTP 會話 處理CInternetSession對象 自動清除打開的句柄的連接由於時間關系,我沒有寫本文的例子代碼。不過MSDN裡有兩個簡單的例子可以參考,一個是FTPTREE,另一個是TEAR。此外,也可以用“WinInet”作為關鍵字在google裡搜一下也能找到一些使用MFC WinInet的技術信息。