![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обратная связь для сокетов [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;