C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Indy обмен сообщениями  (Прочитано 2905 раз)
Program87
Участник


Сказали спасибо: +1/-0
Offline

Сообщений: 137


Indy обмен сообщениями
« : 27 Октябрь 2013, 21:52:10 »

Здравствуйте, недавно решил начать изучение компонентов данной палитры.
Поначалу все шло достаточно хорошо, но неожиданно я столкнулся с такими проблемами:
1 - не могу отправить сообщение с сервера клиенту, даже одному. Нескольким вообще пока не понял.
2 - и второе это как правильно получить сообщение от сервера.
С первым нашел множество описаний но на делфи, проблема в том что ни как не могу понять на си таких нет.
Вот так отправляю серверу:
Код:
IdTCPClient1->IOHandler->WriteLn(Edit1->Text, enUTF8);
Вот так принимаю на сервере:
Код:
AnsiString tempZap;
tempZap = AContext->Connection->IOHandler->ReadLn(enUTF8);
А вот как сделать на оборот не знаю, подскажите пожалуйста. Если есть возможность, то подскажите как отправить не одному клиенту а определенному?
Записан
Program87
Участник


Сказали спасибо: +1/-0
Offline

Сообщений: 137


Re: Indy обмен сообщениями
« Ответ #1 : 10 Ноябрь 2013, 21:59:45 »

Уважаемые Форумчане, смог немного разобраться:
Отправить сообщение клиенту, определенному клиенту вот так:
Код:
TList* cList;
   cList = IdTCPServer1->Contexts->LockList();
   ListBox1->Items->Add(cList->Count);
   try
{
((TIdContext *)cList->Items[0])->Connection->IOHandler->WriteLn(Edit2->Text, enUTF8);
}
   __finally
{
IdTCPServer1->Contexts->UnlockList();
}
А принять можно только через таймер.
Код:
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if (IdTCPClient1->Socket->Connected()==true)             //проверка на соединение
{
if (IdTCPClient1->Socket->InputBufferIsEmpty()==false) //проверка на наличии в буфере данных
        {
  Vxod = IdTCPClient1->Socket->ReadLn(enUTF8); //считаем буфер
  Label1->Text = Vxod;                                   //свои действия
        }
}
}
Может кому нибудь понадобиться.
Однако, теперь я наткнулся на вот такую проблему, которую вообще никак не могу решить:
Код:
void __fastcall TForm1::IdTCPServer1Execute(TIdContext *AContext)
{
   AnsiString tempZap;
   tempZap = AContext->Connection->IOHandler->ReadLn(enUTF8);
   AnsiString tempd;
   tempd = tempZap.SubString(tempZap.Pos("") + 3, tempZap.Pos("") - 4);
   Label4->Text = tempd;
   if (tempd == "qzap")
   {
  Label5->Text = "OK";
   }
   else
   {
  Label5->Text = "NO";
   }
}
При создании любого цикла, информация то приходит то не приходит, то есть в Label5, текст появляться не всегда.
Подскажите, что это такое вообще? 
Записан
Hex
Участник


Сказали спасибо: +16/-3
Offline

Сообщений: 38


Re: Indy обмен сообщениями
« Ответ #2 : 14 Декабрь 2013, 12:50:49 »

Шаблон: SubString(Index, Count)
У вас: SubString(tempZap.Pos("") + 3, tempZap.Pos("") - 4);
Вопрос: почему Count плавает?
Записан
Program87
Участник


Сказали спасибо: +1/-0
Offline

Сообщений: 137


Re: Indy обмен сообщениями
« Ответ #3 : 10 Февраль 2014, 17:24:54 »

Уважаемый Hex, Count плавает потому что курсор на чтение устанавливается в самое начало и самый конец, по этой причине я добавляю дополнительное количество символов:
Код:
"" - 3 символа в полюс
"
" - 4 символа в минус.
Это просто пример, так можно добавить непосредственно длину символа, но я сделал так....
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.065 секунд. Запросов: 19.