Страница: 1 | 2 |
Вопрос: Каким способом лучше реализовать клиент-сервера.
Добавлено: 18.07.07 13:53
Автор вопроса: ZagZag | ICQ: 295002202
Всем привет.
Тут в тему я хочу несколько сходных вопросов задать. Собственно главный вопрос - сабж (побробнее в пункте 3)
1. Делаю некий проект (для себя =) ).
По плану имеется один сервер и несколько клиентов (больше сотни, наверное)
Требуется реализовать связь между сервером и клиентами. Между самими клиентами связи не будет.
Вопрос:
"Общение" серера с клиентами будет не частым (раз в 10-15 минут).
Как быть? Держать ли все соединения открытыми (1) или подключаться только при "общении" (2)?
Причем сообщение может исходить как от сервера, так и от любого клиента.
Тут я склонен к варианту (2), но тогда что будет если несколько клиентов обратятся одновременно?
2. Как определить что клиент в оффлайне?
Наверное прийдется пинговать как это в IRC сделано
3. Каким способом лучше организовать связь? Т.е. на программном уровне.
- 2 winsock'a у сервера и 2 winsock'a у клиента (Лисинг + Исходящие сообщения)
- классы-оболочки над функциями сокетов, нарытые в сети
- контрол-замена винсока (а-ля DaSharm)
- или искать еще варианты?
Мои замечания:
- винсок удобнее и, в принципе, подходит, хотя его некоторые недолюбливают.
- классы-оболочки, мной мало изучены, там и сабклассинг используется и т.п. что может привести к затруднению отладки моего проекта.
- контрол реализован на тех же классах-оболочках (см. выше), что также может привести к появлению новых глюков и т.п.
Ответы
Всего ответов: 22
Номер ответа: 1
Автор ответа:
Sneaks
Вопросов: 9
Ответов: 84
Профиль | | #1
Добавлено: 18.07.07 18:59
Начну с беспорядка
лично меня винсокс тоже устраивает в полне. На счет поддержки связи я думаю в твоем случае не стоит. Пусть сервер рассылает запрос на подключение через UDP, а клиент пусть уже сам конектится через TCP. Если после 3-5 запросов клиент не подконектился, значит оффлайн.
Номер ответа: 2
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #2
Добавлено: 18.07.07 19:40
Это ведь прийдется счетчики вести...
Лучше TCP - если не отвечает, значит оффлайн и долой из списка на серваке. А при запуске, соответственно стучать на сервак, чтобы он IP в список добавил.
Начну с винсока, а в финале его можно будет на альтернативный контрол заменить.
Еще бы код не помешал для работы клиентов через прокси... покачто любые. Просто интересна реализация.
Номер ответа: 3
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #3
Добавлено: 19.07.07 01:04
Как быть? Держать ли все соединения открытыми (1) или подключаться только при "общении" (2)?
Причем сообщение может исходить как от сервера, так и от любого клиента.
Тут я склонен к варианту (2), но тогда что будет если несколько клиентов обратятся одновременно?
- 2 winsock'a у сервера и 2 winsock'a у клиента (Лисинг + Исходящие сообщения)
- классы-оболочки над функциями сокетов, нарытые в сети
- контрол-замена винсока (а-ля DaSharm)
- или искать еще варианты?
Сложно сказать однозначно. Тут вкус и цвет играет большую роль. Мне нравится контрол DaSharm'a, т.к. он маленький, приближенней всего в стандартному винсоку. Ещё в инете видел довольно мощный класс для работы с сетью, там всё что угодно - куча протоколов, куча фишек вроде тестовых пакетов ну короче всё что надо и ненадо в одной кучи - х.з. мож оно и мощно выглядит - в своё время у меня небыло желания тонну чужого кода разгрибать. Предпочёл то что маленькое.
- винсок удобнее и, в принципе, подходит, хотя его некоторые недолюбливают.
- классы-оболочки, мной мало изучены, там и сабклассинг используется и т.п. что может привести к
Как раз контрол DaSharm'a очень похож на винсок. Ничего учить сверхнового непридётся
Да и никакого сабклассинга там нету
А у тебя всё в программе должно быть реализовано классами (оболочами) Не зря ведь оно Объектно Ориентированое Программирование называется? Если всё слепить в одно целое - контоль над своим проектом потеряешь намного раньше...
А вообще мне ужасно ненравится писать "клиент-сервер" на вб6. Ацтой в том что практически всегда при таких проектах нужны потоки, а вб6 с ними ну как [матюк]. На С++ пробовал - ничё так :\ Но могло быть и лучше. Например в делфи достаточно удобно классом TSockets, только весить будет побольше Ну на дотнете попробовать можно, на том же бейсике, если не смущает.. там вообщем хоть потоки работают нормально.
Номер ответа: 4
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #4
Добавлено: 19.07.07 11:22
А вот и есть! А вот и есть!
Я его ща перебираю практически заново.
Так вот: там WSAAsyncSelect вешает события MouseUp на чекбоксы. Способ дурацкий, но оригинальный. Я обошелся без чекбоксов.
Ну согласен что это не совсем сабклассинг, но все же...
Номер ответа: 5
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #5
Добавлено: 19.07.07 15:21
1. подходит вариант (2), только ИМХО надо тебе на листе бумаги написать простой протокол, по которому клиент с сервером обменяюся сообщениями, чтобы был принцип, по которому по какой-то комнде клиента/сервера один из них завершал бы соединение.
2. Уже написали без меня.
3. выбор за тобой, но т.к. тебе нужна поддержка прокси, хочу посоветовать тебе пример, который где-то завалялся у меня - там несколько типов прокси-авторизации поддерживается. из примеров с винсоками, контрол DaSharm'а вполне так ничего. Про потоки HACKER верно пометил, так что туго тебе будет без них, но всё же можно. Но самое главное: никто не подметил правильно насчет ситуации одновременного подключения клиентов. Тут я отправлю тебя в поиск по примерам vbnet - ищи два примера многоканального winsock-сервера, который умеет принимать одновременно несколько подключений и ничего при этом не теряет. Там 1 сокет всё время слушает запросы на подключение, а принимает подключения на вновь создаваемые для клиентов сокеты (неиспользуемые отключенные сокеты надо убивать, дабы не занимать ресурсы).
Номер ответа: 6
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #6
Добавлено: 20.07.07 21:27
Про массив винсоков:
А нужна ли эта многопользовательность автору? Если да - ок.. если нет - просто сказать мол подождите...
Номер ответа: 7
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #7
Добавлено: 20.07.07 21:38
Это зависит не от того, нужна ли она, а от прямоты рук программера ИМХО..
Номер ответа: 8
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #8
Добавлено: 20.07.07 22:38
HACKER, ненужна многопоточность. Клиенты вего-лишь сообщают серверу 3-50 байт и тут же отсоединяются. Так же реализована и обратная связь.
Я в принципе с сетью уже разобрался. Спасибо всем за помощь.
Только вот когда тестил контролы - заметил странную штуку:
Для теста написал простенький чат. В чате компонент-сервер слушает порт 12300 и записыватет в конец текстбокса все что на этот порт приходит, а отправка введенной строки осуществляется при помощи компонента-клиента. (соединение с удаленным ПК происходит на порт 12300 после ввода IP и нажатия кнопки Коннект)
Так вот. 2 приложения-чата не коннектятся между собой (на локальном ПК - нельзя 2 одинаковых порта на прослушку открыть, а на удаленных ПК - хз почему). Но если заместо одного чата использовать телнет, то связь происходит двусторонняя и вообще получается все как надо.
Почему так происходит - я понять не могу. Может потому-что нельзя с разных контролов открывать один и тот же порт и одновременно ставить его на прослушку? А может чат ошибку содержит, я его за 10-15 мин. написал
ЗЫ
Надеюсь я понятно все описал
Номер ответа: 9
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #9
Добавлено: 20.07.07 23:31
дык.. разумеестя. Нельзя прослушивать порт двумя разными сокетами. Неважно в разных контролах они или в приложениях. Посмотри внимательно как организовываются чаты, там или UDP c бродкастингом или массив винсоков который по TCP работают.
Номер ответа: 10
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #10
Добавлено: 21.07.07 00:07
Это как? То есть 2 проги на РАЗНЫХ компах не могут на прослушку открыть один и тот же порт и коннектиться друг к другу на этот самый порт. Странно. Не вижу этому никакого объяснения.
Вот схема, того что я хочу сделать (для теста):
1 комп (127.0.0.1) 2 комп (127.0.0.2)
listeninng 12300 <----------\ --> listeninng 12300
X
connect 127.0.0.2:12300 ----/ \-- connect 127.0.0.1:12300
Надеюсь ее не искорёжит
Номер ответа: 11
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #11
Добавлено: 21.07.07 10:42
ZagZag,
Твоя схема будет работать только в том слкчае, если ты поставишь нормальные ip-адреса, на не 127.0.0.1 (зеркало) А так, если заменить ip на 192.168.0.1 и 192.168.0.2 должна по идее прокатить, вот только тестировать двух клиентов на одной машине ты не сможешь, потому что:
Порты на локальной машне могут принимать значения в диапазоне 1..65535, причем каждый отдельно взятый порт в системе может быть занят или не занят, т.е. второй твой клиент на тестовой машине обламывается с портом
Номер ответа: 12
Автор ответа:
Millenium
ICQ: 629966
Вопросов: 118
Ответов: 903
Web-сайт:
Профиль | | #12
Добавлено: 21.07.07 11:07
Не парись! Вот тебе рабочий пример!
Сервер подключается к скольким клиентам хочеш!!! И обратное!
ВОС ССЫЛКА: http://rashid4ever.narod.ru/vb/Remote_PC_Millenium_2006.rar - Просто разведи его под своё усматрение.
Номер ответа: 13
Автор ответа:
Крест
Вопросов: 4
Ответов: 37
Профиль | | #13
Добавлено: 21.07.07 12:39
Nod32 пожалувлса че ето возможно вірус NEW_HEUR.И хотел его удалить...
Номер ответа: 14
Автор ответа:
Millenium
ICQ: 629966
Вопросов: 118
Ответов: 903
Web-сайт:
Профиль | | #14
Добавлено: 21.07.07 13:46
Да там исходники! Распакуй и всё увидеш! И не надо жаловатся! Это-же у меня удалённое управление компютером (прога).
У меня не на малое количество моих програм не тольео НОД, Панда, Даже Саймантек иногда жаловался! В честь меня Доктор Веб даже троян зарегестрировала. Это была моя программа по определению паролей на удалённых машинах. Вирус называется PWD.TRJ.Rashid.e (Trojan) а прога Millenium Password Cracker.
Номер ответа: 15
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #15
Добавлено: 21.07.07 16:10
Ну это понятно. Я же и говорю что странно то - что проги не коннектятся с удаленных ПК.
Обижаешь
675Кб мне не качнуть. Только через 3 недели, когда дома буду.