Вниз
Скачать: CL | DM;

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 вся ветка

Скачать: CL | DM;



Память: 0.55 MB
Время: 0.008 c
2-1259631171
des
2009-12-01 04:32
2010.01.24
Как отследить и заблокировать?


2-1259911372
kate158
2009-12-04 10:22
2010.01.24
отображение в поле monthcalendar только месяца и года


2-1260087982
Washington
2009-12-06 11:26
2010.01.24
AlphaControls, кастомизация скинов


15-1258750559
XXL
2009-11-20 23:55
2010.01.24
Про второй смысл в развлекательных медиа


2-1260028195
dplz
2009-12-05 18:49
2010.01.24
Фон в listbox




   Наверх