Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Indy + TCP, текстовый обмен 
V
    Опции темы
Sharkfire
Дата 24.12.2007, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 236
Регистрация: 30.11.2006
Где: Одесса

Репутация: 2
Всего: 2



Люди напишете самы простой способ как обменяться тектовыми строчками с помощью Indy TIdTCPServer TidTCPClient.

Мне надо просто стоки кода:

Server->Client
Server<-Client

и наоборот

Client->Server
Client<-Server


а то я что то в примерах не могу вообзе разобраться.  smile 
PM MAIL ICQ   Вверх
Sharkfire
Дата 25.12.2007, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 236
Регистрация: 30.11.2006
Где: Одесса

Репутация: 2
Всего: 2



Цитата(Sharkfire @  24.12.2007,  23:46 Найти цитируемый пост)
Server->Client
Server<-Client
Client->Server

С этим разобрался!! 
помогло это
А вот как принять сообщение 
от сервера на строне клиента??

Client<-Server ??? 

Это сообщение отредактировал(а) Sharkfire - 26.12.2007, 19:47
PM MAIL ICQ   Вверх
Sharkfire
Дата 26.12.2007, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 236
Регистрация: 30.11.2006
Где: Одесса

Репутация: 2
Всего: 2



Неужеле не кто не знает как написать приём данных на строне клиента в Indy??? 

Тогад помогиет портировать этот кусок, тут есть приём: 
Код

  TClientHandleThread = class(TThread)
                         private
                          CB: TCommBlock;

                          procedure HandleInput;

                         protected
                          procedure Execute; override;

                        end;

var
  ClientFrmMain: TClientFrmMain;
  ClientHandleThread: TClientHandleThread;   // variable (type see above)

implementation

{$R *.DFM}

procedure TClientHandleThread.HandleInput;
begin
  if CB.Command = 'MESSAGE' then
    ClientFrmMain.IncomingMessages.Lines.Add (CB.MyUserName + ': ' + CB.Msg)
  else
  if CB.Command = 'DIALOG' then
    MessageDlg ('"'+CB.MyUserName+'" sends you this message:'+#13+CB.Msg, mtInformation, [mbOk], 0)
  else  // unknown command
    MessageDlg('Unknown command "'+CB.Command+'" containing this message:'+#13+CB.Msg, mtError, [mbOk], 0);
end;

procedure TClientHandleThread.Execute;
begin
  while not Terminated do
  begin
    if not ClientFrmMain.Client.Connected then
      Terminate
    else
    try
      ClientFrmMain.Client.ReadBuffer(CB, SizeOf (CB));
      Synchronize(HandleInput);
    except
    end;
  end;
end;


PM MAIL ICQ   Вверх
Sharkfire
Дата 31.12.2007, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 236
Регистрация: 30.11.2006
Где: Одесса

Репутация: 2
Всего: 2



Что то удалось портировать :

Код

class TClientHandleThread : public TThread
{
public:
TClientHandleThread();
private:
void __fastcall HandleInput();
protected:
void __fastcall Execute(); // override;
};
TClientHandleThread *ClientHandleThread;// variable (type see above)
//---------------------------------------------------------
TClientHandleThread::TClientHandleThread() : TThread(1)
{

}
//----------------------------------------------------------
void __fastcall TClientHandleThread::HandleInput()
{
ShowMessage("WOOORK2!");
}
//---------------------------------------------------------
void __fastcall TClientHandleThread::Execute()
{
while(!Terminated)
 {
    if (! Form2->Client->Connected())
      Terminate();
    else
    {
    char * buff = new char[Form2->Client->RecvBufferSize];
    Form2->Client->ReadBuffer(buff,Form2->Client->RecvBufferSize);
   // Synchronize(HandleInput);
       }
 }
}
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
    : TForm(Owner)
{

}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
Client->Connect(10000);  // in Indy < 8.1 leave the parameter away
ClientHandleThread = new TClientHandleThread();
ClientHandleThread->FreeOnTerminate = 1;
ClientHandleThread->Resume();
}
//---------------------------------------------------------------------------


Вот только 2 проблемки:

1.  Метода Synchronize(HandleInput); я не нашёл... как его можно заменить?
2.  Метод TClientHandleThread::Execute() вызывается только 1 раз (при соединении)... а должен
     по идее, каждый раз при приходе данных.
PM MAIL ICQ   Вверх
Sharkfire
Дата 2.1.2008, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 236
Регистрация: 30.11.2006
Где: Одесса

Репутация: 2
Всего: 2



Выкладываю работающий код, я думаю понадобится ещё кому то:

Код

//---------------------------------------------------------------------------
class TClientHandleThread : public TThread
{
public:
TClientHandleThread();
protected:
void __fastcall Execute(); // override;
};
TClientHandleThread *ClientHandleThread;// variable (type see above)
//---------------------------------------------------------
TClientHandleThread::TClientHandleThread() : TThread(1)
{
//empty
}
//----------------------------------------------------------
void __fastcall TClientHandleThread::Execute()
{
while(!Terminated)
 {
    if (! Form2->Client->Connected())
      Terminate();
    else
       {
    String buff=Form2->Client->ReadLn("");
    Form2->Memo1->Lines->Add(">> "+buff);
       }
 }
}
//---------------------------------------------------------------------------
void __fastcall TForm2::btConnectClick(TObject *Sender)
{
Client->Connect(10000);  // in Indy < 8.1 leave the parameter away
ClientHandleThread = new TClientHandleThread();
ClientHandleThread->FreeOnTerminate = 1;
ClientHandleThread->Resume();
}
//---------------------------------------------------------------------------

PM MAIL ICQ   Вверх
dumb
Дата 2.1.2008, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 32
Всего: 158



Цитата(Sharkfire @  2.1.2008,  11:59 Найти цитируемый пост)
Выкладываю работающий код
это "через раз работающий" код.

Многопоточность - как это делается в Дельфи.
Пример простого многопоточного приложения.
PM MAIL   Вверх
Sharkfire
Дата 5.1.2008, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 236
Регистрация: 30.11.2006
Где: Одесса

Репутация: 2
Всего: 2



У меня всё идеально.. у тебя есть варианты получьше? слушаю... 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0468 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.