Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.03.2013, 00:27
snr93 snr93 вне форума
Прохожий
 
Регистрация: 10.10.2012
Сообщения: 11
Репутация: 10
Восклицание TCPClient1. Проблема с передачей сообщений

Добрый вечер, я в Delphi новичок, так что сильно не пинать-)
Набросал вот такой вот код
КЛИЕНТ
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  StdCtrls, IdAntiFreezeBase, IdAntiFreeze;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    IdTCPClient1: TIdTCPClient;
    Edit2: TEdit;
    Label1: TLabel;
    Memo1: TMemo;
    IdAntiFreeze1: TIdAntiFreeze;
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.Add('Подключение к '+Edit1.Text+'...');
idTCPClient1.Host:=Edit1.Text;
idTCPClient1.Port:=9393;
idTCPClient1.Connect();
if idTcpClient1.Connected then
begin
Memo1.Lines.Add('Подключился');
Button3.Visible:=True;
end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
SO: String;
begin
if (idTCPClient1.Connected = true) and (Trim(Edit2.Text) <> '') then
idTCPClient1.WriteLn(Edit2.Text);
SO:= idTCPClient1.ReadLn();
Edit2.Text := '';
Memo1.Lines.Add(SO);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Memo1.Lines.Add('Отключен от '+Edit1.Text+' ...');
idTCPClient1.Disconnect;
Button3.Visible:=false;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Button3.Visible:=False;
end;

end.

СЕРВЕР
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPServer, IdAntiFreezeBase,
  IdAntiFreeze, IdIPWatch;

type
  TForm1 = class(TForm)
    IdTCPServer1: TIdTCPServer;
    IdAntiFreeze1: TIdAntiFreeze;
    IdIPWatch1: TIdIPWatch;
    procedure IdTCPServer1Execute(AThread: TIdPeerThread);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  ip: string;
implementation

{$R *.dfm}

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
begin
if Athread.Connection.ReadLn=('ping') then
begin
AThread.Connection.Writeln('ok');
end

else
if Athread.Connection.ReadLn=('cmd') then
begin
AThread.Connection.Writeln('Команда CMD выполнена');
end

else
begin
if Athread.Connection.ReadLn=('msg') then
begin
AThread.Connection.Writeln('фраза показана');
ShowMessage('Сообщение');
end

else
begin
if Athread.Connection.ReadLn=('ip') then
ip:=IdIPWatch1.LocalIP;
sleep(2000);
AThread.Connection.Writeln('IP машины '+ip);
end;
end;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
idTCPServer1.Active:=True;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
idTCPServer1.Active:=False;
end;

end.

{Старая проблема, решена благодаря Alegun}
Проблема в том, что когда я в edit2.text ввожу cmd, то сообщение "все ок" не показывается, но если я делаю так:
Код:
procedure TForm1.Button3Click(Sender: TObject);
begin
idTCPClient1.WriteLn('cmd');
end;

РЕШЕНИЕ
Код:
procedure TForm1.Button3Click(Sender: TObject);
 begin
idTCPClient1.WriteLn('Edit2.Text'); //Явно лишние кавычки, если только не название едита записывается.
end;

Последний раз редактировалось snr93, 23.03.2013 в 13:06.
Ответить с цитированием
  #2  
Старый 23.03.2013, 00:49
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Код:
procedure TForm1.Button3Click(Sender: TObject);
 begin
idTCPClient1.WriteLn('Edit2.Text'); //Явно лишние кавычки, если только не название едита записывается.
end; 
Ответить с цитированием
  #3  
Старый 23.03.2013, 00:52
snr93 snr93 вне форума
Прохожий
 
Регистрация: 10.10.2012
Сообщения: 11
Репутация: 10
По умолчанию

Я тоже так думал, но и без кавычек ничего не пашет
Ответить с цитированием
  #4  
Старый 23.03.2013, 01:02
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от snr93
...и без кавычек ничего не пашет
Записывается не содержимое Edit2.Text, а строка 'Edit2.Text'. Можно проверить
Код:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread); 
begin
if Athread.Connection.ReadLn = 'cmd' then ShowMessage('все ок'); 
if Athread.Connection.ReadLn = '' then ShowMessage('Команда пришла пустой'); 

ShowMessage(Athread.Connection.ReadLn); // Добавить временно

