Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Indy 10, Server -> Client 
:(
    Опции темы
CaLaT
Дата 28.3.2009, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 29.6.2008
Где: Город родной - Пи тер я твой!

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



Долго пытался разобраться, но, ну никак, не получается. Разбираюсь в Indy 10, Builder 2007
Суть - есть сервер, есть клиенты. Клиенты приконнектились, и просто сидят ждут, когда сервер в ему угодное время отправит что-либо. Так вот. Как клиентом серверу сообщения посылать я понял, а вот как сервер клиенту должен послать я так и не понял.

Большая просьба помчь строчкой кода ввиде примера.
PM MAIL   Вверх
SVN74
Дата 29.3.2009, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 5.5.2008
Где: Комсомольск на Дн епре

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



Цитата(CaLaT @  28.3.2009,  22:19 Найти цитируемый пост)
Так вот. Как клиентом серверу сообщения посылать я понял, а вот как сервер клиенту должен послать я так и не понял.

Client ----->>>>> "OK"
Server ------->>>>> "NoOK"
======================
Сервер посылает в созданном потоке (при соединении с клиентом) ответ....


Это сообщение отредактировал(а) SVN74 - 29.3.2009, 00:03
PM MAIL WWW   Вверх
CaLaT
Дата 29.3.2009, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 29.6.2008
Где: Город родной - Пи тер я твой!

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



Допустим, я могу сразу ответить клиенту например так:

Код

void __fastcall TMForm::ServerConnect(TIdContext *AContext)
{
    String Cmd;
    Cmd=Trim(AContext->Connection->IOHandler->ReadLn());

    if (AnsiSameText(Cmd, "Help"))
        AContext->Connection->IOHandler->WriteLn('OkiDoki');

}


но как я смогу ответить вне функций ОнКоннект и ОнЭкзекьют, ведь там-то у меня не будет передаваемого *AContext? Ну в смысле, где в объекте TIdTCPServer хранятся указатели на подключенных клиентов?

За ранее пасибо!
PM MAIL   Вверх
SVN74
Дата 29.3.2009, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 5.5.2008
Где: Комсомольск на Дн епре

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



Вот отдельное событие (отдельный поток)
====================================================
void __fastcall TForm1::IdTCPServer1Execute(TIdContext *AContext)
{
   try
   {
     Тут обслуживаем клиента, если надо сделаем задержку

   }
   __finally
   {
       AContext->Connection->Disconnect();
   }
}
PM MAIL WWW   Вверх
CaLaT
Дата 29.3.2009, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 29.6.2008
Где: Город родной - Пи тер я твой!

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



Цитата(CaLaT @  29.3.2009,  00:11 Найти цитируемый пост)
но как я смогу ответить вне функций ОнКоннект и ОнЭкзекьют, ведь там-то у меня не будет передаваемого *AContext? Ну в смысле, где в объекте TIdTCPServer хранятся указатели на подключенных клиентов?



Цитата(SVN74 @  29.3.2009,  00:18 Найти цитируемый пост)
void __fastcall TForm1::IdTCPServer1Execute(TIdContext *AContext)


Как из функции Execute и других у объекта IdTCPServer сделать ответ клиенту я понял, ну а как это сделать скажем из функции Баттон1? Или ты хочешь сказать что это не возможно и нужно делать задержки в функции экзекьют? Это же такое геморрой  smile

Добавлено через 6 минут и 12 секунд
Допустим в TcpServer's инфа о подключенных хранилась в  TcpServer->Socket->Connections[index], неужели нет аналога у IdTCPServer? 
PM MAIL   Вверх
SVN74
Дата 29.3.2009, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 5.5.2008
Где: Комсомольск на Дн епре

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



Цитата(CaLaT @  29.3.2009,  08:29 Найти цитируемый пост)
ну а как это сделать скажем из функции Баттон1? Или ты хочешь сказать что это не возможно и нужно делать задержки в функции экзекьют? Это же такое геморрой  

Да, нужно делать задержку для клиента, (правда, если количество клиентов не очень большое), а Button1 -> это общий ресурс, соответственно в потоке TForm1::IdTCPServer1Execute (через синхронизацию) просто надо отслеживать изменения состояния (к примеру) глобальной переменной и делать определенные выводы и причем это не затронет основной поток, и не будет видно ни каких задержек...
PM MAIL WWW   Вверх
CaLaT
Дата 29.3.2009, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 29.6.2008
Где: Город родной - Пи тер я твой!

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



Ладно, попытаюсь реализовать... хотя назвать это удобным, мегко говоря, не получается.
И еще вопрос - если допустим у меня 4и клиента находяцца на коннекте (из функции Экзекьют я уже вышел) и мне надо его отдесконектить, то как обраться именно к 3ему клиенту и скачать ему "пока"? 

Это сообщение отредактировал(а) CaLaT - 29.3.2009, 12:50
PM MAIL   Вверх
SVN74
Дата 29.3.2009, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 5.5.2008
Где: Комсомольск на Дн епре

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



Попробуй так:
===================
AContext->Connection[0].IOHandler->WriteLn("Bla, Bla");
===================
Можно еще так:
==========================
IdTCPServer1->Bindings->Items[0]->Collection->Count;
IdTCPServer1->Bindings->Items[0]->........
==========================
Надо пробовать всевозможные варианты...

==================================================
Вообще лучше использовать WinSock (без гмр.)

Это сообщение отредактировал(а) SVN74 - 29.3.2009, 17:51
PM MAIL WWW   Вверх
CaLaT
Дата 30.3.2009, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 29.6.2008
Где: Город родной - Пи тер я твой!

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



Код

procedure TForm1.Button1Click(Sender: TObject);
begin
if IdTCPServer.Contexts <> nil then
  begin
    with IdTCPServer.Contexts.LockList do try
        TIdContext(Items[i]).Connection.IOHandler.Writeln('Hello');
    finally
      IdTCPServer.Contexts.UnLockList;
    end;
  end;
end;
------------------------------------------------
TIdContext(Items[i]).Connection.Socket.Binding.PeerIP
TIdContext(Items[i]).Connection.Socket.Binding.PeerPort
Покажет откуда к тебе подключились, если произошел сдвиг  
------------------------------------------------
TIdContext(Items[i]).Connection.Disconnect(False);


Пытался работать с этим в си и у меня не получается привести Server->Contexts->LockList()->Items[0] (void*) к типу TIdContext... есть мысли?

Это сообщение отредактировал(а) CaLaT - 30.3.2009, 08:45
PM MAIL   Вверх
CaLaT
Дата 30.3.2009, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 29.6.2008
Где: Город родной - Пи тер я твой!

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



Цитата(CaLaT @  30.3.2009,  08:42 Найти цитируемый пост)
не получается привести Server->Contexts->LockList()->Items[0] (void*) к типу TIdContext


Сделал так:
Код

    ShowMessage(Server->Contexts->LockList()->Count);
    TIdContext *Context=static_cast<TIdContext *>(Server->Contexts->LockList()->Items[0]);
    Context->Connection->Socket->WriteLn("Send You Hello!");
    Server->Contexts->UnlockList();


И вот только теперь я заметил что у объекта TIdTCPClient нет метода OnRead() или OnReceive(). Каким образом мне понять что сервер что-то засылает?

пс: я надеюсь, для этого не потребуется в цикле проверять

Добавлено через 3 минуты и 4 секунды
Просьба не предлогать проверять в ручную, всё таки эта будет лишняя нагрузка, которая кленту не нужна
PM MAIL   Вверх
Anikmar
Дата 30.3.2009, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

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



Цитата(CaLaT @  30.3.2009,  18:20 Найти цитируемый пост)
И вот только теперь я заметил что у объекта TIdTCPClient нет метода OnRead() или OnReceive(). Каким образом мне понять что сервер что-то засылает?

Так там вроде запихнуто все в одно событие OnWork. Или я ошибаюсь?
PM MAIL ICQ   Вверх
CaLaT
Дата 30.3.2009, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 29.6.2008
Где: Город родной - Пи тер я твой!

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



К сажелению событие ОнВорк несрабатывает... вообще никогда. Хотя если вручную проверить, то сообщение отправленное сервером на сокете есть.

Это сообщение отредактировал(а) CaLaT - 30.3.2009, 22:03
PM MAIL   Вверх
CaLaT
Дата 30.3.2009, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 29.6.2008
Где: Город родной - Пи тер я твой!

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



Даже ОнСтатус возвращающий стринги с текущими действиями не реагирует на сообщения от сервера
PM MAIL   Вверх
SVN74
Дата 30.3.2009, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 5.5.2008
Где: Комсомольск на Дн епре

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



WinSock просто и надежно...
PM MAIL WWW   Вверх
CaLaT
Дата 12.4.2009, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 29.6.2008
Где: Город родной - Пи тер я твой!

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



Так и не нашёл...
Пришлось реализовать через tplower поток, который мониторит сокет на появление данных

Еще вопрос:
При передачи достаточно больших файлов, хотелось бы юзеру сообщать об общем ходе передачи на стороне клиента. 
Нашёл переменную - WriteBufferThreshhold , которая по идеи и должна возвращать желанное. Но получаю почему-то только -1.

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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