-
Urvin (06.02.08 17:17) [0]Друзья! Помогите!
Путем недолгих рассуждений понял, что мне будет очень комфортно работать с Indy.
А вот понять как правильно сделать я никак не могу.
Как мог (по книжке), сделал клиент-серверную связь на Indy:
Клиент:
function TForm1.TCP_Connect(msg: string): boolean;
begin
result:=false;
idTcp.Host:=edtHost.Text;
idTCP.Port:=StrToInt(edtPort.Text);
try
idTCP.Connect;
finally
try
idTCP.GetResponse(200);
idTCP.SendCmd('Preved '+ msg,201);
idTCP.IOHandler.Capture(memo1.Lines);
idTCP.SendCmd('Quit', 202);
result:=true;
finally
idTCP.Disconnect;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if not TCP_Connect('mycommand') then
ShowMessage('Bad connection!');
end;
Сервер:
procedure TfrmMain.btnConnectClick(Sender: TObject);
begin
tcpServer.DefaultPort:=StrToInt(edtPort.Text);
tcpServer.Active:=True;
end;
procedure TfrmMain.tcpServerConnect(AContext: TIdContext);
begin
AContext.Connection.IOHandler.WriteLn('200 My Server ready.');
end;
procedure TfrmMain.tcpServerExecute(AContext: TIdContext);
var
LCmd: string;
LLine: string;
begin
try
LLine := AContext.Connection.IOHandler.ReadLn;
LCmd := Fetch(LLine);
if AnsiSameText(LCmd, 'QUIT') then begin
AContext.Connection.IOHandler.WriteLn('202-Bye!');
AContext.Connection.Disconnect;
end
else if AnsiSameText(LCmd, 'PREVED') then begin
AContext.Connection.IOHandler.WriteLn('Medved.');
Memo1.Lines.Insert(0,LLine);
end
else begin
AContext.Connection.IOHandler.WriteLn('400 Unknown Command');
end;
finally
end;
end;
В настоящее время существует две проблемы:
- Клиент подвисает при работе с сетью. Антифриз стоит.
- Функция подключения в клиенте не может отловить отсутствие подключения -
Сергей М. © (06.02.08 17:26) [1]
> Путем недолгих рассуждений понял, что мне будет очень комфортно
> работать с Indy
Недолгие рассуждения ведут к долгому геморрою.
Это так, к слову.
> Клиент подвисает
Что, прямо так и говорит - "висю" ?)
Или все-таки отладчик тебе дает конкретную инф-цию о конкретной строчке, где у тебя что-то там "подвисает" ?
> Функция подключения в клиенте
Что за функция ?
В приведенном тобой коде нет никаких функций - там сплошные процедурные методы.
И что вообще по-твоему значит "отловить отсутствие подключения" ?
Комментирую то что ты написал:
> try
> idTCP.Connect; //попытка подключения
> finally
> try
> idTCP.GetResponse(200); //а нам похрену, успешная она была или неуспешная - мы сразу же запрашиваем у сервера код приветствия) -
Scapman (06.02.08 17:35) [2]>>Что, прямо так и говорит - "висю" ?)
Висим по всем законам Indy
>>Что за функция ?
>>В приведенном тобой коде нет никаких функций - там сплошные процедурные >>методы.
function TForm1.TCP_Connect(msg: string): boolean;
>>И что вообще по-твоему значит "отловить отсутствие подключения" ?
Выдать значение функции в Fаlse;
Дело в том, что код -- сильно почищенный книжковский, а вот что лишнее стер не понимаю.
А так там хоть except ставь, все равно ошибка вылетать будет, но никак не перехват исключения.
(мои наваяния: http://urvin.ifolder.ru/5247244) -
Urvin (06.02.08 17:35) [3]мой ответ ушел под чужим ником
-
Использовано Indy9 поютому имена чуть другие...procedure TfrmMain.tcpServerExecute(AThread: TIdPeerThread);
var
LCmd: string;
LLine: string;
begin
try
LLine := AThread.Connection.ReadLn;
LCmd := Fetch(LLine);
if AnsiSameText(LCmd, 'QUIT') then begin
AThread.Connection.WriteLn('202 Bye!');
AThread.Connection.Disconnect;
end
else if AnsiSameText(LCmd, 'PREVED') then begin
AThread.Connection.WriteLn('201 Medved.');//<<<< Добавлено 201 (responce code)
AThread.Connection.WriteLn('Ya Medved.');
AThread.Connection.WriteLn('.');//<<<< висяк изза этого idTCP.Capture ждет строку из одной точки
Memo1.Lines.Insert(0,LLine);
end
else begin
AThread.Connection.WriteLn('400 Unknown Command');
end;
finally
end;
end; -
Сергей М. © (07.02.08 08:51) [5]
> Выдать значение функции в Fаlse;
Так ведь в этом методе у тебя осуществляется не только попытка подключения, но и информационного обмена !
> хоть except ставь, все равно ошибка вылетать будет, но никак
> не перехват исключения
Сказки только не надо нам рассказывать)
Показывай вариант с except'ом