![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблемы c TIdTCPServer и TIdTCPClient [D6, D7, WinXP]
Интересующийся © (2006-07-04 16:51:00)Доброе время суток мастера!
Помогите плиз.
Создал простое приложение (сервер) на основе TIdTCPServer, назначил ему 80 порт.
При обращении к серверу с помощью Оперы все работает, а при обращении к нему при помощи TIdTCPClient возникают ошибки.
Примеры кода, взяты из книги про D7
Сервер
procedure Execute(AThread:TIdPeerThread);
begin
with AThread.Connection do
begin
TextLog.Lines.Add('ReadBuffer '+AThread.Connection.CurrentReadBuffer);
WriteLn('OK');//Ответ сервера клиенту
Disconnect;
end;
end;
Клиент
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
TCPClient.Connect;
TCPClient.Write('OK');
TextLog.Text:=TCPClient.ReadLn;
TCPClient.Disconnect;
end;
Интересующийся (2006-07-15 09:10:00) [1]В конечном счете в DLL должны входжить серверы и клиенты для работы с HTTP, FTP, MAIL (POP и SMTP).
Интересующийся (2006-07-15 09:06:00) [2]Основы работы с OLE знаю, но работ в этой области пока нет :(
Нужна инфа по написанию подобных вещей.
P.S.
Конкретно я хочу написать DLL (или EXE, как более простой вариант) которые можно вызвать из другой программы. В качестве других программ подайдут 1С7.7 или Excel.
Slym (2006-07-13 08:31:00) [3]Интересующийся (13.07.06 7:38) [16]
в OLE
Берешь и помещаешь... принципиальных проблем не вижу (если ты знаком с OLE)
Интересующийся (2006-07-13 07:38:00) [4]Может, кто знает, как поместить TIdTCPServer и TIdTCPClient в OLE?
Мне нужно получить к ним доступ из другой проги (чужой)!
Интересующийся (2006-07-13 07:33:00) [5]Вроде все работает, только у сервера возникает ошибка при двух его копиях.
Сервер позволяет запускать две копии с Active:=True?
P.S.
Может кто знает как определить занят ли порт другим TIdTCPServer.
medved_68 (2006-07-12 16:45:00) [6]
> Интересующийся
> Может в сервере ошибка?
[8] посмотри
Интересующийся (2006-07-12 16:23:00) [7]Клиент вроде работает:
var
s: string;
begin
try
TCPClient.Connect;
TCPClient.WriteLn('HELLO'); //В примере Edit1.Text
s:=TCPClient.ReadLn;
TextLog.Lines.Add(s);//Edit1.Text:=TCPClient.ReadLn
TCPClient.Disconnect;
except
end;
Интересующийся (2006-07-12 16:16:00) [8]Может в сервере ошибка?
Интересующийся (2006-07-12 16:15:00) [9]> XbI (09.07.06 09:38) [10]
if TcpClient.Connection.Connected then begin
[Error] Unit1.pas(49): Undeclared identifier: 'Connection'
Connection - это насколько я понимаю серверная вещь?
XbI (2006-07-09 09:38:00) [10]procedure TForm1.SpeedButton1Click(Sender:TObject);
var
s: string;
begin
try
TCPClient.Connect;
except
end;
if TcpClient.Connection.Connected then begin
TCPClient.WriteLn('HELLO'); //В примере Edit1.Text
s:=TCPClient.ReadLn;
TextLog.Lines.Add(s);//Edit1.Text:=TCPClient.ReadLn
end;
TCPClient.Disconnect;
end;
end;
XbI (2006-07-09 09:37:00) [11]во-первых используй клнструкцию try...except, во-вторых попробуй так:
procedure TForm1.SpeedButton1Click(Sender:TObject);
begin
try
TCPClient.Connect;
except
end;
if TcpClient.Connection.Connected then begin
TCPClient.WriteLn('HELLO'); //В примере Edit1.Text
TextLog.Lines.Add(TCPClient.ReadLn);//Edit1.Text:=TCPClient.ReadLn
end;
TCPClient.Disconnect;
end;
end;
medved_68 (2006-07-08 16:14:00) [12]
with AThread.Connection do
begin
TextLog.Lines.Add(AThread.Connection.CurrentReadBuffer);
WriteLn('OK');
Disconnect;
end;
Попробуй убрать из процедуры Disconnect; Т.Е пусть сам клиент соединяется и сам же рвет связь. Вероятней всего идет разрыв связи до того как передалось сообщение. На сервере оно уже отправлено и разрыв, а клиент еще не принял а уже разрыв.(Только предположение...).
> Клиент ответа не получает, TCPClientDisconnected не происходит.
Укрепляюсь в предположении т.к. клиент ждет ответа от сервера и сообщение о разрыве в этот момент в очереди но не обрабатывается (ИНДИ синхронная).
Интересующийся (2006-07-07 19:00:00) [13]Код посылающий сообщения (Пример из книги С. Бобровский Delphi 7)
procedure TForm1.SpeedButton1Click(Sender:TObject);
begin
TCPClient.Connect;
TCPClient.Write('HELLO'); //В примере Edit1.Text
TextLog.Lines.Add(TCPClient.ReadLn);//Edit1.Text:=TCPClient.ReadLn
TCPClient.Disconnect;
end;
Код сервера (Пример из книги С. Бобровский Delphi 7)
procedure TForm1.TCPServerExecute(AThread:TIdPeerThread);
begin
with AThread.Connection do
begin
TextLog.Lines.Add(AThread.Connection.CurrentReadBuffer);
WriteLn('OK');
Disconnect;
end;
end;
P.S.
C оперой работает нормально, опера получает OK!
При работе с моим клиентом есть два варианта:
1. По книге - на сервере происходит Execute из которого нет выхода (клиент виснит).
2. Переносим TCPClient.Write('HELLO') в TCPClientConnected, сервер получает текст. Клиент ответа не получает, TCPClientDisconnected не происходит.
umbra (2006-07-05 19:15:00) [14]ошибку то какую пишет?
medved_68 (2006-07-05 12:22:00) [15]
> Slym
Тогда ой, остается [2], типа сервер что то неправильно считал
> TextLog.Lines.Add('ReadBuffer '+AThread.Connection.CurrentReadBuffer);
По ходу он пытается в строку запихнуть весь буфер????
Slym (2006-07-05 11:29:00) [16]medved_68 © (05.07.06 10:07) [3]
Сомнения что клиент успел приконнектится
Успел... Indy - синхронная: из TCPClient.Connect; не выйдет пока тот самый Коннект не установится
medved_68 (2006-07-05 10:07:00) [17]
> TCPClient.Connect;
> TCPClient.Write('OK');
Сомнения что клиент успел приконнектится
Думаю что TCPClient.Write('OK'); надо прописывать в событии TCPClient.Connected;
Slym (2006-07-05 10:00:00) [18]но это на первый взгляд...
коробить другое: полное отсутствие протокола (договоренности между клиентом и сервером о передаче данных), а именно:
TextLog.Lines.Add('ReadBuffer '+AThread.Connection. CurrentReadBuffer);
Slym (2006-07-05 09:57:00) [19]Интересующийся (04.07.06 16:51)
возникают ошибки.
пою...
Ошибки бывают разные...
Синие, белые, красные...
Ошибка где (клиент/сервер), ее название/код, место возбуждения...
Исключая сервер проверенный оперой, ошибка в клиенте... ориентировочно на строке TCPClient.Write('OK');?