Сетевой кодинг на чистом VB(то есть без дополнительных ОСХ'ов) занятие трудное и неблагодарное. Практически всегда приходится писать файлы-объявления процедур и констант да и работа с многочисленными свойствами много радости не принесет.
Поэтому, прежде чем писать статьи на это интересную тему, я решил сделать несколько переводов статей моих зраубежных коллег.(!!! Все переводы выполнены вручную, без использования каких-либо словарей и программ переводчиков) Оригинал www.qb45.com (в разделе VB-Internet).
Хочу сказать спасибо:
Моим учителям английского - за предоставленные знания
Rammstein,Offspring,Orgy,Scooter - за поддержку
Bypasser'y - за то, что прерывал мою работу рассказами о 3DS MAX 4.2
Итак, мы начинаем
Интернет - Передача файлов :
В этой статье я расскажу о передаче файлов между твоим компьютером и сервером, расположенном в интернете. Темы, касающиеся разработки вебсайта, а также создания различных скриптов здесь не рассматриваются.
В Professional и Enterprise версиях языка Visual Basic есть два контрола, которые позволяют работать с Интернетом - Internet Transfer Control и Web Browser Control. Первый позволяет передавать файлы по HTTP и FTP протоколам. Ему и посвящена эта статья.
Также в арсенале кодера имеется wininet.dll.Файл wininet.dll обычная библиотека-dll, содержащая функции, применимые к передаче файлов по инету. Да, этот файл не входит в поставку Visual Basic'a, он устанавливается вместе с Internet Explorer'ом, а значит есть на большинстве компьютеров.
Почему же нам следует использовать именно Internet Transfer Control? Видимо потому, что для него просто описываются все функции, а это немаловажно.Ну и работа напрямую с "объеком". "Минус" контрола в его размере - он весит 126 килобайт. Все VB-кодеры знают, что для передачи своих проектов на другие компы они должны укомплектовать саму программу всеми библиотеками, а это часто может весить 800 кб.
Если же использовать wininet.dll, то проблема с размером пропадает да и возможностей при кодинге побольше будет. Правда как раз кодить будет тяжелее, т.к. это не VB библиотека и никаких комментариев к её использованию вы не встретите.
Протоколы :
В нашей работе мы будет использовать два основных протокола - HTTP и FTP. Протоколы - это простые, общепризнаные правила, которые используются как раз для передачи любой информации( таким образом и происходит связь между компьютерами через модем).
Проводить параллели и искать сходства между двумя протоколами я не буду, в пределах статьи это не столь принципиально. Единственное, что нужно знать, это то, что кодинг для HTTP и FTP даже при использовании одного контрола(Internet Transfer Control) отличается.
Большинство серверов поддерживают как HTTP, так и FTP.Поэтому нет большой разницы, с каким протоколом работать. Едиственное, почему лучше использовать FTP - большее количество свойств, которое можно описать и проконтролировать при кодинге. Если же вы хотите сделать update-plugin для своей программы, то, видимо, это лучше сделать через HTTP.
Вот почему я пришел к такому решению :
+ FTP - Большинство провайдеров не позволяют коннектится к их серверам с anonymous логином и пассвордом, то есть вообще без них. "Зашивать" в программу свою конфиденциальную информацию я бы не стал. Можно выделить на сайте одну директорию с отдельным логином и пассвордом и обращаться только к ней, но и этого бывает вполне достаточно для хака.
+ HTTP - Писать код для HTTP намного проще.
Также минусом этого контрола является то, что он не позволяет определять количество скачанной информации. То есть все любители смотреть на заполняющиеся прогрессбары обламываются. Можно лишь показывать продолжается ли скачивание или оно уже закончилось.
Использование метода OpenURL при передаче файлов :
Вот и закончилось вступление :-), пора приступать к решительным действиям. Самое главное, что нужно уяснить при работе с Internet Transfer Control - есть два метода скачивания файлов - OpenURL и Execute. Оба этих метода поддерживаются как FTP, так и HTTP протоколами.
Метод OpenURL достаточно прост в использовании.В качестве параметров нужно задать полный адрес на сервере и указать текстовый это или бинарный файл. Для скачивания текстового файла код будет выглядеть так :
Dim bData() as Byte
bData() = inet1.OpenURL ("http://www.vbinformation.com/badclick.htm", icByteArray)
Любые файлы, как строковые так и бинарные могу быть переданы в виде бинарных(двоичных). В первом случае весь скачанный файл будет расположен в текстовом поле text1.text. Во втором же случае этот же файл будет сохранен в массив байтов, границей которого будет число скачанных байтов. По методу OpenURL проходят как FTP так и HTTP адреса.
Бинарный массив можно сохранить в файл :
Open "filename" for Binary as #1
Put #1, , bData()
Close #1
Этого вполне достаточн для полноценного скачивания файлов с сервера.
Использование метода Execute :
Execute - второй метод, который можно использовать для передачи файлов. Сам по себе он более сложный, но возможностей у него побольше. Очень часто(это что баг такой?) ITC помещает скачанные байты в буффер памяти. Чтобы получить всю информацию из этого буффера, нужно воспользоваться коммандой GetChunk. Возможность выбора места сохранения появляется при описании самой функции.
Другое отличие метода - ассинхронность - возможность мгновенного исполнения кода при скачивании файла в фоновом режиме.
Да, у Execute есть различие в задании FTP и HTTP адресов.
Для передачи файлов по FTP используются только два первых аргумента. Для HTTP сохраняются все аргументы.
Вот пример работы с FTP сервером :
inet1.Execute ("ftp://www.microsoft.com", "DIR")
Эта комманда выведет листинг корневой директории на сервера Microsoft. В отличие от OpenURL Execute сразу сохраняет данные в заданный файл.
Execute поддерживает 14 стандартных комманд для работы с FTP (они прописываются в аргументе operation), но мы будем использовать основных 3 - CD,GET и PUT
Первая позволяет перемещаться по директориям на сервере. Вторая отвечает за скачивание файла, а третья за закачивание(аплоад). Все действия производятся относительно текущей директории.
При использовании комманд GET и PUT стек памяти ITC не используется. Однако мы должны использовать эту память для получения значений DIR и некоторых других целей. Для этого мы будем использовать один единственный Event этого контрола - StateChanged. Он может возвращать такие значения :
Правда реальный ответ дают только 8,11 и 12. Остальные в основном используются для создания необходимой индикации(всяко разные тулбары и лейблы).
State = 12 показывает, что скачка завершена. Например можно использовать в popup- или MsgBox-окнах.
State = 11 инфомирует о том, что произошла ошибка. На него стоит ссылаться при описании кода ошибки.
В большинстве случаев программер спокойно дожидается того момента, когда даунлоад завершится(State = 12). Но иногда нужно прервать этот процесс(видимо автор имеет ввиду скачивание файла по частям). Например, хедер HTML скачивается первым, но не включается в буфер хранения в ITC. Чтобы его получить нужно использовать .GetHeader метод. Для проверки объема скачанной информации(наличие скачанного хедера) можно использовать State = 8
Пример для State = 12 (полный download)
Do
DoEvents
bData = inet1.GetChunk (1024, icString)
AllData = AllData & bData
Loop Until bData = ""
Если получено выходное значение State = 8, то, возможно, что конкретных данных в буфере нет(то есть получен только один хедер). Следовательно условие(bData = "" -> скачивание complete) может и не выполняться.
Также не забудьте об использовании о методов .UserName и .Password при скачивании файлов по FTP. Даже если сервер поддерживает anonymous-логин, то это не значит что этот аккаунт не надо устанавливать.
В ITC используется 19 свойств, 5 методов и 1 эвент.
Properties
Methods
Events
AccessType
Cancel
StateChanged
Document
Execute
hInternet
GetChunk
Password
GetHeader
Protocol
OpenURL
Proxy
RemoteHost
RequestTimeout
ResponseCode
ResponseInfo
StillExcuting
URL
UserName
Плюс стандартные свойства компонента .Index, .Left, .Top, .Tag, .Parent и .hInternet.
Все эти группы можно разделить по другому :
Основные
.OpenURL
.Execute + .GetChunk
В процессе работы
.URL, .Cancel, .StillExecuting, .ResponseCode,
.ResponseInfo, .Cancel, .GetChunk и .GetHeader
Начальные установки
.AccessType, .Proxy, .Protocol, .RequestTimeout,
.RemoteHost, .UserName, .Password, и .RemotePort
Последние задаются только один раз.
Вот и сказoчке конец. Правда сказочка эта вышла малость непонятная, басурманская. Правильность перевода 99%, предполагаю, что автор также знал тему, как и я. Поэтому вывод : следующей моей статьёй будет практическая работа с ITC.Ждите.