Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1258207054
Спаситель человечества
2009-11-14 16:57
2010.01.24
Предлагаю средство для борьбы с вирусами (универсальное)


8-1202567132
multiflex
2008-02-09 17:25
2010.01.24
"Низкоуровневое" воспроизведение


2-1259304661
nevermind
2009-11-27 09:51
2010.01.24
Запуск приложения несколько раз


11-1160629902
Grademax
2006-10-12 09:11
2010.01.24
Как програмно остановить USB-Flash?


2-1259714074
Восьмой
2009-12-02 03:34
2010.01.24
Латышский язык





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский