Форум: "Сети";
Текущий архив: 2009.04.19;
Скачать: [xml.tar.bz2];
ВнизИсправить простейшую программу на Indy, Найти похожие ветки [Indy 10,CodeGear]
← →
Urvin (2008-02-06 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;
В настоящее время существует две проблемы:
- Клиент подвисает при работе с сетью. Антифриз стоит.
- Функция подключения в клиенте не может отловить отсутствие подключения
← →
Сергей М. © (2008-02-06 17:26) [1]
> Путем недолгих рассуждений понял, что мне будет очень комфортно
> работать с Indy
Недолгие рассуждения ведут к долгому геморрою.
Это так, к слову.
> Клиент подвисает
Что, прямо так и говорит - "висю" ?)
Или все-таки отладчик тебе дает конкретную инф-цию о конкретной строчке, где у тебя что-то там "подвисает" ?
> Функция подключения в клиенте
Что за функция ?
В приведенном тобой коде нет никаких функций - там сплошные процедурные методы.
И что вообще по-твоему значит "отловить отсутствие подключения" ?
Комментирую то что ты написал:
> try
> idTCP.Connect; //попытка подключения
> finally
> try
> idTCP.GetResponse(200); //а нам похрену, успешная она была или неуспешная - мы сразу же запрашиваем у сервера код приветствия)
← →
Scapman (2008-02-06 17:35) [2]>>Что, прямо так и говорит - "висю" ?)
Висим по всем законам Indy
>>Что за функция ?
>>В приведенном тобой коде нет никаких функций - там сплошные процедурные >>методы.
function TForm1.TCP_Connect(msg: string): boolean;
>>И что вообще по-твоему значит "отловить отсутствие подключения" ?
Выдать значение функции в Fаlse;
Дело в том, что код -- сильно почищенный книжковский, а вот что лишнее стер не понимаю.
А так там хоть except ставь, все равно ошибка вылетать будет, но никак не перехват исключения.
(мои наваяния: http://urvin.ifolder.ru/5247244)
← →
Urvin (2008-02-06 17:35) [3]мой ответ ушел под чужим ником
← →
Slym © (2008-02-07 05:44) [4]Использовано 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;
← →
Сергей М. © (2008-02-07 08:51) [5]
> Выдать значение функции в Fаlse;
Так ведь в этом методе у тебя осуществляется не только попытка подключения, но и информационного обмена !
> хоть except ставь, все равно ошибка вылетать будет, но никак
> не перехват исключения
Сказки только не надо нам рассказывать)
Показывай вариант с except"ом
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2009.04.19;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.052 c