Форум: "Начинающим";
Текущий архив: 2010.01.24;
Скачать: [xml.tar.bz2];
ВнизTIdCmdTCPServer Найти похожие ветки
← →
Zalm © (2009-08-31 13:14) [0]Здравствуйте, как у TIdCmdTCPServer можно всем клиентам разослать сообщение? Надо например каждому отослать команду. Это должно быть естественно в цикле, только я не знаю как и где. У TServerSocket было проще всё, ну или понятней.
1)Вот например у меня есть кнопка на сервере, как сделать чтоб ы при нажатии на кнопку каждому подключению что-то отправить, и что бы узнать его адрес там и тд?
2) Как узнать ip и handler подключения? и в каком евенте... если в OnConnect то я не опнля как...
3) Как вне событий отправить текст на подключение с известным адресом\обработчкиом?
Буду очень благодарен за помощь.
← →
DimaBr © (2009-08-31 13:42) [1]Внимание! Здесь обсуждаются вопросы, связанные с разработкой компонентов, редакторов свойств, редакторов компонентов и экспертов IDE.
Вопросы по поиску и использованию готовых компонентов, редакторов или экспертов являются нарушением тематики и могут быть удалены.
← →
Сергей М. © (2009-08-31 13:49) [2]Зависит от версии Инди
← →
Zalm © (2009-08-31 14:58) [3]Извиняюсь перед админами.
Сергей, версия 10
← →
Медвежонок Пятачок © (2009-08-31 15:00) [4]и что бы узнать его адрес там и тд?
Адрес и тд узнавать не надо. Он уже есть в сессии подключенного клиента
← →
Сергей М. © (2009-08-31 15:14) [5]
> Zalm
У любого наследника TIdCustomTCPServer, каковым является и TIdCmdTCPServer, есть публичное св-во Contexts, представляющее собой потокозащищенный список потоков, в контекстах каждого из которых исполняется каждое из активных соединений с клиентами.
Каждый из элементов этого списка есть объект класса TIdPeerThread, у которого есть объектное св-во Connection, со всеми вытекающими)
← →
Zalm © (2009-08-31 16:16) [6]как раз таки я не заметил что бы из COnnection что-то вытикало, я его видел, но ничего конкретного из него мне получить неудалось
← →
Медвежонок Пятачок © (2009-08-31 16:22) [7]чтобы вытекание было заметным надо после коннекшена поставить точку и подождать подсказки иде
← →
Сергей М. © (2009-08-31 16:25) [8]Да уж, слона-то ты и не приметил)
А справка, надо понимать, тоже молчит ?
← →
Zalm © (2009-08-31 16:39) [9]"Server.Contexts" вот тут ниче нет явно
"Server.Bindings.Items[0].Handle" вот так можно что-то добиться, но тут УЖЕ надо знать индекс подключения, да и адрес не узнать....
а справки у меня нету)
← →
Медвежонок Пятачок © (2009-08-31 16:40) [10]мало точек поставил
← →
Медвежонок Пятачок © (2009-08-31 16:41) [11]да и адрес не узнать....
Интересно, что ты будешь делать, если узнаешь этот адрес.
← →
Сергей М. © (2009-08-31 16:43) [12]
> "Server.Contexts" вот тут ниче нет явно
Что значит "нече нет явно" ?
> Server.Bindings
Это из другой оперы, к клиентским коннектам оно отношения не имеет.
> справки у меня нету
Мыши сгрызли ?)
Коли нету - купи, найди, укради.
Без справки ничего путного не получится - так и будешь тыкаться как слепой котенок)
← →
Anatoly Podgoretsky © (2009-08-31 16:56) [13]> Сергей М. (31.08.2009 16:43:12) [12]
А не умрет ли он скорее со справкой, ведь речь про ИНДИ
← →
Сергей М. © (2009-08-31 16:59) [14]
> Anatoly Podgoretsky © (31.08.09 16:56) [13]
Ну дык еще и исходники всегда перед носом)
Довольно сложно сыграть в ящик, имея справку+исходники ..
← →
Zalm © (2009-08-31 17:04) [15]примеры у меня ткоа на 9-ю версию есть, там иначе всё написано.
← →
Сергей М. © (2009-08-31 17:10) [16]Скачай для 10-ки, в чем проблема ?
Заодно и справку скачай.
← →
Медвежонок Пятачок © (2009-08-31 17:33) [17]и все же загадка. зачем ему понадобился адрес клиента.
← →
Zalm © (2009-08-31 17:46) [18]да адрес клиента не при чем, это я просто сказал что например как узнать.
Главное как клиента идентифицировать что бы потом знать кто есть кто...
← →
Медвежонок Пятачок © (2009-08-31 17:56) [19]коннекшен - это и есть "кто"
← →
Zalm © (2009-08-31 18:27) [20]угу, если бы я писал через TServerSocket я бы не задавал таких тупых вопросов.
Ну вот разве что это что-то дельное AContext.Connection.Socket.Binding.Handle;
и адрес там можно узнать.
Тока пользы никакой для меня, в Server.Contexts я так и не нашел куда можно этот значение приспособить...
Тока в Server.Bindings.BindingByHandle(HND).SendTo(); можно пихнуть... и то не получилось:(
а примеры на 10-Ю версию не могу найти((
← →
Медвежонок Пятачок © (2009-08-31 18:29) [21]Дядя, в метод OnExecute сервера тебе передано нечто.
Нечто это бывает разным в разных версиях инди.
Вот это нечто и есть то что тебе надо. А так же все что вложено в этот тип.
← →
Медвежонок Пятачок © (2009-08-31 18:32) [22]для десятки это будет так:
IdCmdTCPServer1Execute(AContext: TIdContext);
вот этот контекст и есть то, что чего ты весь день ищешь
← →
Zalm © (2009-08-31 19:01) [23]а мне Execute не надо, я там ничего не пишу, всё только в командным обработчиках. А через OnConnect просто хотел записывать данные в массив о подключившихся что бы их как-то различать потом.
только вот как записать в массив что-то конкретное из события OnConnect я так и енп онял... Не подскажете?
← →
Сергей М. © (2009-08-31 20:50) [24]
> мне Execute не надо, я там ничего не пишу
А куда ты денешься с подводной лодки ?
Придется писать.
> как записать в массив что-то конкретное из
Не надо ничего никуда "пихать" - все уже давным-давно "напихано".
В списке Connections.LockList каждый элемент - это TIdPeerThread.
У TIdPeerThread есть объектное св-во Connection: TIdSocketHandle
У объекта TIdSocketHandle есть св-ва PeerIP и PeerPort - адрес и порт клиента. Эта комбинация всегда уникальна, и этого достаточно для однозначной идентификации клиента.
Кр.того, у объекта TIdSocketHandle есть send/recv-методы для коммуникации с клиентом.
← →
Zalm © (2009-08-31 22:55) [25]эх так и знал что вся подстава в этом LockList ((( я его открыл посмотрел и забил, ибо не показалось что как-то с сервером связано.
А зачем обязательно в Execute писать?
Спасибо большое, щас пойду пробовать.
← →
Zalm © (2009-09-01 03:35) [26]Я наверное что-то не понимаю... но у меня нельзя так сделать из любого места. Вот допустим я знаю порт и адрес, как вы сказали,
Потом отсылаю в процедуру, адрес и порт, а когда хочу написать в процедуре Server.Connections то такого нет, есть только Server.Contexts.LockList а в лок-листе нет опять же свойства ни сокетов ни Connections... опять я чего-то не понял? :(
← →
Медвежонок Пятачок © (2009-09-01 07:58) [27]ты сначала вот над этим порассуждай:
присоединился клиент и висит на сервер. затем он отправляет на сервер команду.
серверу в это время приходит в голову разослать всем клиентам сообщение и он это делает.
а клиент в это время команду уже отправил и ждет свой законный ответ именно на нее.
вместо этого он получает кусок байтов, которые он интерпретирует как ответ на команду.
а на самом деле там у тебя там дрова лежат.
ps
для обмена между сервером и клиентом нужно стрго следовать какому-то стандартному протоколу, либо придумать свой протокол и следовать ему.
← →
Сергей М. © (2009-09-01 10:05) [28]
> зачем обязательно в Execute писать?
А ты и в Execute не напишешь.
Execute вызывается только если у сервера список CommandHandlers пуст, а он у тебя заведомо не пуст, ибо нафих тогда нужен TidCmdTCPServer ?
Ты пойми главное - TidCmdTCPServer не предназначен для выкрутасов задуманного тобой вида, он заточен и призван работать в режиме "команда клиента -> ответ сервера как результат выполнения этой команды". На то как раз ComandHandler"ы у него и существуют.
← →
Zalm © (2009-09-01 21:42) [29]А какие у меня выкрутасы?) вобще задача у меня такая, нужен сервер который будет как бы точкой переброса, короче надо что бы он мог создавать "пары" из соединений, и транслировать между ними (между членами в паре) трафик, в данном случае любой текст, который любой член этой пары захочет послать. Например один клиент передает команду на сервер, сервер принимает и смотрит от кого пришло и пересылает это тому кто находится в паре с этим клиентом. Да, такая спицифическая система)
Тогда что вы бы посоветовали какой компонент использовать?
Подскажите пожалуйста как лучше можно было бы сделать.
← →
Сергей М. © (2009-09-01 22:10) [30]
> как лучше можно было бы сделать
Пока не будет внятного разработанного тобой протокола информационного обмена, рассуждения на тему "лучше-хуже" лишены смысла.
← →
Zalm © (2009-09-01 23:13) [31]эх.. а конкретнее?
что сложного сделать сервер котоый будет просто текст перебрасывать?
ему же ничего не надо трогать, получил, передал дальше, и всё.
Как я понял уже через TIdCmdTCPServer это не очень удобно делать.
← →
Сергей М. © (2009-09-02 09:11) [32]
> что сложного сделать сервер котоый будет просто текст перебрасывать?
А нашиша тогда выбрал TIdCmdTCPServer, если требуется "просто текст перебрасывать" ? Почекму не TIdTCPServer ? И чем так уж не угодил тот же самый TServerSocket, тем более что там для тебя "проще всё, ну или понятней" ?
> а конкретнее?
Вот сейчас мы с тобой "разговариваем" при использовании протокола информационного обмена HTTP.
А ты разработал свой протокол ?)
← →
Zalm © (2009-09-02 17:20) [33]Я знаю что такое HTTP и как работает...
Если это можно назвать "разработал", то можно и так, но только не для обмена с сервером "пересылки", а с конечными точками.
TServerSocket мне не нравится так придется все потоки в ручную писать и много вобще придется писать.
А на TIdTCPServer думаю проще будет, он и потоки сам создает же, и всё лучше... так что попробую через него.
Еще вопрос такой мб сторонний немного, к этой теме относится только тем что тоже работа с сетью. Можно Как-то закосить сервер под сервер аси? что бы например конектится не к login.icq.com, а например к моему сервру, и что бы он клиенту контакт лист выдал и мог читать что этот клиент отправит на сервер? и не более. Больше ничего серверу не требуется кроме как выдать конаткт лист с заранее вписанными на сервер контактами, и читать что этим контактам будет слать клиент. То есть есть один сервер и один клиент.. ну думаю вы поняли задачу..)
← →
Сергей М. © (2009-09-02 17:31) [34]
> но только не для обмена с сервером "пересылки", а с конечными
> точками
А "конечные точки" у тебя между собой напрямую не взаимодействуют.
Они же у тебя "разговаривают" через твой сервер-посредник, так что и речь может идти не иначе как о протоколе инф.обмена между клиентами и сервером-посредником.
> TServerSocket мне не нравится так придется все потоки в
> ручную писать
В смысле ?
> Можно Как-то закосить сервер под сервер аси?
Можно.
← →
Медвежонок Пятачок © (2009-09-02 18:35) [35]что сложного сделать сервер котоый будет просто текст перебрасывать?
не сложно. сложно написать клиента который понял бы все перебрасываемое ему.
хотя тоже не сложно (если самому себе не рыть ям)
← →
Zalm © (2009-09-02 18:52) [36]я знаю как всё написать, просто пока не определился точно к компонентом.
Читая протокол я не понял какие команды сначала надо слать с сервера клиенту когда он подключится тока... я подключался с телефона к серверу, он подключается и молчит и чего-то ждет... где можно прочитать коротко какая последовательность компанд друг другу дожна быть что бы они подключились? Подскажете?
← →
Сергей М. © (2009-09-02 22:18) [37]
> Читая протокол
Как можно читать то, что ты еще не написал ?)
> какие команды сначала надо слать с сервера клиенту
А что, клиент нуждается в каких-то командах ?
Нахрена, спрашивается, тогда нужен сервер, если клиенты готовы исполнять его прихоти ?)
> какая последовательность компанд друг другу дожна быть что
> бы они подключились?
Никакая.
Ты же сам утверждаешь, что якобы "подключался с телефона к серверу", при этом ни ты серверу, ни сервер тебе не посылал никаких "команд")
Чудеса ?)
← →
Anatoly Podgoretsky © (2009-09-03 09:10) [38]
> Ну дык еще и исходники всегда перед носом)
Ну ты и садист.
← →
Zalm © (2009-09-06 05:14) [39]ох... вернулся к этой тему.. что-то я никак не пойму:( у меня не получается никак отправить кому-то что-то за пределы его потока.
можете пожалуйста если вам не сложно показать кусок конкретного кода как отправить кому-то что-то не из его потока?
Я был бы очень благодарен
← →
Zalm © (2009-09-06 16:47) [40]отправить через TidTCPServer, забыл уточнить
Страницы: 1 2 3 4 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.01.24;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.005 c