Форум: "Сети";
Текущий архив: 2004.02.29;
Скачать: [xml.tar.bz2];
ВнизОбратная связь для сокетов Найти похожие ветки
← →
alexEagle (2003-12-23 14:20) [0]Добрый день!
Помогите пожалуйста реализовать вызов функции через сокет.
Т.е нужно реализовать функццию GetResponse(strParam: string):string, которая
1) выполняет передачу параметров функции (strParam) серверу в текстовом формате через
сокет (FSocket.Socket.SendText(strParam))
2) ждет ответа от сервера
3) возвращает ответ как результат своей работы (result := FSocket.Socket.ReceiveText)
и заканчивает свое выполнение.
Не могу придумать как заставить функцию ожидать ответа от сервера (этап 2).
С уважением, Сорокин А.Е.
← →
Digitman (2003-12-23 14:23) [1]режим гнезда какой ? блокирующий или неблокирующий ?
← →
Reindeer Moss Eater (2003-12-23 14:23) [2]
begin
//Передаем параметры:
idTcpClient.Writeln(strParam);
//Читаем результат
Response:=idTcpClient.ReadLn;
end;
← →
Digitman (2003-12-23 14:39) [3]
> Reindeer Moss Eater
у него ж - TServer/ClientSocket-классы
там же не реализована подобная логика, чистой воды - транспорт... там это самому творить нужно
← →
Reindeer Moss Eater (2003-12-23 14:40) [4]Я его подталкиваю к использованию синхронных методов.
← →
alexEagle (2003-12-23 15:00) [5]Мне не хотелось бы переписывать программу на Indy компоненты, поскольку от них я уже отказался в прошлый раз ( http://delphimaster.net/view/6-1072097132/).
Сейчас пользуется компонет TClientSocket
Режим гнезда не блокирующий, но я готов сменить если будет толк.
В хелпе читал но не смог понять как эфективно работать с этим режимом. Подскажите пожалуйста, лучше примером.
← →
Reindeer Moss Eater (2003-12-23 15:05) [6]Мне не хотелось бы переписывать программу на Indy компоненты, поскольку от них я уже отказался в прошлый раз
Я его подталкиваю к использованию синхронных методов.
Я не подталкиваю к Indy. Я подталкиваю к синхронным методам и режимам.
← →
S@shka (2003-12-23 15:49) [7]Все что тебе нужно это INDY - там реализованы необходимые принципы работы.
Или придется самому изобретать велосипед.
Reindeer Moss Eater -> ПРАВ!
← →
alexEagle (2003-12-23 16:01) [8]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;
← →
Polevi (2003-12-23 16:16) [9]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;
← →
S@shka (2003-12-23 16:18) [10]Иначе это делается вот так...
1. тип сокета nonBlocking!!!
Отправил комманду
постаавил RecvAnsw = False;
в событие onClientRead делаешь
получить ответ
поставить ResvAnsw = True;
у тебя в цикле вроде тоже самое и есть....
ТОлько надо предусмотреть возможность того что ответ может не прийти
(из-зха ошибок :) а то зациклешься
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2004.02.29;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.01 c