Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > TcpClient


Автор: iddqd 14.7.2006, 15:01
 ... закрытия соединения.
Т.е. код примерно такой:
Код

procedure TForm18.Button1Click(Sender: TObject);
begin
TcpClient1.Connect;
TcpClient1.Sendln('hello moto', '');
TcpClient1.Disconnect;
end;

В данном случае команда выполнится корректно, но сервер конечно же не успеет ничего ответить, потому-что соединение будет сразу закрыто.
А если делать
Код

TcpClient1.Disconnect;

По нажатию на другую кнопку, а в первом коде закоментить, то до тех пор, пока не произойдёт отключение команда не отправится smile
Мне необходимо, чтоб соединение держалось постоянно и шел обмен командами.
Может есть какой нибудь метод у TcpClient для того, чтобы отправить команду немедленно? 

Автор: Snowy 14.7.2006, 15:14
TcpClient1.Sendln('hello moto');

Добавлено @ 15:15 
Отправляется она немедленно.
Просто сервер читает строку, а ты не отправил завершение строки.
Поэтому сервер и не реагирует, пока не придёт конец строки или дисконнект.
Просто убрать второй параметр и конец строки будет отправляться, а сама строка корректно читаться. 

Автор: iddqd 14.7.2006, 15:25
Спасибо, Snowy как обычно ответ быстро и по существу. Мне помогло. Но теперь подобная проблема с сервером.
Код

procedure TForm18.TcpServer1Accept(Sender: TObject;
  ClientSocket: TCustomIpClient);
  var
  Line, Cmd: string;
begin
Line:=ClientSocket.Receiveln();
// обработка строки
ClientSocket.Sendln('hello moto'); //ответ клиенту
end;


А в клиенте приём организован вот так:
Код

procedure TForm18.TcpClient1Receive(Sender: TObject; Buf: PAnsiChar;
  var DataLen: Integer);
begin
ShowMessage(Buf + ' - '+IntToStr(DataLen));
end;

Но клиент не выводит никакого сообщения.

P.S. Я знаю правила. Один топик - один вопрос. Но вопросы братья родные и не имеет смысла создавать два одинаковых топика, ИМХО.
 

Автор: Snowy 14.7.2006, 15:40
Тут вариантов куча. Даже не знаю.
Может клиент забыл отправить строку серверу.
Может был дисконнект.
Да что угодно может быть.
Нужно или код посмотреть, или расставить бряки, чтобы увидеть заходит он вообще туда или нет... 

Автор: iddqd 17.7.2006, 17:48
Snowy, или кто-либо другой.
Вы можете написать простейший пример, где есть клиент и сервер.
Клиент отправляет команду, например, 
команда: 2
аргументы: hello и второй: moto
Сервер их принимает и если второй аргумент <> moto, то отвечает клиенту что-то. И клиент выводит сообщение о том, что неверный аргумент.
У кого есть время и кому не лень - сделайте пожалуйста, а то сил моих больше нет smile
3 дня совокупляюь с клиент-сервером.
Можно сделать хоть на IndyTCPClient\Server, хоть на просто TTCpClient\Server.
На осонове этого примера я уже смогу сделать всё, что мне надо.
Буду очень признателен.
Спасибо заранее. 

Автор: Snowy 18.7.2006, 10:11
http://vingrad.ru/DELPHI-DLP-001358
http://vingrad.ru/DELPHI-DLP-001367
Также приаттачиваю пример из IndyDemo  

Автор: iddqd 18.7.2006, 13:33
Спасибо, но:
- эту демку я видел и на её основе всё равно не получается сделать то, что мне надо.
- она не подходит для BDS'06 

Автор: Snowy 18.7.2006, 13:50
Про 2006 не говорилось.
Но это поправимо.
Внизу этой страницы есть список "А здесь смотрели?".
Вот первый линк http://forum.vingrad.ru/index.php?showtopic=81767 тебе и нужен. 

Автор: iddqd 18.7.2006, 16:54
Да. Явидел этот топик, но не помогло и это.
Я ведь говорил, что перепробывал массу демок.

Видимо мне уже не что не поможет smile 

Автор: Snowy 19.7.2006, 12:06
Ну звиняйте.
10-й инди у меня щас нету.
Я на D7 пишу, а там 9-ка... 

Автор: Romikgy 19.7.2006, 12:16
Вот демо для 10 
Код

program Intro;
{$APPTYPE CONSOLE}

uses
  IdTCPClient,
  SysUtils;

begin
  with TIdTCPClient.Create do try
    Host := 'news.atozedsoftware.com';
    Port := 119;
    Connect; try
      WriteLn('Connected.');
      WriteLn(IOHandler.ReadLn);
      IOHandler.WriteLn('Quit');
      WriteLn(IOHandler.ReadLn);
    finally Disconnect; end;
    WriteLn('Disconnected.');
  finally Free; end;
  WriteLn('Press Enter');
  ReadLn;
end.
 

Что конкретно не выходит? 

Автор: dumb 4.12.2006, 17:48
Цитата(Flat @  4.12.2006,  17:36 Найти цитируемый пост)
почемуто не работает даже прием сервером... точнее он что то принимает но во время его выдает ошибку..

все серверные события(TCPServer.OnXXX) вызываются из потоков, созданных для каждого подключившегося клиента. посему обычная проблема взаимодействия потоков - ищи по форуму, читай. вкратце так: из методов indy-сервера НЕЛЬЗЯ напрямую взаимодействовать с формами(ShowMessage - туда же).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)