![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TIdCmdTCPServer
Zalm © (2009-08-31 13:14:00)Здравствуйте, как у TIdCmdTCPServer можно всем клиентам разослать сообщение? Надо например каждому отослать команду. Это должно быть естественно в цикле, только я не знаю как и где. У TServerSocket было проще всё, ну или понятней.
1)Вот например у меня есть кнопка на сервере, как сделать чтоб ы при нажатии на кнопку каждому подключению что-то отправить, и что бы узнать его адрес там и тд?
2) Как узнать ip и handler подключения? и в каком евенте... если в OnConnect то я не опнля как...
3) Как вне событий отправить текст на подключение с известным адресом\обработчкиом?
Буду очень благодарен за помощь.
Сергей М. (2009-09-01 22:10:00) [121]
> как лучше можно было бы сделать
Пока не будет внятного разработанного тобой протокола информационного обмена, рассуждения на тему "лучше-хуже" лишены смысла.
Zalm (2009-09-01 21:42:00) [122]А какие у меня выкрутасы?) вобще задача у меня такая, нужен сервер который будет как бы точкой переброса, короче надо что бы он мог создавать "пары" из соединений, и транслировать между ними (между членами в паре) трафик, в данном случае любой текст, который любой член этой пары захочет послать. Например один клиент передает команду на сервер, сервер принимает и смотрит от кого пришло и пересылает это тому кто находится в паре с этим клиентом. Да, такая спицифическая система)
Тогда что вы бы посоветовали какой компонент использовать?
Подскажите пожалуйста как лучше можно было бы сделать.
Сергей М. (2009-09-01 10:05:00) [123]
> зачем обязательно в Execute писать?
А ты и в Execute не напишешь.
Execute вызывается только если у сервера список CommandHandlers пуст, а он у тебя заведомо не пуст, ибо нафих тогда нужен Tid CmdTCPServer ?
Ты пойми главное - TidCmdTCPServer не предназначен для выкрутасов задуманного тобой вида, он заточен и призван работать в режиме "команда клиента -> ответ сервера как результат выполнения этой команды". На то как раз ComandHandler'ы у него и существуют.
Медвежонок Пятачок (2009-09-01 07:58:00) [124]ты сначала вот над этим порассуждай:
присоединился клиент и висит на сервер. затем он отправляет на сервер команду.
серверу в это время приходит в голову разослать всем клиентам сообщение и он это делает.
а клиент в это время команду уже отправил и ждет свой законный ответ именно на нее.
вместо этого он получает кусок байтов, которые он интерпретирует как ответ на команду.
а на самом деле там у тебя там дрова лежат.
ps
для обмена между сервером и клиентом нужно стрго следовать какому-то стандартному протоколу, либо придумать свой протокол и следовать ему.
Zalm (2009-09-01 03:35:00) [125]Я наверное что-то не понимаю... но у меня нельзя так сделать из любого места. Вот допустим я знаю порт и адрес, как вы сказали,
Потом отсылаю в процедуру, адрес и порт, а когда хочу написать в процедуре Server.Connections то такого нет, есть только Server.Contexts.LockList а в лок-листе нет опять же свойства ни сокетов ни Connections... опять я чего-то не понял? :(
Zalm (2009-08-31 22:55:00) [126]эх так и знал что вся подстава в этом LockList ((( я его открыл посмотрел и забил, ибо не показалось что как-то с сервером связано.
А зачем обязательно в Execute писать?
Спасибо большое, щас пойду пробовать.
Сергей М. (2009-08-31 20:50:00) [127]
> мне Execute не надо, я там ничего не пишу
А куда ты денешься с подводной лодки ?
Придется писать.
> как записать в массив что-то конкретное из
Не надо ничего никуда "пихать" - все уже давным-давно "напихано".
В списке Connections.LockList каждый элемент - это TIdPeerThread.
У TIdPeerThread есть объектное св-во Connection: TIdSocketHandle
У объекта TIdSocketHandle есть св-ва PeerIP и PeerPort - адрес и порт клиента. Эта комбинация всегда уникальна, и этого достаточно для однозначной идентификации клиента.
Кр.того, у объекта TIdSocketHandle есть send/recv-методы для коммуникации с клиентом.
Zalm (2009-08-31 19:01:00) [128]а мне Execute не надо, я там ничего не пишу, всё только в командным обработчиках. А через OnConnect просто хотел записывать данные в массив о подключившихся что бы их как-то различать потом.
только вот как записать в массив что-то конкретное из события OnConnect я так и енп онял... Не подскажете?
Медвежонок Пятачок (2009-08-31 18:32:00) [129]для десятки это будет так:
IdCmdTCPServer1Execute(AContext: TIdContext);
вот этот контекст и есть то, что чего ты весь день ищешь
Медвежонок Пятачок (2009-08-31 18:29:00) [130]Дядя, в метод OnExecute сервера тебе передано нечто.
Нечто это бывает разным в разных версиях инди.
Вот это нечто и есть то что тебе надо. А так же все что вложено в этот тип.
Zalm (2009-08-31 18:27:00) [131]угу, если бы я писал через TServerSocket я бы не задавал таких тупых вопросов.
Ну вот разве что это что-то дельное AContext.Connection.Socket.Binding.Handle;
и адрес там можно узнать.
Тока пользы никакой для меня, в Server.Contexts я так и не нашел куда можно этот значение приспособить...
Тока в Server.Bindings.BindingByHandle(HND).SendTo(); можно пихнуть... и то не получилось:(
а примеры на 10-Ю версию не могу найти((
Медвежонок Пятачок (2009-08-31 17:56:00) [132]коннекшен - это и есть "кто"
Zalm (2009-08-31 17:46:00) [133]да адрес клиента не при чем, это я просто сказал что например как узнать.
Главное как клиента идентифицировать что бы потом знать кто есть кто...
Медвежонок Пятачок (2009-08-31 17:33:00) [134]и все же загадка. зачем ему понадобился адрес клиента.
Сергей М. (2009-08-31 17:10:00) [135]Скачай для 10-ки, в чем проблема ?
Заодно и справку скачай.
Zalm (2009-08-31 17:04:00) [136]примеры у меня ткоа на 9-ю версию есть, там иначе всё написано.
Сергей М. (2009-08-31 16:59:00) [137]
> Anatoly Podgoretsky © (31.08.09 16:56) [13]
Ну дык еще и исходники всегда перед носом)
Довольно сложно сыграть в ящик, имея справку+исходники ..
Anatoly Podgoretsky (2009-08-31 16:56:00) [138]> Сергей М. (31.08.2009 16:43:12) [12]
А не умрет ли он скорее со справкой, ведь речь про ИНДИ
Сергей М. (2009-08-31 16:43:00) [139]
> "Server.Contexts" вот тут ниче нет явно
Что значит "нече нет явно" ?
> Server.Bindings
Это из другой оперы, к клиентским коннектам оно отношения не имеет.
> справки у меня нету
Мыши сгрызли ?)
Коли нету - купи, найди, укради.
Без справки ничего путного не получится - так и будешь тыкаться как слепой котенок)
Медвежонок Пятачок (2009-08-31 16:41:00) [140]да и адрес не узнать....
Интересно, что ты будешь делать, если узнаешь этот адрес.