Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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
Если после 3-5 запросов клиент не подконектился

Это ведь прийдется счетчики вести...
Лучше TCP - если не отвечает, значит оффлайн и долой из списка на серваке. А при запуске, соответственно стучать на сервак, чтобы он IP в список добавил.

Начну с винсока, а в финале его можно будет на альтернативный контрол заменить.

Еще бы код не помешал для работы клиентов через прокси... покачто любые. Просто интересна реализация.

Ответить

Номер ответа: 3
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #3 Добавлено: 19.07.07 01:04
"Общение" серера с клиентами будет не частым (раз в 10-15 минут).
     Как быть? Держать ли все соединения открытыми (1) или подключаться только при "общении" (2)?
     Причем сообщение может исходить как от сервера, так и от любого клиента.
   Тут я склонен к варианту (2), но тогда что будет если несколько клиентов обратятся одновременно?
Да, держать соединение не имет смысла. Подключились когда нужно, что-то сделали - отключились.

что будет если несколько клиентов обратятся
Это у тебя, как у разработчика нужно спросить. Ну что будет - занят порт будет, а там уже матюкнёш "Занято, попробуйте позже", автодозвон и всё такое :)

Как определить что клиент в оффлайне?
TCP протокол обеспечивает целостность данных, в отличии от UDP. Т.е. банальнее всего - таймаут конечно будет. Меня правда тот таймаут не сильно устраивал, т.к. долго ждать приходится - я всёравно посылал тестовые запросы, на которые ждал ответы.. если ответа небыло скажем 2 сек - таймаут. Эмулировал таймаут скажем так. Ещё TCP не защищает если просто коннект установить и ждать (Listing)... если одна из сторон упадёт (именно упадёт а не корректно прогу завершат) - листинг остается висеть дальше. Упадёт - имею ввиду прогу TerminateProcess, или шнурок высунуть.. Вообщем вместо тупого Listing я тоже пакеты тестовые кидал постоянно, на которые ловит ответы...

3. Каким способом лучше организовать связь? Т.е. на программном уровне.
   - 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-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #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-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #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-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #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-сайт: www.aliyev.us
 Профиль | | #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-сайт: www.aliyev.us
 Профиль | | #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
А так, если заменить ip на 192.168.0.1 и 192.168.0.2

Ну это понятно. Я же и говорю что странно то - что проги не коннектятся с удаленных ПК.

причем каждый отдельно взятый порт в системе может быть занят или не занят

Обижаешь =)

ВОС ССЫЛКА: http://rashid4ever.narod.ru/vb/Remote_PC_Millenium_2006.rar - Просто разведи его под своё усматрение.

675Кб мне не качнуть. Только через 3 недели, когда дома буду.

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам