Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > TclientSocket


Автор: wsr 19.1.2006, 00:18
Привет всем.
У меня возник небольшой вопрос по TCkientSocket(вкладка Internet) в Delphi 7.
В общем, я отправляю запрос, получаю ответ.
И вот как мне сразу после получения ответа закрыть сокетное соединение?
Подскажите плизз.

З.Ы. Есть ли какой нить мануал по TClientSocket. Просто о использовании?

Код

procedure TForm1.Button1Click(Sender: TObject); //Нажимаем на кнопку отправить
begin
  ClientSocket1.Address := 'forum.vingrad.ru';
  ClientSocket1.Port := 80;
  ClientSocket1.Active := TRUE;
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); //При коннекте посылаем запрос
begin
  ClientSocket1.Socket.SendText ( 'HEAD / HTTP/1.1' +#13#10+#13#10);
end;

procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); //После отправки запроса начинаем принимать данные
begin
  Memo1.Text := Memo1.Text + ClientSocket1.Socket.ReceiveText;
end;

{
После того как приняли все данные через сикунд 5-10 происходит разрыв соединения (disconnect)
А как мне сделать, что бы сразу после получения ответа от сервера разрыв соединения происходил мгновенно, а не спустя 5-10 секунд???
}

Автор: Демо 19.1.2006, 02:21
Код

procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
begin    
  Memo1.Text := Memo1.Text + Socket.ReceiveText;    
  Socket.Close;
end;

Автор: wsr 19.1.2006, 09:45
Я это уже пробовал. Знаешь почему это не работает.
Потому, что нам приходит несколько пакетов с ответом, а ты после получения первого пакета отрубаешь соединение.
Именно поэтому я и использую Memo1.Text := Memo1.Text + Socket.ReceiveText;

Автор: FRAGNATIC 19.1.2006, 14:02
wsr
отрубай соединение после последнего пакета)
или поставив счётчик на их кол-во если знаешь)
или поставивв таймер типа если за 10секунд не фига не пришло) или по самому пакету=)
если это твоё приложение шлёт пакеты то тогда можешь слать пакет типа 'end' а потом проверяешь if Socket.ReceiveText='end' then....

Автор: N1k 19.1.2006, 14:17
wsr
Чем тебя не устрамвает автоматический разрыв соединения?
Ищи в заголовке Content-Length и сравнивай с количеством прочитанных данных.
После того, как Content-Length станет равным длинне прочитанных данных, рви соединение.
зы:Content-Length не учитывает заголовок...

Автор: RA 19.1.2006, 16:39
По существу:
А использовать какойнить httpclient религия не позволяет?

Если не позволяет тогда есть один извращенческий способ:
если в ClientSocket1Read
присол текст содержащий в последней строке = "</html>"
значит ты получил всю html страницу .... do Disconnect smile



Не по сущесву: (Анти реклама smile )
ИМХО. вобще использование TCkientSocket как для веба так и для не веба крайне нерекомендуемо. Эти компоненты скорее демонстрационное пособие но не более.

Автор: N1k 19.1.2006, 19:35
Цитата(RAdmin @ 19.1.2006, 16:39 Найти цитируемый пост)

ИМХО. вобще использование TCkientSocket как для веба так и для не веба крайне нерекомендуемо. Эти компоненты скорее демонстрационное пособие но не более.

Кем "нерекомендуемо"?
Там есть ошибки в алгоритме работы гнезда?
А то, что для веба нужно использовать компоненты работающие на http протоколе, это точно.
Хотя в конечном итоге все замыкается на WinSock.

Автор: wsr 19.1.2006, 22:11
Цитата(FRAGNATIC @ 19.1.2006, 14:02 Найти цитируемый пост)

отрубай соединение после последнего пакета)

Как бы еще узнать, что именно этот пакет последний smile((

Цитата(N1k @ 19.1.2006, 14:17 Найти цитируемый пост)

Чем тебя не устрамвает автоматический разрыв соединения?

После получения данных проходит примерно от 5 до 10 секунд до разрыва соединения.

Цитата(RAdmin @ 19.1.2006, 16:39 Найти цитируемый пост)

А использовать какойнить httpclient религия не позволяет?

Дай какой нить пример, да желательно и с "мануалом" по компоненту.

Цитата(N1k @ 19.1.2006, 19:35 Найти цитируемый пост)

А то, что для веба нужно использовать компоненты работающие на http протоколе, это точно.

Можешь назвать такие компоненты?

Был в Delphi 4-5 компонент, назывался NMHTTP. Так классно было. Можно было в легкую послать запрос, получить отдельно Header и Body из ответа, и закрыть соединение.
А в Delphi 7 я что то подобного компонента ненашел!

Автор: Snowy 19.1.2006, 22:38
Цитата(wsr @ 19.1.2006, 22:11 Найти цитируемый пост)
А в Delphi 7 я что то подобного компонента ненашел!

Интересно ищешь.
Слово Indy в поиске завалит тебя примерами.
TIdHTTP штука очень мощная.

Автор: wsr 19.1.2006, 22:46
Snowy, спасибо посмотрю.

Автор: RA 19.1.2006, 22:56
компоненты ICS www.owerbyte.be (Имхо удобней и проще чем индейцы, мануалы ненужны есть примеры)

Цитата(N1k @ 19.1.2006, 19:35 Найти цитируемый пост)

Кем "нерекомендуемо"?
Там есть ошибки в алгоритме работы гнезда?



Не рекомендуемо мной, хотя уверен если провести опрос то многие подпишутся.

Насчёт ошибок клиента, не помню (возможно мелкие есть) , но судя по тому когда эти компоненты последний раз обновлялись не исключено, а вот в СерверСокете как минимум одна гадкая ошибка была найденна. Ну а поскольку сервер и клиент представляются в одной связке, то моё недоверие автоматически распространилось и на него.

Автор: Snowy 20.1.2006, 10:25
Цитата(RAdmin @ 19.1.2006, 22:56 Найти цитируемый пост)
Не рекомендуемо мной, хотя уверен если провести опрос то многие подпишутся.

Подписываюсь smile
Использовать готовые библиотеки работы с сетевыми протоколами лучше по простой причине:
1. Это проще.
2. Там уже обойдены все грабли, на которые сам обязательно наступишь.
Есть и минусы, но они важны только для маньяков или разработчиков собственных библиотек.

Автор: N1k 20.1.2006, 11:37
Самый простой "компонент" это WinInet.
Научишься пользовать его для HTTP и проблем у тебя не будет...
В том плане, что все предложенные комноненты не работают с HTTPs без дополнительных библиотек, А WinInet eсть на каждой машине с Windows.
ps:Как пример посмотри компонент EasyNet. Он написан с использованием WinInet и есть возможность использовать кукисы локально...

Автор: Snowy 20.1.2006, 13:20
Цитата(N1k @ 20.1.2006, 11:37 Найти цитируемый пост)
Самый простой "компонент" это WinInet.

1. Это не компонент.
2. Работает только в обычных условиях. Шаг влево, шаг вправо - все.
У меня, например он не работает, т.к. я не пускаю IE в сеть.
А еще полно ньюансов с проксями...

Автор: Демо 21.1.2006, 18:49
Цитата(RAdmin @ 19.1.2006, 23:56 Найти цитируемый пост)

Не рекомендуемо мной, хотя уверен если провести опрос то многие подпишутся.


Вряд ли. Просто нужны прямые руки (это не про тебя, а вообще).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)