Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/50: Рейтинг темы: голосов - 50, средняя оценка - 4.88
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,145
Записей в блоге: 3

IdTCPClient: возможно ли клиентом получать просто сообщения от сервера, не прибегая к таймеру?

03.07.2013, 12:41. Показов 9694. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вопрос в следующем, возможно ли клиентом получать просто сообщения от сервера,не прибегая к таймеру. Допусти при кокнете, я могу сделать что бы клиент ждал ответ от сервера..ну вот он его получил, и как ждать следующий (таймер мне кажется не верное решение).


Если нет решения, то подскажите рабочий пример передачи сообщений между обычными сокетами (XE3, не билдер6). Та как в XE3 (не знаю как в младших версиях) сокеты стали какие то замудреные, пакеты клиент отказывается принимать, а серверу приходится самому объявлять события приема пакета

С уважением.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.07.2013, 12:41
Ответы с готовыми решениями:

Получить весь "ТЕКСТ" сайта используя методы компонентов, не прибегая к парсигу кода
Доброго времени суток. Как получить получить ТЕКСТ страницы а НЕ КОД используя IdHTTP или иной...

IdTcpServer & IdTcpClient
Здравствуйте! Подскажите пожалуйста, как получить текстовое сообщение от клиента? Сервер:...

Использование IdTCPClient
Приветствую всех обозревающих это сообщение, т.е. потенциальных помощников! :) Прошу помощи в...

25
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
03.07.2013, 13:41
вот аналогичная вашей тема
и "головой об стену" получается из за некоторых недопониманий идеи клиент-сервер. а там все просто: клиент всегда инициатор, сервер ответчик. и этого достаточно, беда только в том, что не всем хватает найти в себе смелости наделить один объект одновременно св-вами клиента и сервера, при этом если в объекте преобладают функции сервера, он будет Сервером, и наоборот.

пример: парикмахерские - сервера, прохожие - клиенты. нужно прохожему подстричься, он обратится в парикмахерскую. по умолчанию наоборот не бывает.
но если вдруг парикмахер захочет зазвать к себе клиентов рекламой, объявлениями по всему городу или просто выйдет на улицу и будет орать: "подстригу за дешево!"
он временно перестанет быть тем самым Сервером, он будет видеть в каждом прохожем Сервер и будет цепляться(уже как Клиент) к нему со своими предложениями ,то бишь в каждом прохожем есть в голове серверок, на которые он принимает всяческие призывы, а затем решает зайти ему побриться или нет, уже в качестве Клиента...

но это на самом деле не так часто требуется, т.е именно такая критичность. вполне достаточно того, что с каким-то интервалом волосы у людей отрастают и соответвенно с определенной периодичностью человек-таки посещает парикмахерскую.

понимаете о чем я?
поступайте как решите нужным
1
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,145
Записей в блоге: 3
03.07.2013, 14:15  [ТС]
Да я понял о чем Вы и благодарю за ссылку на тему, но перед тем как написать,все темы перерыл и на нее наталкивался.
Просто в BCB6 был удобный как клиент так и сервер (обычные сокеты), писал бы в нем, но к сожалению нужно имено среде XE3 написать. На счет что бы все таки сделать таймер, то не понятно как быть с пакетами которые с десяток в пол секу приходят. Но все равно спасибо что не поленились и откликнулись.
0
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
04.07.2013, 05:13
Цитата Сообщение от Dinkin Посмотреть сообщение
не понятно как быть с пакетами которые с десяток в пол секу приходят
опять же если у вас все критично, то конечно таймер не выход. и тут уже не должно быть так что клиент спрашивает, сервер отвечает, тут инфа должна передаваться уже в запросе.
возможно даже придется отказаться от готовых компонентов.
вчера все-таки вычитал, что winapi-шными сокетами используя SendTo можно отправлять сообщения сервером конкретному клиенту, ну и понятно широковещание там же.
1
91 / 91 / 22
Регистрация: 02.07.2013
Сообщений: 332
04.07.2013, 10:03
Клиент постоянно обращается к серверу в отдельном потоке. Можно с некоторой задержкой. Подключился, если данные есть, он их обрабатывает или передаёт/записывает куда надо. Отключается, опять подключается и т.д. Сервер свои данные подготавливает, буферизует и, как только клиент подключается, передаёт ему всё накопленное и начинает заново копить и ждать подключения.
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,145
Записей в блоге: 3
04.07.2013, 10:42  [ТС]
AntonChik Вы совершено правы. но проблема в том что XE3 сокеты обделены нормальным приемом пакетов (я сейчас именно про сервер), так ка там в отличие от bsb6 пропало событие "Он Рид". Я заметил что в XE его можно объявить самостоятельно, но тогда в нем не возможно объявить от какого клиента пришел пакет.

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


