![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ClientSocket -- получение ответа на запрос [D7, WinXP]
Ypbi4 © (2007-04-23 13:53:00)Добрый весна всем :)
Есть проблемка интересная:
Через Clientsocket в режиме ctNonBlocking отправляется запрос на сервер и с него получаю ответ, этот ответ нужно обработать. Вроде ничего сложного, но есть запарка: нужно отправить несколько параметров и от каждого получить ответ, верный он или нет(верный то содержит в ReciveText 250 ok нет 500 Error). и такх запросов за один сеанс порядка 12000. Я реализовал ето так:
Создал поток thread и заключил в него процедуры
MainForm.SNPP.Socket.SendText('PAGER'+' '+tel+#10);
sleep(time2); // задержка что бы дождаться данных
recive:=MainForm.SNPP.Socket.ReceiveText;
if POS('250',recive) = 0 then // если не принято, то пишется ошибка
Begin
zapis:='Неверный формат номера'+#10#13+recive;
MainForm.SNPP.Socket.SendText('RESET'+#10);
synchronize(UpdateMemo);
end;
Дело в том что это занимает очень много времени, может как то можно ускорить процесс обмена :( И данные могут склеиваться т.е. может прийти ответ на пару запросов.
На сайте в FAQ нашел пример похожий но это не то :(
s:= Socket.ReceiveText;
// Если мы не в режиме приёма:
if not Reciving then
begin
// Теперь нам необходимо получить длину потока данных.
SetLength(sl, StrLen(PChar(s))+1); // +1 for the null terminator
StrLCopy(@sl[1], PChar(s), Length(sl)-1);
DataSize:= StrToInt(sl);
Data:= TMemoryStream.Create;
// Удаляем информацию о размере из данных.
Delete(s, 1, Length(sl));
Reciving:= true;
end;
// Сохраняем данные в файл, до тех пор, пока не получим все данные.
try
Data.Write(s[1], length(s));
if Data.Size = DataSize then
begin
Data.Position:= 0;
Image2.Picture.Bitmap.LoadFromStream(Data);
Data.Free;
Reciving:= false;
Socket.Close;
end;
except
Data.Free;
end;
end;
Помогите советом плз ;)
Ypbi4 (2007-04-23 15:02:00) [21]млин, наоборот :)) использует блокирущие сокеты
Ypbi4 (2007-04-23 15:01:00) [22]Indy использует неблокирущие сокеты :(
Сергей М. (2007-04-23 14:43:00) [23]
> есть Indy компанент, но с ним работать нельзя
Почему ?
И если нельзя, то почему не проанализировать как это сделано в Инди, благо исходники открыты ?
Ypbi4 (2007-04-23 14:33:00) [24]это протокол SNPP, только расширеный разроботчиком. есть Indy компанент, но с ним работать нельзя :(.
Ypbi4 (2007-04-23 14:31:00) [25]Хорошо. Допустим я обрабатываю событие OnRead:
Отослал запрос мне в ответ пришла строка содержащая "250 bla bla bla"
и Дальше что? посылать следующий запрос? Подскажи как реализовать то?
Еще есть запросы допустим query <message_id> и в ответ приходит "ready" или тип того, Мне нужно эти данные обработать (внести в базы и т.д.) . А ждет отправки много всего. есть ли алгоритм вроде
SendCmd(), я пробовал но меня он ошибку выдает :( ?
Сергей М. (2007-04-23 14:12:00) [26]
> sleep(time2); // задержка что бы дождаться данных
Зачем их "дожидаться" ?
На то есть событие OnRead.