Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Послать сообщение всем клиентам.


Автор: _Rin 13.9.2006, 10:15
Пишу чат на Indy.

Клиенты посылают сообщения серверу. 
Сервер выводит их у себя в Memo-поле с указанием от кого пришло.

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

Помогите плизз!!!
http://forum.vingrad.ru/html/emoticons/qstn.gif
smile  

Автор: Snowy 13.9.2006, 10:19
Посмотри темы внизу страницы.

Автор: _Rin 13.9.2006, 10:41
Смотрела. Но все равно не понимаю.
Столкнулась с Indy первый раз.

Есть обработчик TCPServerExecute(AThread: TIdPeerThread);
Сервер получает сообщение от одного клиента, выводит его в Memo, а затем шлет ответ этому клиенту
о том, что все принял правильно.

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


http://forum.vingrad.ru/html/emoticons/stena.gif
smile

Автор: Alexeis 13.9.2006, 10:53
_Rin, Пробовала использовать адрес типа 192.168.0.255
такие сообщения обычно идут всем клиентам диапазона
192.168.0.0 - 192.168.0.254

Автор: Snowy 13.9.2006, 12:18
У TIdTCPServer есть свойство Bindings - это и есть массив подключенных клиентов.
Выбирай нужного и шли что хочешь.

Автор: _Rin 13.9.2006, 14:55
Спасибо за помощь, я нашла подходящий пример и во всем разобралась.
Но возникла новая проблема.

Пытаюсь подключится к серверу, и периодически возникает ошибка Connection Closed Gracefully.
(именно периодически,  клиент может подсоединится и нормально, без ошибок).
В чем может быть причина, и как её устранить.

Код клиента:

Код

procedure TClientForm.Connect_to_Server();
begin
 try
  StatusBar1.Panels.Items[0].Text:='Есть соединение';
  MainMenu1.Items[0].Enabled:=false;
  TCPClient.Connect();

 except
  on E: Exception do
  begin
   MessageDlg(#13+E.Message,mtConfirmation,[mbOk],0);
   Memo2.Lines.Add(E.Message);

   if TCPClient.Connected=false then
   begin
    StatusBar1.Panels.Items[0].Text:='Нет соединения';
    Login.Enabled:=true;
    Password.Enabled:=true;
    SendButton.Enabled:=false;
    MainMenu1.Items[0].Enabled:=true;
   end;
  end;
 end
end;

Автор: Snowy 13.9.2006, 15:05
Модератор: Пожалуйста, используйте кнопку "Код" для выделения кода
А то я уже устал править за Вами все сообщения.

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

Автор: _Rin 13.9.2006, 15:13
Ладушки: буду использовать Кнопку "Код".

На счет сервера:
- сервер работает (свойство Active - устанавливаю в true)
- сообщение может выскочить, даже если подключается первый клиент (то есть никаких других подключений у сервера нет). 
- ограничений на количество подоключений тоже нет.

Не знаю, в чем дело.

Автор: Snowy 13.9.2006, 15:22
Цитата(_Rin @  13.9.2006,  15:13 Найти цитируемый пост)
Не знаю, в чем дело.
Аналогично.
Может у сервера плохое настроение, голова болит...
Ну не хочет он принимать подключение.
Можно попробовать делать 3 попытки подключения вместо одной.
А так - гадание на кофейной гуще. Здесь всё совсем не очевидно.
Самая сложная в отлове ошибка - нестабильная. Может выскочить, а может и нет...

Автор: _Rin 13.9.2006, 15:24
Все заработало.
Ошибка была на строне сервера.

Выделение памяти надо было делать не GetMem/Free, а New/Dispose.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)