Форум: "Сети";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];
ВнизПодмена картинок на форуме Найти похожие ветки
← →
MVP (2006-04-03 01:22) [0]Вот смотрите, есть форум. На нем большое количество разнообразных картинок. Каков принцип написания клиента, который бы хранил форумовские картинки на стороне клиента. То есть картинки бы грузились со стороны клиента, а не загружались со стороны сервера, тем бы самым уменьшался траффик. Как это всё может реализовываться, каковы принципы, где можно про такое почитать?
← →
Rouse_ © (2006-04-03 09:52) [1]Вот тебе пример. Загружает старницу с www.yandex.ru и удаляет из страницы все картинки которые грузятся с img.yandex.ru
Можешь, вместо удаления кода картинки изменить его ссылкой на локальное изображениеunit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, OleCtrls, SHDocVw, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient, IdHTTP, mshtml, ActiveX;
type
TForm1 = class(TForm)
IdHTTP1: TIdHTTP;
WebBrowser1: TWebBrowser;
WebBrowser2: TWebBrowser;
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
const
StartImg = "<img src="";
EndImg = ">";
LengthStart = Length(StartImg);
LengthEnd = Length(EndImg);
LengthSum = LengthStart + LengthEnd;
var
InHTML, OutHTML, ImageLink: String;
Position: Cardinal;
Document: IHtmlDocument2;
V: Variant;
begin
// Загружаем оригинальную страницу (для сравнения)
WebBrowser1.Navigate("http://www.yandex.ru");
// Получаем код этой страницы руками
InHTML := IdHTTP1.Get("http://www.yandex.ru");
// Начинаем парсить
while Length(InHTML) > 0 do
begin
// Ищем начало рисунка
Position := Pos(StartImg, InHTML);
// Если нашли
if Position > 0 then
begin
// Все что до него - помещаем в выходной буффер
OutHTML := OutHTML + Copy(InHTML, 1, Position - 1);
// Удаляем ненужное из входного буффера
Delete(InHTML, 1, Position - 1);
// Ищем конец картинки
Position := Pos(EndImg, InHTML);
// Запоминаем картинку
ImageLink := Copy(InHTML, LengthStart, Position - LengthSum);
// Если эта картинка грузится не с узла img.yandex.ru - добавялем ее в выходной буффер
if Pos("img.yandex.ru", ImageLink) = 0 then
OutHTML := OutHTML + Copy(InHTML, 1, Position + LengthEnd - 1);
// Удаляем из входного
Delete(InHTML, 1, Position + LengthEnd - 1);
end
else
begin
// Больше картинок нет - все что осталось перекидываем в выходной буффер
OutHTML := OutHTML + InHTML;
InHTML := "";
end;
end;
// Закидываем пропарсенный текст в бразер
WebBrowser2.Navigate("about:blank");
while WebBrowser2.Document = nil do
Application.ProcessMessages;
Document := WebBrowser2.Document as IHtmlDocument2;
V := VarArrayCreate([0, 0], varVariant);
V[0] := OutHTML;
Document.Writeln(PSafeArray(TVarData(v).VArray));
end;
end.
← →
MVP (2006-04-03 12:13) [2]Такой вопрос.
InHTML := IdHTTP1.Get("http://www.yandex.ru");
Мы получаем весь хтмл код страницы. Тем самым растет получаемый траффик из интеренета. Можно ли как-то этого избежать?
← →
MVP (2006-04-03 12:22) [3]и если страница большая, её исходный текст большоя, то анализ будет долгим, и картинки не быстро подгрузятся.
← →
Rouse_ © (2006-04-03 12:53) [4]
> Мы получаем весь хтмл код страницы. Тем самым растет получаемый
> траффик из интеренета. Можно ли как-то этого избежать?
А как можно что-то делать не имея на руках данных? Естественно HTML придет целиком, иначе ты не сможешь его отобразить...
← →
MVP (2006-04-03 13:00) [5]а вообще есть способ как-то уйти от этого. Есть же клиенты для игр, которые снижают количество траффика. А как они построены?
← →
Rouse_ © (2006-04-03 13:55) [6]жмут траффик к примеру через GZIP
← →
Rouse_ © (2006-04-03 13:58) [7]брр... какие клиенты для игр? Игра сама и есть клиент, если ты про клиенты для форумов - то на стороне форума работет специальный скрипт который и отдает клиенту данные не примеряя HTML
← →
MVP (2006-04-04 11:15) [8]а, то есть на стороне сервера, есть сервер, писанный тоже на делфи, например, который передает какие-то команды. или скрипт пхп,. Можешь обхяснить мне механизм такого взаимодействия. Я грю про браузерные игры, можно их юзать через браузер, а можно скачать клиент.
← →
Rouse_ © (2006-04-04 12:20) [9]Ну вот смотри, вот если ты пойдешь по этой ссылке
http://delphimaster.net/view/6-1144012942/
то ты получишь то что сейчас видишь, со всеми картинками и т.п.
А если пойдешь по вот этой ссылке:
http://www.delphimaster.ru/cgi-bin/client.pl?getconf=1144012942&n=4&from=0&to=-1
то получишь обычное текстовое содержание ветки.
Информацию по второй ссылке тебе отдает специальный скрипт на нашем сервере, по аналогии сделаны и эти игры...
← →
MVP (2006-04-04 22:41) [10]Ну а как работает такой клиент и сервер. Может есть где почитать. И есть ли смысл его использовать.
← →
MVP (2006-04-05 00:48) [11]Document: IHtmlDocument2;
а что это такое?
← →
Rouse_ © (2006-04-05 09:53) [12]Работает очень просто - скрипту отправляется GET запрос и производишь разбор информации.
Так к примеру получаем список конференций данного форума:function DelHttp(URL: String): String;
begin
if Pos("http://", URL) > 0 then Delete(Url, 1, 7);
Result := Copy(Url, 1, Pos("/", Url) - 1);
end;
function GetUrl(const URL: String): String;
var
FSession, FConnect, FRequest: HINTERNET;
FHost, FScript: String;
Ansi: PAnsiChar;
Buff: array [0..1023] of Char;
BytesRead: Cardinal;
begin
Result := "";
// Небольшой парсинг
// вытаскиваем имя хоста и параметры обращения к скрипту
FHost := DelHttp(Url);
FScript := Url;
Delete(FScript, 1, Pos(FHost, FScript) + Length(FHost));
// Инициализируем WinInet
FSession := InternetOpen("DMFR", INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
if not Assigned(FSession) then
begin
ReportString := "Unable to initialize Wininet";
Synchronize(Error);
Exit;
end;
try
// Попытка соединения с сервером
FConnect := InternetConnect(FSession, PChar(FHost), HTTP_PORT, nil,
"HTTP/1.0", INTERNET_SERVICE_HTTP, 0, 0);
if not Assigned(FConnect) then
begin
ReportString := "Unable to connect to server!";
Synchronize(Error);
Exit;
end;
try
// Подготавливаем запрос страницы
Ansi := "text/*";
FRequest := HttpOpenRequest(FConnect, "GET", PChar(FScript), "HTTP/1.0",
"", @Ansi, INTERNET_FLAG_RELOAD, 0);
if not Assigned(FConnect) then
begin
ReportString := "Unable to request page!";
Synchronize(Error);
Exit;
end;
try
// Добавляем заголовки
if not (HttpAddRequestHeaders(FRequest, Header, Length(Header),
HTTP_ADDREQ_FLAG_REPLACE or
HTTP_ADDREQ_FLAG_ADD)) then
begin
ReportString := "Unable add headers/form info.";
Synchronize(Error);
Exit;
end;
// Отправляем запрос
if not (HttpSendRequest(FRequest, nil, 0, nil, 0)) then
begin
ReportString := "Unable send reqest.";
Synchronize(Error);
Exit;
end;
// Получаем ответ от форума
FillChar(Buff, SizeOf(Buff), 0);
repeat
Result := Result + Buff;
FillChar(Buff, SizeOf(Buff), 0);
InternetReadFile(FRequest, @Buff, SizeOf(Buff), BytesRead);
until BytesRead = 0;
finally
InternetCloseHandle(FRequest);
end;
finally
InternetCloseHandle(FConnect);
end;
finally
InternetCloseHandle(FSession);
end;
end;
Пример использования: ShowMessage(GetUrl("http://www.delphimaster.ru/cgi-bin/client.pl?getforums=1"));
> Document: IHtmlDocument2;
Это интерфейс IHtmlDocument2 - смотри подробности в MSDN
← →
MVP (2006-04-05 22:08) [13]И ещё вопрос по поводу TWebBrowser, насколько он хорош, есть ли какая-то лучшая ему альтернатива. И как с ним работать на примерах, сели можно ссылку )
← →
MVP (2006-04-06 02:54) [14]и ещё вопрос, при нажатии на ссылку в веббраузер, он её через ИЕ открывает, можно в WebBrowser сделать как-то закладки типа МайИЕ
← →
Rouse_ © (2006-04-06 09:45) [15]
> И ещё вопрос по поводу TWebBrowser, насколько он хорош,
> есть ли какая-то лучшая ему альтернатива. И как с ним работать
> на примерах, сели можно ссылку )
Есть EmbeddedWB, он наиболее полно реализует интерфейс браузера.
> и ещё вопрос, при нажатии на ссылку в веббраузер, он её
> через ИЕ открывает, можно в WebBrowser сделать как-то закладки
> типа МайИЕ
Обрабатывай OnNewWindow2
← →
MVP (2006-04-06 11:28) [16]EmbeddedWB а где есть такое?
← →
Rouse_ © (2006-04-06 11:30) [17]В интернете :) Спроси у яндекса...
← →
MVP (2006-04-06 12:12) [18]понял, спрошу ;) спасибо тебе большое, просветил неука ;)
← →
Arazel © (2006-04-07 10:43) [19]Rouse_ © (05.04.06 09:53) [12]
Чет код не компелируетсЯ на DELPHI6?
← →
Rouse_ © (2006-04-07 17:54) [20]какой из них? :)
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.043 c