end; 
И сразу станет ясно, что не так.

Последний раз редактировалось Alegun, 23.03.2013 в 01:10.
Ответить с цитированием
  #5  
Старый 23.03.2013, 01:37
snr93 snr93 вне форума
Прохожий
 
Регистрация: 10.10.2012
Сообщения: 11
Репутация: 10
По умолчанию

Так, тут заработало, отлично, но вот проблема, когда я подключаюсь и пишу команду cmd, то сервер отвечает после 2-3 отправок этой команды. Как тут быть? Как узнать что сервер принял команду и выполнил? Все что я надумал это:
Сервер при получении сообщения отправляет сообщение клиенту о том что он его понял и услышал, а если клиенту не пришло ответа, то повторить автоматом 3 раза с интервалом 3 секунды и если опять ничего то выдать ответ что неполучилось. Но это занимает много времени. Можно ли как нибудь ускорить процесс проверки услышал ли сервер клиент или нет?
Ответить с цитированием
  #6  
Старый 23.03.2013, 05:19
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,036
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

собуствую, в гугле забанили...
на линк: http://www.freelancecode.net/communi...opic.php?p=371
Ответить с цитированием
  #7  
Старый 23.03.2013, 12:35
snr93 snr93 вне форума
Прохожий
 
Регистрация: 10.10.2012
Сообщения: 11
Репутация: 10
По умолчанию

P.S. вверху изменил код клиента и сервера.
Очень странно все равно ведет себя сервер. Когда я пишу ping, то он без задержек присылает что все ок, но стоит ввести другую команду, допустим msg, то сервер потухает и ничего не показывает,
приходится несколько раз посылать команду, чтобы он ее выполнил. А если послать IP, то все. Программа долго думает и после нескольких отправок команды иногда или зависает, или присылает пустой ip, редко когда бывает что-бы он мне выслал мой ip.
Может кто помочь? Мне кажется это из-за корявости кода.

P.S.S Кстати, еще у меня windows 7 x64, а делфи для x32, может тут проблема?

P.S.S.S Если человек спрашивает на ФОРУМЕ вопрос, то не надо посылать его в гугл, он там вероятнее всего был.

Последний раз редактировалось snr93, 23.03.2013 в 13:07.
Ответить с цитированием
  #8  
Старый 23.03.2013, 13:02
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от snr93
...Что может излечить данную проблему?...
Кстати, очень хороший пример, с разжовыванием lmikle предоставил, там рабочая сборка лежит...
Ответить с цитированием
  #9  
Старый 23.03.2013, 17:16
snr93 snr93 вне форума
Прохожий
 
Регистрация: 10.10.2012
Сообщения: 11
Репутация: 10
По умолчанию

Я не понял где взять компонент FMX который там используется? Это не стандартный indi компонент вроде
Ответить с цитированием
  #10  
Старый 23.03.2013, 17:29
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от snr93
Я не понял где взять компонент FMX который там используется? Это не стандартный indi компонент вроде
Это пакет FireMonkey, я в D7 просто удалил всё, что до точек идет (FMX.Controls = Controls) и заработало. А вообще там ссылка на этот пакет есть.
Ответить с цитированием
  #11  
Старый 23.03.2013, 21:05
snr93 snr93 вне форума
Прохожий
 
Регистрация: 10.10.2012
Сообщения: 11
Репутация: 10
По умолчанию

Спасибо всем. Посмотрел статью и прислушался к вашим комментариям и сам все переписал как надо без использования FMX и других дополнительных компонентов. Теперь все работает как часы-))
Ответить с цитированием
  #12  
Старый 23.03.2013, 22:06
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,036
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от snr93
P.S.S.S Если человек спрашивает на ФОРУМЕ вопрос, то не надо посылать его в гугл, он там вероятнее всего был.

А как ты думаешь, как я нашел страничку, ссылку на которую тебе и дал? Или ты думаешь, что я на память знаю странички с примерами на каждый случай?
Ответить с цитированием
  #13  
Старый 23.03.2013, 23:33
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Цитата:
Сообщение от lmikle
А как ты думаешь, как я нашел страничку, ссылку на которую тебе и дал? Или ты думаешь, что я на память знаю странички с примерами на каждый случай?
Да прикрепил бы уже тему, наконец... И ссылки на неё давал...
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:29.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter