Форум: "Прочее";
Текущий архив: 2009.07.26;
Скачать: [xml.tar.bz2];
ВнизПрограмно сделать GET запрос веб серверу и получить ответ. Найти похожие ветки
← →
@!!ex © (2009-05-19 19:06) [0]Как проще всего сделать?
← →
clickmaker © (2009-05-19 19:11) [1]> проще всего
TIdHttp
или функции WinInet
← →
@!!ex © (2009-05-19 19:13) [2]Ага. Нашел пример на WinInet. а можно получить файл в буффера, а не на винчестер?
← →
clickmaker © (2009-05-19 19:18) [3]а как в примере сразу на винчестер?
← →
@!!ex © (2009-05-19 19:29) [4]var
FileOnNet, LocalFileName: string
begin
FileOnNet := "http://its_your_site.ru/library/DelphiWorld.zip";
LocalFileName := "C:\DelphiWorld.zip";
if GetInetFile(FileOnNet, LocalFileName) = True then
ShowMessage("Download successful")
else
ShowMessage("Error in file download");
end;
← →
clickmaker © (2009-05-19 19:34) [5]> GetInetFile
а что это за функция?
собственно, апишная InternetReadFile и читает в буфер
← →
@!!ex © (2009-05-19 20:22) [6]Точно! Я не обратил внимание на другую страницу с кодом.
Там как раз GetInetFile и реализовано.
← →
@!!ex © (2009-05-19 20:59) [7]Написал функцию... она отрабатывает только ОДИН раз!
При повторных вызовах возвращается старое значение:function GetTextFileFromHTTP(const fileURL: string): string;
const
BufferSize = 1024;
var
hSession, hURL: HInternet;
Buffer: array[1..BufferSize] of char;
s:string;
BufferLen: DWORD;
f: file;
sAppName: string;
begin
Result := "";
sAppName := ExtractFileName(Application.ExeName);
hSession := InternetOpen(PChar(sAppName),
INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
try
hURL := InternetOpenURL(hSession, PChar(fileURL), nil, 0, 0, 0);
try
repeat
InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
s:=Buffer;
SetLength(s,BufferLen);
Result:=Result+s;
until
BufferLen = 0;
finally
InternetCloseHandle(hURL);
end;
finally
InternetCloseHandle(hSession);
end;
end;
← →
Zeqfreed © (2009-05-19 21:05) [8]Кэшируется вестимо.
← →
@!!ex © (2009-05-19 21:05) [9]Я так и понял... А как этого избежать?
← →
@!!ex © (2009-05-19 21:07) [10]Нашел такой пример:
Uses WinINet;
и добавить к TButton следующий обработчик btnEmptyCache:
Procedure TfrmMain.btnEmptyCacheClick( Sender : TObject );
Var
lpEntryInfo : PInternetCacheEntryInfo;
hCacheDir : LongWord;
dwEntrySize : LongWord;
dwLastError : LongWord;
Begin
dwEntrySize := 0;
FindFirstUrlCacheEntry( NIL, TInternetCacheEntryInfo( NIL^ ), dwEntrySize );
GetMem( lpEntryInfo, dwEntrySize );
hCacheDir := FindFirstUrlCacheEntry( NIL, lpEntryInfo^, dwEntrySize );
If ( hCacheDir <> 0 ) Then
DeleteUrlCacheEntry( lpEntryInfo^.lpszSourceUrlName );
FreeMem( lpEntryInfo );
Repeat
dwEntrySize := 0;
FindNextUrlCacheEntry( hCacheDir, TInternetCacheEntryInfo( NIL^ ), dwEntrySize );
dwLastError := GetLastError();
If ( GetLastError = ERROR_INSUFFICIENT_BUFFER ) Then Begin
GetMem( lpEntryInfo, dwEntrySize );
If ( FindNextUrlCacheEntry( hCacheDir, lpEntryInfo^, dwEntrySize ) ) Then
DeleteUrlCacheEntry( lpEntryInfo^.lpszSourceUrlName );
FreeMem(lpEntryInfo);
End;
Until ( dwLastError = ERROR_NO_MORE_ITEMS );
End;
← →
@!!ex © (2009-05-19 21:09) [11]одной строчки достаточно:
DeleteUrlCacheEntry( ГКД);
← →
@!!ex © (2009-05-19 21:09) [12]ГКД == URL
← →
Zeqfreed © (2009-05-19 21:10) [13]InternetOpenUrl + INTERNET_FLAG_PRAGMA_NOCACHE, INTERNET_FLAG_NO_CACHE_WRITE может быть проще? :)
Вообще по-моему использовать этот API экплореровский более геморно, чем послать две строчки по сокету.
← →
DVM © (2009-05-19 21:31) [14]
> Zeqfreed © (19.05.09 21:10) [13]
> Вообще по-моему использовать этот API экплореровский более
> геморно, чем послать две строчки по сокету.
Полностью согласен. Мне вообще непонятно, зачем этот API наворотили сверху. Он не шибко упрощает, а скорее усложняет работу с HTTP.
← →
@!!ex © (2009-05-19 21:39) [15]Работа с сетью для меня темный лес, спросил совета, мне ответили. Нашел решение, сделал. :)
Может и лучше сделать на АПИ - но знаний нету...
А это вроде справляется с работой.
← →
DVM © (2009-05-19 21:42) [16]
> @!!ex © (19.05.09 21:39) [15]
А через TIdHttp вообще то же самое чуть ли не одной строкой делается.
← →
@!!ex © (2009-05-19 21:48) [17]Ага. Вот только я не знаю где его брать в Explorer"e
← →
DVM © (2009-05-19 21:50) [18]
> Ага. Вот только я не знаю где его брать в Explorer"e
Там Indy нету что ли? Не знал. Но это тоже не проблема, скачиваешь инди, папочку добавляешь в пути поиска, динамически создаешь его.
← →
@!!ex © (2009-05-19 21:52) [19]ИНди вроде ставится, но куда и как - я без понятия.
Было два варианта, попробовал и сделал тем, который проще получился.
Подскажите статей по реализации обмена сообщениями через UDP.
← →
@!!ex © (2009-05-19 21:52) [20]Интересует максимально быстрый способ. Поэтому всякие компоненты использовать не хочется...
← →
DVM © (2009-05-19 22:02) [21]
> Подскажите статей по реализации обмена сообщениями через
> UDP.
Сообщения сообщениям рознь. Что за сообщения? Нужен ли контроль доставки пакета? Максимально быстро - это без какого либо контроля. На Winsock.
← →
тимохов © (2009-05-19 22:11) [22]пользуй wininet. у розыча на сайте есть пример, вполне рабочий.
← →
Сергей М. © (2009-05-19 22:20) [23]
> максимально быстрый способ. Поэтому всякие компоненты использовать
> не хочется
Задержки, вносимые работой компонентных оболочек UDP-транспорта, ничтожно малы по сравнению со скоростью работы самого транспорта в реальных сетевых условиях.
← →
turbouser © (2009-05-19 22:23) [24]
> @!!ex © (19.05.09 21:52) [19]
> Подскажите статей по реализации обмена сообщениями через
> UDP.
UDP не предназначен для этого.
Расстреливать на месте надо чатописателей, использующих UDP...
← →
DVM © (2009-05-19 22:28) [25]
> turbouser © (19.05.09 22:23) [24]
> UDP не предназначен для этого.
C чего ты взял что ему для чата? А почему бы и нет собственно? Какая разница UDP или TCP. Гарантии доставки только нет.
← →
@!!ex © (2009-05-19 22:33) [26]
> [21] DVM © (19.05.09 22:02)
> Максимально быстро - это без какого либо контроля. На Winsock.
Именно поэтому UDP, а не TCP. Потеря пакетов не критична, скорость приоритетна.
> [22] тимохов © (19.05.09 22:11)
> пользуй wininet. у розыча на сайте есть пример, вполне рабочий.
А насколько это быстро по скорости?
> [23] Сергей М. © (19.05.09 22:20)
> Задержки, вносимые работой компонентных оболочек UDP-транспорта,
> ничтожно малы по сравнению со скоростью работы самого транспорта
> в реальных сетевых условиях.
Понятно...
> [24] turbouser © (19.05.09 22:23)
> [25] DVM © (19.05.09 22:28)
Ганатия доставки в моем случае ЗЛО.
Потеря половины пакетов меньшее зло, чем задержка из-за потерянного пакета и в результате доставка устаревшего пакета.
← →
DVM © (2009-05-19 22:36) [27]
> @!!ex © (19.05.09 22:33) [26]
> Ганатия доставки в моем случае ЗЛО.
Обмен информацией в сетевой игре это что ли?
← →
тимохов © (2009-05-19 22:37) [28]2Автор, тебе же сказали - любой компонент вносит сотые доли процента в общую скорость - все остальное сетевая передача.
wininet - это библиотека, используемая в IE.
← →
@!!ex © (2009-05-19 22:40) [29]> [27] DVM © (19.05.09 22:36)
Да. Собственно первая часть вопроса нужна была чтобы получить список доступных игровых серверов, который лежит на сервере в виде текстового файла.
Информация игровая обновляется 5 раз в секунду. Соответственно уходит 5 пакетов в секунду.
Если половина сдохнет, будет задержка в отображении. Что не есть страшно в моем случае.
Это от клиента к серверу.
В другую сторону(от сервера к клиенту) потеря страшнее, поэтому данные уходят и через пол секунды независимо от результата дублируются. Вероятность достваки в два раза выше, а дубль никакой роли не играет.
← →
@!!ex © (2009-05-19 22:41) [30]> [28] тимохов © (19.05.09 22:37)
а дайте ссылку на сайт _Rouse?
> [21] DVM © (19.05.09 22:02)
> На Winsock
А можно пример?
← →
DVM © (2009-05-19 22:50) [31]
> @!!ex © (19.05.09 22:41) [30]
> А можно пример?
Примера у меня нет, может тебе почитать о сокетах для начала чего, чтоб понятнее стало. Вот например, Григорьева:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1021
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1060
← →
@!!ex © (2009-05-19 23:36) [32]> [31] DVM © (19.05.09 22:50)
Спасибо! Читаю! Очень интересно и понятно написанО!
← →
тимохов © (2009-05-19 23:46) [33]2Автор. Не страдай фигней и не делай своего клиента HTTP. Поверь, нормального ты не сделаешь. Ты знаешь сколько проксей может быть на твоем пути к серверу? Ты знаешь все методы авторизации? Ты знаешь, сколько методов передачи данных от сервера к тебе? Ты знаешь, чем отличается http 1.1. от 1.0? Ты читал спецификацию 2616 (http://www.ietf.org/rfc/rfc2616.txt - почитай и ужаснись сколько нужно сделать, чтобы сделать качественно клиента для Http)?
Поверь там очень много тонкостей. Есть сервера, которые отдают данные чанками (кусками), есть которые передают длину. И тебе придется это все изучать и реализовывать (если ты хочешь более менее универсальное средство).
Бери пример Розыча (то ли первый,то ли второй пример отсдедова http://rouse.drkb.ru/network.php#proxyload) и в путь. WinINet прекрасно знает все прокси и т.д. Я долго выбирал HTTP клиента. И ИНДИ смотрел, и ICS, и сам пытался писать. В итоге WinINet показал себя лучше всего.
← →
DVM © (2009-05-19 23:52) [34]
> тимохов © (19.05.09 23:46) [33]
Это конечно все верно, но дело в том, что для работы с конкретным (а не абстрактным) сервером как правило не нужна полноценная реализация.
← →
тимохов © (2009-05-20 00:02) [35]
> DVM © (19.05.09 23:52) [34]
> > тимохов © (19.05.09 23:46) [33]
> Это конечно все верно, но дело в том, что для работы с конкретным
> (а не абстрактным) сервером как правило не нужна полноценная
> реализация.
А хрен его, извините, знает, как нужно делать.
Мне фрилансер делал проект. Так мой апач отдавал данные с указанием content-length, а евоный апач (использовался при тестировании) отдавал чанками (кусками). Смотрел через wireshark (снифер такой). Опять же есть серьезные вопросы разрыва соединения при использовании прокси и авторизации.
Можно, конечно, самому писать. Но я так и не нашел внятного описания, как должны себя вести прокси.
← →
@!!ex © (2009-05-20 00:04) [36]> [33] тимохов © (19.05.09 23:46)
МНЕ НЕ НУЖЕН HTTP!
Первую часть вопроса я уже сделал через WinInit и не вижу причин переделывать, т.к. все работает.
Сейчас стоит вторая задача - связать два моих приложения через UDP.
← →
тимохов © (2009-05-20 00:21) [37]2Автор.
Извини, не дочитал твой пост :) Бывает.
Ну собсно ты сделал, как я тебе говорил - через wininet.
Про UDP, да Антона надо читать. Там хорошо написано.
← →
antonn © (2009-05-20 01:10) [38]Антонов много, всех не перечитаете %)
← →
Дмитрий С © (2009-05-20 05:36) [39]
unit uHTTP;
interface
uses ActiveX, ComObj;
type
IXMLHTTPRequest = interface(IDispatch)
["{ED8C108D-4349-11D2-91A4-00C04F7969E8}"]
procedure open(const bstrMethod: WideString; const bstrUrl: WideString; varAsync: OleVariant;
bstrUser: OleVariant; bstrPassword: OleVariant); safecall;
procedure setRequestHeader(const bstrHeader: WideString; const bstrValue: WideString); safecall;
function getResponseHeader(const bstrHeader: WideString): WideString; safecall;
function getAllResponseHeaders: WideString; safecall;
procedure send(varBody: OleVariant); safecall;
procedure abort; safecall;
function Get_status: Integer; safecall;
function Get_statusText: WideString; safecall;
function Get_responseXML: IDispatch; safecall;
function Get_responseText: WideString; safecall;
function Get_responseBody: OleVariant; safecall;
function Get_responseStream: OleVariant; safecall;
function Get_readyState: Integer; safecall;
procedure Set_onreadystatechange(const Param1: IDispatch); safecall;
property status: Integer read Get_status;
property statusText: WideString read Get_statusText;
property responseXML: IDispatch read Get_responseXML;
property responseText: WideString read Get_responseText;
property responseBody: OleVariant read Get_responseBody;
property responseStream: OleVariant read Get_responseStream;
property readyState: Integer read Get_readyState;
property onreadystatechange: IDispatch write Set_onreadystatechange;
end;
function CreateIXMLHTTPRequest:IXMLHTTPRequest;
implementation
function CreateIXMLHTTPRequest:IXMLHTTPRequest;
begin
Result := CreateOleObject("Msxml2.XMLHTTP") as IXMLHTTPRequest;
end;
end.
← →
test © (2009-05-20 08:44) [40]Дмитрий С © (20.05.09 05:36) [39]
И опять же проще через Indy там оно реализовано в понятном юзабельном виде.
Страницы: 1 2 вся ветка
Форум: "Прочее";
Текущий архив: 2009.07.26;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.008 c