用WinInet開發Internet用戶端應用指南(二)
二、實現步驟 大家知道,每個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的技術資訊。(完) |