Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обратная связь для сокетов [D6, Win2k]


alexEagle ©   (2003-12-23 14:20:00) 

Добрый день!
Помогите пожалуйста реализовать вызов функции через сокет.
Т.е нужно реализовать функццию GetResponse(strParam: string):string, которая

1) выполняет передачу параметров функции (strParam) серверу в текстовом формате через
сокет (FSocket.Socket.SendText(strParam))

2) ждет ответа от сервера

3) возвращает ответ как результат своей работы (result := FSocket.Socket.ReceiveText)
и заканчивает свое выполнение.

Не могу придумать как заставить функцию ожидать ответа от сервера (этап 2).

С уважением, Сорокин А.Е.


S@shka   (2003-12-23 16:18:00) [1]

Иначе это делается вот так...
1. тип сокета nonBlocking!!!

Отправил комманду
постаавил RecvAnsw = False;
в событие onClientRead делаешь
получить ответ
поставить ResvAnsw = True;
у тебя в цикле вроде тоже самое и есть....
ТОлько надо предусмотреть возможность того что ответ может не прийти
(из-зха ошибок :) а то зациклешься


Polevi   (2003-12-23 16:16:00) [2]

constructor TPosClient.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FSocket := TClientSocket.Create(AOwner);
FSocket.ClientType=ctBlocking;
end;

function TPosClient.SendCommand(strRequest: string; var strResponse: string): string;
begin
FSocket.Socket.SendText(strRequest);
Result:=FSocket.Socket.ReceiveText;
end;


alexEagle   (2003-12-23 16:01:00) [3]

Indy нет хочу использовать. Можно примерчик как реализовать ожидание ответа от сервера.

Сейчас меня используется следующий вариант:

constructor TPosClient.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FSocket := TClientSocket.Create(AOwner);
FSocket.OnRead := OnGetResponse;
FResponse := False;
end;

procedure TPosClient.OnGetResponse(Sender: TObject; Socket: TCustomWinSocket);
begin
FResponse := true;
end;

function TPosClient.SendCommand(strRequest: string; var strResponse: string): string;
var
strText: string;
begin
// Отправка команды
FSocket.Socket.SendText(strRequest);

// Ожидание ответа
while not FResponse do begin
end;
FResponse := false;

// Получение ответа
strText := FSocket.Socket.ReceiveText;
strResponse := Copy(strText,5,Length(strText)-4);
result := Copy(strText,1,4);
end;


S@shka   (2003-12-23 15:49:00) [4]

Все что тебе нужно это INDY - там реализованы необходимые принципы работы.
Или придется самому изобретать велосипед.
Reindeer Moss Eater -> ПРАВ!


Reindeer Moss Eater   (2003-12-23 15:05:00) [5]

Мне не хотелось бы переписывать программу на Indy компоненты, поскольку от них я уже отказался в прошлый раз

Я его подталкиваю к использованию синхронных методов.

Я не подталкиваю к Indy. Я подталкиваю к синхронным методам и режимам.


alexEagle   (2003-12-23 15:00:00) [6]

Мне не хотелось бы переписывать программу на Indy компоненты, поскольку от них я уже отказался в прошлый раз ( http://www.delphimaster.ru/cgi-bin/forum.pl?id=1072097132&n=4).
Сейчас пользуется компонет TClientSocket

Режим гнезда не блокирующий, но я готов сменить если будет толк.
В хелпе читал но не смог понять как эфективно работать с этим режимом. Подскажите пожалуйста, лучше примером.


Reindeer Moss Eater   (2003-12-23 14:40:00) [7]

Я его подталкиваю к использованию синхронных методов.


Digitman   (2003-12-23 14:39:00) [8]


> Reindeer Moss Eater


у него ж - TServer/ClientSocket-классы

там же не реализована подобная логика, чистой воды - транспорт... там это самому творить нужно


Digitman   (2003-12-23 14:23:00) [9]

режим гнезда какой ? блокирующий или неблокирующий ?


Reindeer Moss Eater   (2003-12-23 14:23:00) [10]

begin
//Передаем параметры:
idTcpClient.Writeln(strParam);
//Читаем результат
Response:=idTcpClient.ReadLn;
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо