Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблемы 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');?


Наверх

Титульная страница Поиск, карта сайта Написать письмо