Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.03;
Скачать: CL | DM;

Вниз

Проблемы c TIdTCPServer и TIdTCPClient   Найти похожие ветки 

 
Интересующийся   (2006-07-04 16:51) [0]

Доброе время суток мастера!

Помогите плиз.

Создал простое приложение (сервер) на основе 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;


 
Slym ©   (2006-07-05 09:57) [1]

Интересующийся   (04.07.06 16:51)
возникают ошибки.

пою...
 Ошибки бывают разные...
 Синие, белые, красные...

Ошибка где (клиент/сервер), ее название/код, место возбуждения...
Исключая сервер проверенный оперой, ошибка в клиенте... ориентировочно на строке TCPClient.Write("OK");?


 
Slym ©   (2006-07-05 10:00) [2]

но это на первый взгляд...
коробить другое: полное отсутствие протокола (договоренности между клиентом и сервером о передаче данных), а именно:
TextLog.Lines.Add("ReadBuffer "+AThread.Connection.CurrentReadBuffer);


 
medved_68 ©   (2006-07-05 10:07) [3]


> TCPClient.Connect;
> TCPClient.Write("OK");

Сомнения что клиент успел приконнектится
Думаю что TCPClient.Write("OK"); надо прописывать в событии TCPClient.Connected;


 
Slym ©   (2006-07-05 11:29) [4]

medved_68 ©   (05.07.06 10:07) [3]
Сомнения что клиент успел приконнектится

Успел... Indy - синхронная: из TCPClient.Connect; не выйдет пока тот самый Коннект не установится


 
medved_68 ©   (2006-07-05 12:22) [5]


> Slym

Тогда ой, остается [2], типа сервер что то неправильно считал

> TextLog.Lines.Add("ReadBuffer "+AThread.Connection.CurrentReadBuffer);

По ходу он пытается в строку запихнуть весь буфер????


 
umbra ©   (2006-07-05 19:15) [6]

ошибку то какую пишет?


 
Интересующийся   (2006-07-07 19:00) [7]

Код посылающий сообщения (Пример из книги С. Бобровский 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 не происходит.


 
medved_68 ©   (2006-07-08 16:14) [8]

with AThread.Connection do
begin
TextLog.Lines.Add(AThread.Connection.CurrentReadBuffer);
WriteLn("OK");
Disconnect;
end;


Попробуй убрать из процедуры Disconnect; Т.Е пусть сам клиент соединяется  и сам же рвет связь. Вероятней всего идет разрыв связи до того как передалось сообщение. На сервере оно уже отправлено и разрыв, а клиент еще не принял а уже разрыв.(Только предположение...).

> Клиент ответа не получает, TCPClientDisconnected не происходит.

Укрепляюсь в предположении т.к. клиент ждет ответа от сервера и сообщение о разрыве в этот момент в очереди но не обрабатывается (ИНДИ синхронная).


 
XbI   (2006-07-09 09:37) [9]

во-первых используй клнструкцию 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;


 
XbI   (2006-07-09 09:38) [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;


 
Интересующийся   (2006-07-12 16:15) [11]

> XbI   (09.07.06 09:38) [10]


if TcpClient.Connection.Connected then begin


[Error] Unit1.pas(49): Undeclared identifier: "Connection"

Connection - это насколько я понимаю серверная вещь?


 
Интересующийся   (2006-07-12 16:16) [12]

Может в сервере ошибка?


 
Интересующийся   (2006-07-12 16:23) [13]

Клиент вроде работает:

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;



 
medved_68 ©   (2006-07-12 16:45) [14]


> Интересующийся


> Может в сервере ошибка?

[8] посмотри


 
Интересующийся   (2006-07-13 07:33) [15]

Вроде все работает, только у сервера возникает ошибка при двух его копиях.

Сервер позволяет запускать две копии с Active:=True?

P.S.
Может кто знает как определить занят ли порт другим TIdTCPServer.


 
Интересующийся   (2006-07-13 07:38) [16]

Может, кто знает, как поместить TIdTCPServer и TIdTCPClient в OLE?

Мне нужно получить к ним доступ из другой проги (чужой)!


 
Slym ©   (2006-07-13 08:31) [17]

Интересующийся   (13.07.06 7:38) [16]
в OLE

Берешь и помещаешь... принципиальных проблем не вижу (если ты знаком с OLE)


 
Интересующийся   (2006-07-15 09:06) [18]

Основы работы с OLE знаю, но работ в этой области пока нет :(

Нужна инфа по написанию подобных вещей.

P.S.
Конкретно я хочу написать DLL (или EXE, как более простой вариант) которые можно вызвать из другой программы. В качестве других программ подайдут 1С7.7 или Excel.


 
Интересующийся   (2006-07-15 09:10) [19]

В конечном счете в DLL должны входжить серверы и клиенты для работы с HTTP, FTP, MAIL (POP и SMTP).



Страницы: 1 вся ветка

Текущий архив: 2006.12.03;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.062 c
4-1153468924
Lagrima_JN
2006-07-21 12:02
2006.12.03
Как определить, что эл. питание отсутствует?


15-1163270676
PHPDeveloper
2006-11-11 21:44
2006.12.03
escrow.com


6-1152890949
_kos
2006-07-14 19:29
2006.12.03
Socket в цикле


2-1163483905
delphim
2006-11-14 08:58
2006.12.03
динамически содаваемые компоненты


15-1163334763
ProgRAMmer Dimonych
2006-11-12 15:32
2006.12.03
Судя по реакции гугла, вопрос сложный.