Не понятно зачем так загадили сокеты, ведь все так было хорошо в bcb6 =)
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
04.07.2013, 16:52
Цитата Сообщение от Dinkin Посмотреть сообщение
Не понятно зачем так загадили сокеты, ведь все так было хорошо в bcb6 =)
Нифига не хорошо, поэтому и кординально переделали + Unicode, разбирайтесь...

Код приводимый мной в той теме на XE3.
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,145
Записей в блоге: 3
04.07.2013, 17:05  [ТС]
прошу прощения, не могу понять а что за код, который Вы предоставили в теме про XE3 может помочь моей проблеме?

Уточню что клиент может только раз слать пакет серверу и больше его не трогать, а сервер в процессе включения может слать огромное количество пакетов всем соединенным клиентам.
С уважением
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
04.07.2013, 17:10
Цитата Сообщение от Dinkin Посмотреть сообщение
прошу прощения, не могу понять а что за код, который Вы предоставили в теме про XE3 может помочь моей проблеме?
не про, а для XE3
Indy Client/Server Обмен сообщениями

Добавлено через 30 секунд
Цитата Сообщение от Dinkin Посмотреть сообщение
Уточню что клиент может только раз слать пакет серверу и больше его не трогать, а сервер в процессе включения может слать огромное количество пакетов всем соединенным клиентам.
И в чем проблема ?
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,145
Записей в блоге: 3
04.07.2013, 17:23  [ТС]
А читал тему, к сожалению не нашел для себя в ней полезной информации..а проблема в следующем: Есть сервер и с десяток клиентов, они только логинятся на нем и большую часть времени слушают,изредка посылая на него пакеты.

Думал решить это или просто сокетами или инди соедеинением:

1) Если инди клиент, то неудобно слушать пакеты, приходится делать таймер на прослушку. А так как в секунду может прийти грубо говоря с 20 пакетов...то при каждом тайминге их наваливается столько много, и не получается нормально их обработать. а порой даже с антифризом клиент замирает намертво.

