Чат

Делись идеей, получай поддержку и критику!
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Чат

Сообщение Eugen Graf »

Клиент-король, спросил-получил ответ, в этом и задумка.
Аватара пользователя
FireFly

Activity Black
expert
expert
Сообщения: 1321
Зарегистрирован: 25 апр 2009, 08:58
Награды: 2
Версия LabVIEW: 2014
Откуда: Санкт-Петербург
Поблагодарили: 1 раз

Re: Чат

Сообщение FireFly »

Уфф... Вроде основу сделал. Точнее переделал твой проект в удобный для меня вид и убрал чат. Пока конечно сыровато, нужно многое добавить - обработчик ошибок, закрытие сервера, комменты добавить, прикрутить базу данных пользователей - тогда уже будет более-менее нормальный клиент-сервер который можно будет использовать в разных проектах.
Но главное - я разобрался почти полностью в твоём проекте :)
Клиент использует Tray Icon ActiveX Server из LabVIEWTrayIcon.zip

P.S. Почему на форуме запрещен формат 7z?
Вложения
Storage.zip
(1.05 МБ) 279 скачиваний
Иногда лучше молчать и слыть идиотом, чем заговорить и развеять все сомнения.
Аватара пользователя
FireFly

Activity Black
expert
expert
Сообщения: 1321
Зарегистрирован: 25 апр 2009, 08:58
Награды: 2
Версия LabVIEW: 2014
Откуда: Санкт-Петербург
Поблагодарили: 1 раз

Re: Чат

Сообщение FireFly »

Смущает меня одна вещь сейчас...
Вот каждый "клиент на сервере" живет своей однажды начатой жизнью и не знает о своём нынешнем состоянии.
Класс "сервер" хранит массив всех клиентов, обновляет каждый из них новой информацией если надо. Но "клиент на сервере" ничего об этих изменениях не знает. И алгоритмы его поведения могут основываться только на стартовой информации.
Даже о том что сервер решил выйти "клиенты на сервере" узнают необычным способом:
1) Один из клиентов получает команду на выход, пересылает её серверу и благополучно завершается послав на прощание своему клиентскому компу что тот отключен (connected+false) хотя коннект остаётся.
2) Сервер смотрит кто ему прислал эту команду и если это не админ, то просто игнорирует её. Если админ - рассылает всем клиентским компам exit (включая "отключеного" выше админа) и рвёт все соединения. Каждый клиентский комп словив команду exit завершает нижний цикл, и остаётся просто интерфейс. Переподключиться теперь можно только перезапустив VI. Сервер VI завершает все циклы и закрывается.
3) Клиенты на сервере не знают что сервер их отключил и сам остановился. Они ловят ошибку что TCP коннект почему-то оборвался. Доблестно сообщают это серверу (добавляют это в очередь сервера, которая, кстати, им уже убита). Затем ещё пытаются сообщить клиентскому компу что то дескать отключён (connected+false) хотя коннекта уже нет, но от этого их спасает ошибка от неудачной попытки добавить в убитую очередь.

Собственно к чему я всё это.
1) Как думаешь нужно ли что-то менять в такой структуре программы? Нужно ли добавлять обратную связь от сервера к клиентам на нём? Можно конечно для каждого нового клиента создавать очередь... Но это изврат какой-то...
2) Нужно ли вообще "клиенту на сервере" знать в каком он сейчас на сервере состоянии. Залогинен ли или нет и т.д. Ведь если бы он больше о себе знал (неначальных данных, а полученных за время работы), то мог бы не тупо пересылать команды серверу, а сам делать например первичный отсев (например не принимать ряд команд от незалогиненых пользователей, не принимать exit от неадмина) посылать какие-то ответы автоматически. Тогда на цикл сервера меньше нагрузка, быстрее отклик клиентам. Как это организовать кроме очередей каждому "клиенту на сервере"?
3) Зачем в клиентах на сервере в конце есть отправка клиентскому компу "отключён" (connected+false). Ведь цикл завершается всего в двух случаях - оборван коннект (не таймаут ошибка TCP Read, или 30 сек молчания от клиента, даже в ответы на пинг), тогда клиент всё-равно не получит этого сообщения. Или клиент прислал exit, но тогда ос совсем скоро получит exit от сервера.
Иногда лучше молчать и слыть идиотом, чем заговорить и развеять все сомнения.
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Чат

