Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2011, 01:31   #1
pomkalk
Пользователь
 
Регистрация: 01.04.2011
Сообщений: 13
По умолчанию TCPServer и TCPClient на indy 10, Отправка сообщения с сервара

Всем привет, У меня стоит TCPServer на indy 10, к нему подключено большое число клиентов через блокирующие соединение, все отлично работает, но возникла задача отправлять прямо с сервера всем подключенным клиентам "Системное" сообщение, либо конкретному, как это сделать, как отправить сообщение с сервера клиенту.

Использую delphi/c++ builder и indy 10, TCPServer и TCPClient, не TServerSocket

Заранее спасибо!
pomkalk вне форума Ответить с цитированием
Старый 01.04.2011, 09:51   #2
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

создаёте структуру клиента, например
Код:
type
 сlient = record
  clIP:String;//ip клиента 
  Con:TIdContext;
  Used:boolean//занят слот или нет
 end;
создадим массив клиентов
Код:
var clients: array [1..50] of client;//на 50 клиентов
У сервера есть обработчик в котором будем добавлять клиентов
Код:
procedure TForm1.IdTCPServer1Connect(AContext: TIdContext);
var i:integer;
begin
 for i:=1 to High(clients) do
  if not clients[i].Used then //если не занят слот
   begin
    clients[i].clIP:=AContext.Connection.Socket.Binding.PeerIP);
    clients[i].Con:=AContext;
    clients[i].Used:=true;//слот занят 
   end;
end;
потом уж пробегайтесь в цикле по clients и если слот занят т.е. используется отсылайте сообщение
Код:
if clients[i].Used then clients[i].Con.Connection.IOHandler.WriteLn('привет')
ну и не забывайте при отсоединении клиента освобождать место
SERG1980 вне форума Ответить с цитированием
Старый 01.04.2011, 11:09   #3
pomkalk
Пользователь
 
Регистрация: 01.04.2011
Сообщений: 13
По умолчанию

А в клиенте какое событие при этом среагирует?
pomkalk вне форума Ответить с цитированием
Старый 01.04.2011, 11:52   #4
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

а в клиенте придётся ставить таймер и в нём писать:
Код:
 if TCPClient.Connected then
  begin
   try
    s:=TCPClient.ReadLn;//var s:string;
   except
    on EIdReadTimeOut do;//игнорируем ошибки таймаута
    else TCPClient.Disconnect;//если чё не так то отсоединяемся 
  end;
  end;
ну и ставить таймер например на 100мс
SERG1980 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Indy TCPClient, TCPServer получение списка процессов с удаленного компьютера WildWest Работа с сетью в Delphi 3 02.03.2011 08:48
Indy отправка сообщения Andrey85 Работа с сетью в Delphi 1 08.11.2010 11:47
TCPServer, TCPClient seobot Общие вопросы Delphi 2 03.05.2010 23:56
TcpClient и TcpServer DOLBY Работа с сетью в Delphi 5 17.12.2007 10:43
TCPServer и TCPClient Antoha Работа с сетью в Delphi 19 06.10.2007 12:01