|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу. Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста". Название темы слишком короткое или не отражает сути вашего вопроса. Тема исчерпала себя, помните, один вопрос - одна тема Прочитайте правила и заново правильно создайте тему. |
|
Опции темы | Поиск в этой теме |
15.01.2012, 21:33 | #21 |
Регистрация: 15.01.2012
Сообщений: 5
|
|
26.01.2012, 11:13 | #22 |
Регистрация: 15.01.2012
Сообщений: 5
|
Подведу итоги работы с компонентой idCmdTCPServer и idTCPClient из INDY 10.5.8.0
Проблемы и решения. 1. Проблемы с кодировкой, полученные сообщения приходят ввиде ????? (кракозябры, вопросы, не русские буквы) События указаны для наглядного примера. На старте пишем (не обязательно): Код:
Код:
Код:
В простом сервере это выглядит так, кодировку мы ранее указали: Код:
Код:
TIdCmdTCPServer не зря назвали "Cmd", у него есть полезное свойство CommandHandlers (доступно через инспектор объектов), вот им и воспользуемся. В редакторе создадим команду "say", в свойствах NormalReply присвоим код 201, чтобы сервер смог различать где имя команды, а где параметры (в нашем случае параметр это текст сообщения отправляемый клиентом) существуют свойства CmdDelimiter и ParamDelimiter, присвоим что ни будь по интереснее, например символ "¡" (перевернутый восклицательный знак ), незабыв удостоверится что ParseParams присвоено True. Для команд доступно только одно событие, а именно OnCommand. Допустим сервер уже успешно запущен. Код:
С сервером разобрались он знает команду с кодом 201 и записывает поступившие с ней параметры в Memo, теперь клиент должен уметь отправить этот запрос, допустим он у нас уже успешно подключён, а текст сообщения мы отправляем из Идита: Код:
В INDY 9 была распространена практика, когда сервер сам инициировал передачу сообщений, т.е. "брал" список подключенных к нему клиентов и всем подрят рассылал, это несколько не правильно по отношению к структуре Клинет-Сервер, в которой клиент должен сам спрашивать, а сервер только отвечать. Для этого потребуется создать еще один обработчик команды на сервере, назавем его "all" и присвоем ему код 202, а в обработчике события напишем: Код:
Для этого воспользуемся компонентом Timer c интервалом 500мс, т.е. событие OnTimer будет выполняться каждые пол секунды (не беспокоимся, это совсем не много и вашь компьютер не зависнет ) Код:
Последний раз редактировалось MAMOHT128; 26.01.2012 в 12:50. |
26.01.2012, 12:13 | #23 |
Регистрация: 15.01.2012
Сообщений: 5
|
5. Как отправть сообщение клиента всем клиентам сервера?
Сообщения клиентов храним в стринглисте, в interface var добавляем: Код:
Код:
Когда сервер получает сообщение, записываем его не только в Memo, но и сразу в стринглист сообщений: Код:
Код:
Чтобы этого избежать на сервере требуется вести историю входящих сообщений, а лучше каждому сообщению присвоить индивидуальный номер (ID), например с каждым входящим сообщением просто увеличивать на 1, а на клиенте хранить ID последнего сообщения. Допустим сервер получил 50 сообщений (ID=50), клиент получил 48 (т.е. между запросами поступило еще 2), клиент спрашивает: у тебя какой последний идентификатор сообщения? сервер: 50 клинет: 50>48 - высылай сервер: отправил (данные...) клиент: последний ID? сервер: 50 клиент: 50=50 - ненужно и т.д. 6. Как отправить сообщения с сервера клиентам? Точно также как и в предыдущем случае, просто добавляем сообщение в стринглист и при следующей синхронизации клиенты его получат: Код:
Создаем некую упорядоченную структуру на сервере. Клиентов будем хранить в массиве записей, в interface пишем и var добавляем: Код:
В общем случае: Код:
Код:
Выключая сервер освобождаем ресурсы Код:
Последний раз редактировалось MAMOHT128; 26.01.2012 в 12:50. |
15.02.2012, 23:37 | #24 |
Регистрация: 15.01.2012
Сообщений: 5
|
Приложил исходник рабочего клиента/сервера
в одном приложении на идеальность кода не претендую т.к. данный проект создавался без определенной цели и лишь для проверки работы компонентов, со множеством передлок в процессе написания |
27.02.2012, 08:56 | #25 |
Регистрация: 19.01.2012
Сообщений: 5
|
На Delphi 2010 не канает, сервер видит всех клиентов, а клиенты друг друга не могут, обидно, разбираться в коде. А так пример хороший, спасибо.
Может у кого нибудь есть свои примеры? Народ, пожалуйста скиньте примерчики) Будем благодарны. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
TForm & TImage & PNG & Прозрачность | delphi_beginner | Общие вопросы Delphi | 7 | 19.09.2009 08:46 |
Просто не понимаю б чём проблема!!!!!!!(char* && index) | artush1984 | Общие вопросы C/C++ | 12 | 30.05.2009 03:30 |
TJVRichEdit & Delphi 2009 | fanatica | Компоненты Delphi | 1 | 20.04.2009 13:28 |
Проблема с MVC++ 2005 && 2008 на висте | NetGod | Софт | 1 | 09.08.2008 17:14 |
Delphi & Access & Ole | vodila | БД в Delphi | 0 | 15.07.2008 11:11 |