Сообщение Eugen Graf »

Я смотрю ты включился в тему и разобрался с моими мыслями, которые я осуществил в этом проекте. Плюс тебе за это лично от меня :super:
Ну а по вопросам, нужно их хорошенько обжевать, будет время разберёмся, а пока его у меня к сожалению нет :dntknw:
Аватара пользователя
FireFly

Activity Black
expert
expert
Сообщения: 1321
Зарегистрирован: 25 апр 2009, 08:58
Награды: 2
Версия LabVIEW: 2014
Откуда: Санкт-Петербург
Поблагодарили: 1 раз

Re: Чат

Сообщение FireFly »

Ну у меня уже почти готова пробная версия проги которая работает полностью на твоём принципе. Но вот захотел взвалить на "клиента на сервере" пару функций:
1) Для некоторый команд от клиента, прежде чем пересылать их серверу убедится что клиент залогинен
2) Сделать красивое отключение клиентов сервером
Но в текущей структуре как оказалось это невозможно... Все проверки на "залогиненость" пока пришлось отдать серверу.
Иногда лучше молчать и слыть идиотом, чем заговорить и развеять все сомнения.
Аватара пользователя
Михаил23
adviser
adviser
Сообщения: 219
Зарегистрирован: 24 ноя 2008, 17:58
Версия LabVIEW: 2009
Откуда: Москва

Re: Чат

Сообщение Михаил23 »

Стал разбираться с клиент серверной архитектурой. И сразу возник вопрос.
Если мне надо сделать сервер как службу винды. Надо выбирать какую то особую структуру для него или это потом в инсталляторе задается?
Аватара пользователя
Михаил23
adviser
adviser
Сообщения: 219
Зарегистрирован: 24 ноя 2008, 17:58
Версия LabVIEW: 2009
Откуда: Москва

Re: Чат

Сообщение Михаил23 »

Вот еще проблемы возникли. Попытался добавить в клиент и сервер новое действие. Нажатие кнопки. и отображение ее на индикаторе. Т.е в клиенте пользователь нажимает кнопу и у всех клиентов загорается лампочка. Но почему то на сервере не возникает такого события(Value). Подскажите что не так?
Вложения
Chat my.rar
(725.17 КБ) 253 скачивания
Аватара пользователя
Михаил23
adviser
adviser
Сообщения: 219
Зарегистрирован: 24 ноя 2008, 17:58
Версия LabVIEW: 2009
Откуда: Москва

Re: Чат

Сообщение Михаил23 »

Неужели никто не разбирался с приложением Чат? Подскажите кто знает! :help:
Аватара пользователя
FireFly

Activity Black
expert
expert
Сообщения: 1321
Зарегистрирован: 25 апр 2009, 08:58
Награды: 2
Версия LabVIEW: 2014
Откуда: Санкт-Петербург
Поблагодарили: 1 раз

Re: Чат

Сообщение FireFly »

Михаил23, извини, сейчас жутко занят.
Иногда лучше молчать и слыть идиотом, чем заговорить и развеять все сомнения.
Аватара пользователя
Михаил23
adviser
adviser
Сообщения: 219
Зарегистрирован: 24 ноя 2008, 17:58
Версия LabVIEW: 2009
Откуда: Москва

Re: Чат

Сообщение Михаил23 »

Выше озвученные вопросы все еще актуальны. И я надеюсь на вашу помощь :help: .
Аватара пользователя
Михаил23
adviser
adviser
Сообщения: 219
Зарегистрирован: 24 ноя 2008, 17:58
Версия LabVIEW: 2009
Откуда: Москва

Re: Чат

Сообщение Михаил23 »

Не очень понятен механизм взаимодействия с базой данных в приложении Чат(его там нету но куда надо прикручивать не понятно). Т.е. предположим на клиенте произошло событие по которому надо считать данные из базы. Соответственно на клиенте сервера тоже генерируется событие. Но ку вот потом не очень понятно куда его пихать то ли генерировать событие на сервере и в нем уже считывать данные из базы то ли создавать отдельный поток для обработки событий базы данных и потом уже передавать данные в поток событий сервера????? :help:
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Чат

Сообщение Eugen Graf »

Работы с БД в этом проекте нет, она только предполагалась для регистрации клиентов (никнейм, пароль и т.д.). Отдельный поток я бы для этого не создавал.
Ответить

Вернуться в «Проекты»