2) Обычные сокеты проблема а) с сервером, непонятно как в событие "он ресив" передавать от кого клиента пришел пакет б) клиент хоть как то отказывается реагировать в своем событие "он ресив"
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
04.07.2013, 20:06
Цитата Сообщение от Dinkin Посмотреть сообщение
1) Если инди клиент, то неудобно слушать пакеты, приходится делать таймер на прослушку. А так как в секунду может прийти грубо говоря с 20 пакетов...то при каждом тайминге их наваливается столько много, и не получается нормально их обработать. а порой даже с антифризом клиент замирает намертво.
А про потоки слышали ?
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,145
Записей в блоге: 3
04.07.2013, 20:23  [ТС]
...есть ли у кого есть пример сокетов на XE3 или как-то мыслями помочь?
0
91 / 91 / 22
Регистрация: 02.07.2013
Сообщений: 332
05.07.2013, 09:44
Dinkin
Мой вариант чем не устраивает?
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,145
Записей в блоге: 3
05.07.2013, 10:19  [ТС]
c0rvax На самом деле интересный вариант...испугало именно то что нужно будет еще работать над пакетами, то есть с начало копить, а после массу разбирать))
Если Вас не затруднит, вы не могли просто накидать не большой пример (пускай кривой и не совсем рабочий), что бы глядя на него можно было понять как работать в потоке с запросом от инди клиента
0
91 / 91 / 22
Регистрация: 02.07.2013
Сообщений: 332
05.07.2013, 16:23
Dinkin
У меня не ХЕ. Может лучше показать свой код?
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,145
Записей в блоге: 3
05.07.2013, 16:37  [ТС]
Буду при много благодарен
0
91 / 91 / 22
Регистрация: 02.07.2013
Сообщений: 332
05.07.2013, 17:13
Свой код покажи, свой. Не мой.
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,145
Записей в блоге: 3
05.07.2013, 19:59  [ТС]
Данный кусок кода конектится и и ждет ответ от сервера

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
TIdTCPClient *ind = new TIdTCPClient(this);
TIdAntiFreeze *friz = new TIdAntiFreeze(this);
ind->Host=127.0.0.1;
ind->Port=4545;
 
        try
        {
            ind->Connect(); //Подключаемся.
        }
            //Если не удалось
            catch(...)
            {
            ind->Disconnect();
            }
                if(ind->Connected())//Если подключились
                    {
                      ind->Socket->WriteLn(st1);
 
 
                   try//Если вдруг сервер откинул не от отправля ответа
                    {
 
                        Smoke500= ind->Socket->ReadLn();
                    }
                    catch (...)
                    {
                       ind->Disconnect();
                                             }
0
91 / 91 / 22
Регистрация: 02.07.2013
Сообщений: 332
05.07.2013, 20:18
Весь этот код помещаешь в отдельный поток
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void __fastcall TClientThread::Execute()
{
  TIdTCPClient *ind = new TIdTCPClient(this);
  TIdAntiFreeze *friz = new TIdAntiFreeze(this);
  ind->Host=127.0.0.1;
  ind->Port=4545;
 
  while( !Terminated )
  {
    try
    {
      try
      {
        if( !ind->Connected() ) ind->Connect(); //Подключаемся.
        if( ind->Connected() )//Если подключились
        {
          ind->Socket->WriteLn(st1);
          Smoke500= ind->Socket->ReadLn();
          // Здесь обрабатываем полученные данные
        }
      }
      __finally
      {
        ind->Disconnect();
      }
    }
    catch(...)
    {
    }
    Sleep( 1000 ); // Задержка
  }
}
Теперь сервер. Если ты оперируешь строками, то на стороне сервера можно просто накапливать строки, собирая их в TStringList. Когда подключается клиент, то передаётся сразу весь стринглист, если он не пустой, или отказ в подключении. Потом ты свою мегастроку Smoke500 уже на стороне клиента [там, где обработка данных] засовываешь в стринглист и получаешь всё, что сервер накопил.
1
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.07.2013, 20:21
C++
1
2
3
4
void __fastcall TClientThread::Execute()
{
  TIdTCPClient *ind = new TIdTCPClient(this);
  TIdAntiFreeze *friz = new TIdAntiFreeze(this);
Утечка ?

Не хорошо так делать, тут могут быть проблемы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.07.2013, 20:21
Помогаю со студенческими работами здесь

IdTCPClient не возникает событие Disconnecting
Сервер выключается, делает дисконект или пропадает сетевое соединение а IdTCPClient никак не...

Сменился ли у IdTCPServer и IdTCPClient режим работы?
Для себя сделал открытие работая с IdTCPServer и IdTCPClient...что у них сменился режим работы. Они...

IdTCPClient не коннектится
всем привет! написал клиент к своему серверу, на 30% машин не работает, выдает исключение, но не...

Сократить таймаут и количество посылаемых пакетов IdTCPClient
Собственно вопрос, можно ли как то в IdTCPClient сократить таймаут пинга и\или кол-во посылаемых...

Передача XML-файла через IdTCPClient
Я пытаюсь передать через IdTCPClient свой XML-файл, созданный внутри среды грубо говоря, его...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru