ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

         
     
    Створення простого HTTP-клієнта
         

     

    Інформатика, програмування

    Створення простого HTTP-клієнта

    У цій статті напишуть програму, яка може зчитувати файли з Internet по HTTP протоколу і записувати їх на диск.

    Для зв'язку з Internet в Visual C + + існує так званий WinInet Class. У нього входять декілька підкласів.

    Далі представлені ксасси WinInet:

    Класи Опис

    CInternetSession Створює Internet сесію. Всі MFC WinInet додатки повинні створювати CInternetSession об'єкт перед іспользрваніем інших WinInet класів.

    CInternetConnection Створює конект із Internet. Це базовий клас для класів CFtpConnection, CGopherConnection, і CHttpConnection.

    CFtpConnection Встановлює з'єднання по FTP протоколу.

    CGopherConnection Створює Gopher підключення.

    CHttpConnection Встановлює з'єднання по HTTP протоколу.

    CInternetFile Дозволяє віддалений доступ до файлів на Internet серверах. Це базовий клас для класів CGopherFile and CHttpFile.

    CGopherFile Дозволяє віддалений доступ до файлів на Gopher серверах.

    CHttpFile Дозволяє віддалений доступ до файлів на HTTP серверах.

    CFileFind Дозволяє шукати файли в Internet. Це базовий клас для класів CFtpFileFind and CGopherFileFind.

    CFtpFileFind Дозволяє шукати файли на FTP серверах.

    CGopherFileFind Дозволяє шукати файли на Gopher серверах.

    CGopherLocator відшукує Gopher пристрій вводу Що gopher сервера.

    CInternetException Управляє винятками, згенерований WinInet класом.

    Наша програма буде використовувати чотири класи WinInet: CInternetSession, CInternetFile, CHttpFile і CHttpConnection

    Далі будуть описані методи (функції) цих класів:

    Методи (функції) класу CInternetSession

    Опції Опис

    Close () Закриває Internet сесію.

    EnableStatusCallback () Дозволяє використовувати функцію повторного виклику, яка використовується для асинхронних дій.

    GetContext () Отримує значення контексту Internet сесії.

    GetFtpConnection () Встановлює підключення по FTP протоколу.

    GetGopherConnection () Встановлює підключення з Gopher серверами.

    GetHttpConnection () Встановлює підключення по HTTP протоклолу.

    OnStatusCallback () модифікує стан операції.

    OpenURL () З'єднується з даними URL.

    QueryOption () Сервіс перевірки помилки провайдера.

    ServiceTypeFromHandle () Отримує тип сервісу від Internet дескриптора.

    SetOption () Встановлює опції Internet сесії.

    Методи (функції) класу CInternetFile

    Опції Опис

    Abort () Закриває файл і ігнорує всі помилки.

    Close () Закриває файл.

    Flush () Скидає файл на диск.

    Read () Счативает байт з файлу.

    ReadString () зчитує рядок символів з файлу.

    Seek () перевстановлюємо покажчик усередині файлу.

    SetReadBufferSize () Встановлює розмір буферу для читання.

    SetWriteBufferSize () Встановлює розмір буферу для запису.

    Write () Записує байт в файл.

    WriteString () Записує рядок з нульовим символом в Наприкінці у файл.

    Методи (функції) класу CHttpFile

    Опції Опис

    AddRequestHeaders () Додає заголовок до HTTP запитом.

    Close () Закриває CHttpFile об'єкт.

    GetFileURL () Отримує URL файлу.

    GetObject () Отримує об'єкт по HTTP запиту.

    GetVerb () Отримує заголовок запиту.

    QueryInfo () Отримує відповідь або заголовок запиту.

    QueryInfoStatusCode () Отримує код стану HTTP запиту.

    SendRequest () Посилає HTTP запит.

    Далі напишемо код програми і розберемо кожен рядок:

    ...

    CString m_url = "mark5.dhtp.kiae.ru";// ім'я URL

    CString m_mes;// мінлива в якій будуть зберігатися повідомлення

    char temp [100];// проміжна змінна для перекладу

    // даних з Int в char

    CString m_path;// ім'я файлу для запису

    char strBody [1024];// буфер з 1024 байт

    ...

    int CHTTP_ClientDlg:: OnButtonConnect ()

    (

    // створюємо змінну session і відкриваємо сесію ANDY

    CInternetSession session (_T ( "ANDY"), PRE_CONFIG_INTERNET_ACCESS);

    // створюємо змінну pServer класу CHttpConnection

    CHttpConnection * pServer = NULL;

    // створюємо змінну pFile класу CHttpFile

    CHttpFile * pFile = NULL;

    /*

    Зверніть увагу, що всі запити до функцій членам WinInet класів включені в блок програми TRY.

    Це зроблено так, тому що при з'єднанні з яким або URL є ризик неправильної посилання,

    особливо, коли Ви вважаєте, що користувач сам друкує URL.

    Інша проблема - часи очікування, які виникають, коли потрібний URL в даний час

    нездатний обслужити підключення.

    Так само обробка WinInet винятків, які представлені в класі

    CInternetException, є важливою частиною створення Internet додатки під MFC.

    */

    try

    (

    CString strServerName;// ім'я сервера

    CString strObject; //Ім'я об'єкта

    INTERNET_PORT nPort;// номер порту для зв'язку

    DWORD dwServiceType;// тип сервісу

    // функція AfxParseURL отримує дані з вказаного URL (у нас m_url) про сервер,

    // об'єкті, тип сервісу і порте

    if (AfxParseURL (m_url, dwServiceType, strServerName, strObject, nPort) == 0)

    (

    return 1;// вихід із функції OnButtonConnect ()

    )

    // вивід даних про сервер

    m_mes = "";

    m_mes + = "Server Name =";

    m_mes + = (CString) strServerName; m_mes + = "rn";

    m_mes + = "Object Name =";

    m_mes + = (CString) strObject; m_mes + = "rn";

    m_mes + = "Port = ";

    itoa (nPort, temp, 10);

    m_mes + = (CString) & temp [0]; m_mes + = "rn";

    UpdateData (FALSE);

    // Встановлюємо підключення по HTTP протоклолу.

    pServer = session.GetHttpConnection (strServerName, nPort);

    // посилаємо запит про об'єкт (strObject)

    pFile = pServer-> OpenRequest (

    CHttpConnection:: HTTP_VERB_GET, strObject, NULL, 1, NULL, NULL,

    INTERNET_FLAG_EXISTING_CONNECT | INTERNET_FLAG_NO_AUTO_REDIRECT

    );

    // Додаємо заголовок до HTTP запиту

    pFile-> AddRequestHeaders ( _T ( "Accept: */* rnUser-Agent: ANDYrn"));

    // посилаємо запит

    pFile-> SendRequest ();

    DWORD dwRet;// змінна для збереження коду стану

    pFile-> QueryInfoStatusCode (dwRet);// записуємо код стану в dwRet

    // вивід даних

    m_mes + = "The HTTP GET returned a status code of ";

    itoa (dwRet, temp, 10);

    m_mes + = (CString) & temp [0]; m_mes + = "rn";

    CString strHeader;// змінна для зберігання отриманого заголовок запиту

    pFile-> QueryInfo (HTTP_QUERY_RAW_HEADERS_CRLF, strHeader);// записуємо заголовок у strHeader

    // вивід даних

    m_mes + = "Header =";

    m_mes + = strHeader;

    UpdateData (FALSE);

    // якщо код стану не дорівнює 200, то виходимо з функції

    if (dwRet! = 200) (M_mes + = "Program terminate!"; UpdateData (FALSE); return 1;)

    // -------------------------------------------------- --------

    // перевірка вибору файлу для запису

    m_mes + = "Starting download the file."; M_mes + = "rn";

    if (m_path == "")

    (

    m_mes + = "Error! No file to save. Choese the file .";

    m_mes + = "rn"; UpdateData (FALSE); return 1;)

    else

    (

    m_mes + = "File name to save: ";

    m_mes + = m_path; m_mes + = "rn"; UpdateData (FALSE);

    )

    CFile file2;// оголошуємо змінну file2 класу CFile

    // відкриваємо файл для запису в двійковому форматі ( CFile:: typeBinary) !!!

    file2.Open ((LPCTSTR) m_path,

    CFile:: modeCreate | CFile:: modeWrite | CFile:: typeBinary);

    int allRead = 0;// змінна для зберігання загального числи лічених байт

    int nRead = pFile-> Read (strBody, 1024);// зчитуємо перших 1024 байта в буфер.

    // мінлива nRead зберігає кількість

    // лічених байт

    allRead + = nRead;// оновлюємо загальне число лічених байт

    // вивід даних

    m_mes + = "Loading";

    itoa (nRead, temp, 10);

    m_mes + = (CString) & temp [0]; m_mes + = "bytes"; m_mes + = "rn";

    UpdateData (FALSE);

    // записуємо буфер з nRead байт в файл

    file2.Write (strBody, nRead);

    // цикл зчитування, поки nRead не буде дорівнювати нулю

    while (nRead> 0)

    (

    nRead = pFile-> Read (strBody, 1024);

    if (nRead! = 0)

    (

    m_mes + = "Loading";

    itoa (nRead, temp, 10);

    m_mes + = (CString) & temp [0]; m_mes + = "bytes"; m_mes + = "rn";

    file2.Write ( strBody, nRead);

    allRead + = nRead;

    UpdateData (FALSE );

    )

    )

    // вивід даних

    m_mes + = "rn";

    m_mes + = "Total bytes =";

    itoa (allRead, temp, 10);

    m_mes + = & temp [0]; m_mes + = "rn"; UpdateData (FALSE);

    file2.Close ();// закриваємо файл

    pFile-> Close (); //Закриваємо Internet файл

    pServer-> Close (); //Закриваємо сервер

    m_mes + = "Download is complete !!!"; m_mes + =" rn "; UpdateData (FALSE );

    )

    catch (CInternetException * pEx)

    (

    // Якщо сталася помилка в WinInet

    // вивід помилки

    char szErr [1024];

    pEx-> GetErrorMessage ( szErr, 1024);

    m_mes + = "Error: (";

    itoa ( int (pEx-> m_dwError), temp, 10);

    m_mes + = (CString) & temp [0];

    m_mes + = ") ";

    m_mes + = (CString) & szErr [0]; m_mes + = "rn";

    UpdateData (FALSE );

    pEx-> Delete (); //Видалення змінної класу CInternetException

    if (pFile! = NULL )

    delete pFile;// закриваємо Internet файл

    if (pServer! = NULL)

    delete pServer; //Закриваємо сервер

    session.Close ();// закриваємо сесію

    return 1;

    )

    if (pFile! = NULL )

    delete pFile;// закриваємо Internet файл

    if (pServer! = NULL)

    delete pServer;// закриваємо сервер

    session.Close ();// закриваємо сесію

    return 0;

    )

    Ну от і все, додаток готове.

    Список літератури

    Для підготовки даної роботи були використані матеріали з сайту http://www.realcoding.net/

         
     
         
    Реферат Банк
     
    Рефераты
     
    Бесплатные рефераты
     

     

     

     

     

     

     

     
     
     
      Все права защищены. Reff.net.ua - українські реферати ! DMCA.com Protection Status