Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,150
Записей в блоге: 3

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

03.07.2013, 12:41. Показов 9710. Ответов 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,150
Записей в блоге: 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,150
Записей в блоге: 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,150
Записей в блоге: 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,150
Записей в блоге: 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,150
Записей в блоге: 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,150
Записей в блоге: 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,150
Записей в блоге: 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,150
Записей в блоге: 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): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru