|
|
|
Ликбез про сокеты, stThreadBlocking, stNonBlocking
|
|||
|---|---|---|---|
|
#18+
Добрый день! Направьте на путь истинный в сетевом программировании. Моя задача: клиент коннектится к серверу, вводит логин и пароль, происходит авторизация, далее сервер должен закачать TFileStream на клиент. Который к примеру весит 1Мб. Для каждой сессии файл свой. И потом клиент раз в 2 секунды спрашивает сервер "есть ли новая информация", и если "новая информация" (маленькая текстовая строка) есть - отдает её клиенту. И так до тех пор пока пользователь клиента не закроет свою программу-клиент. Прочитал очень много статей про сокеты в Delphi. Но в контексте моей задачи вся полученная инфа в голове уложиться не может)) И я нигде не нашел примера, который бы реализовывал что то типа сессий: авторизация, открытие сессии, и дальнейшая работа по обмену данными различных типов (строка, файл) в рамках этой сессии. Итак что мне конкретно не понятно: 1. Какой режим больше подходит под мою задачу? stNonBlocking или stThreadBlocking ? К примеру один клиент подцепился, и начал скачивать тот самый файл 1МБ. И в этот момент подцепляется еще 100 клиентов и тоже проходят авторизацию и и тоже начинают скачивать тот самый файл? Правильно ли я понимаю что и в stNonBlocking и в stThreadBlocking эти процессы и авторизации и скачивания файла будут происходить в принципе параллельно? Просто в stThreadBlocking это будут 10 параллельных потоков TThread, а stNonBlocking это будет один главный поток, и в этом главном потоке фигачит один цикл, цикл организуется операционной системой, цикл обращается к каждому сокету и опрашивает его состояние в текущий момент? И когда состояние сокета меняется, главный поток возбуждает соостветствующее событие с указанием типа события и сокета, в котором оно произошло. А я, как разработчик, должен обработать эти события. 2. Получается что у меня нечто вроде "сессии". Получается в поле data каждого сокета я записываю информацию о сессии: логин, время коннекта, статус авторизации и т.д. Сессия открывается если успешно прошла авторизация. К примеру я выбрал режим stThreadBlocking. К примеру у меня подключилось 200 клиентов. Правильно ли я понял что количество обслуживающих потоков никак не связано с количеством подключенных клиентов? Т.е. эти 200 клиентов могут обслуживаться 10-ю потоками. Просто эти потоки будут работать в блокирующем режиме. Но тогда возможна ситуация, когда все 10 потоков заняты (например - отправляют тот самый файл 1Мб), и в этот момент еще пара десятков клиентов хотят коннекта с сервером? Тогда сервер их отшивает? 3. Как в принципе реализовывать такие задачи типа "авторизация"? Клиент посылает строку что то типа "TASK:AUTH(LOGIN:"mylogin",PASSWORD:"mypassword")" На стороне сервера в событии OnRead я строку принимаю, парсю, проверяю правильность, и если все ок - то в поле data записываю record = TSessionState (login:"mylogin", auth: true, countWrong: 0). Типа того? А если пароль неправилен - то сокет не закрывать и ждать повторной попытки? (И можно посчитать количество неправильных попыток, записать в countWrong, при превышении countWrong "n" сокет закрыть, а IP на полчаса в блэклист:)) 4. Как сокет поймет что сейчас приходит не текст, а файл? Т.е. по факту это же все поток данных. И текст, и файл, и прочая информация приходят в одном потоке данных. Получается что нужны какие то маркеры, по которым определять какой тип данных сейчас идет? Или посылать какие то команды: "Клиент, сейчас я буду закачивать тебе файл. Ты готов?", клиент: "Да, летс гоу". пошел поток, который оканчивается какой то хитрой последовательностью #13#10#14#16#17 И клиент понимает что это конец файла?)) Или как?)) вообще каша вообщем)) К примеру - в режиме stThreadBlocking в процедуре Execute потока как это реализовать? Сюда я пришел после прочтения многого количества статей и просмотра примеров. Но все равно каша в голове) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2019, 13:33 |
|
||
|
Ликбез про сокеты, stThreadBlocking, stNonBlocking
|
|||
|---|---|---|---|
|
#18+
Каша в голове потому что ты пытался изучать слишком высокие уровни. Забудь о дельфийских компонентах, они только затуманивают картину. Читай о простых BSD Socket. И таки да, в литературе ничего нет о сессиях и авторизации, потому что ничего этого на уровне сокетов не существует. Тебе приходит просто поток байт (причём на обеих концах сокета). Как эти байты интерпретировать - ты решаешь сам. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2019, 13:46 |
|
||
|
Ликбез про сокеты, stThreadBlocking, stNonBlocking
|
|||
|---|---|---|---|
|
#18+
Datasnap из коробки и аутентификацию предлагает и TStream умеет передавать. Ставите сервису жизненный цикл invokation и не паритесь на счет параллельности ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2019, 13:49 |
|
||
|
Ликбез про сокеты, stThreadBlocking, stNonBlocking
|
|||
|---|---|---|---|
|
#18+
X-CiteDatasnap из коробки и аутентификацию предлагает и TStream умеет передавать. Ставите сервису жизненный цикл invokation и не паритесь на счет параллельности Спасибо, пошел датаснап читать) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2019, 13:54 |
|
||
|
Ликбез про сокеты, stThreadBlocking, stNonBlocking
|
|||
|---|---|---|---|
|
#18+
Прочитал. DataSnap это про СУБД, данные, трехзвенную архитектуру... Не про мою задачу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2019, 14:16 |
|
||
|
Ликбез про сокеты, stThreadBlocking, stNonBlocking
|
|||
|---|---|---|---|
|
#18+
BasketbolПрочитал. DataSnap это про СУБД, данные, трехзвенную архитектуру... Не про мою задачу. Ничего подобного. Что то не то вы читаете. Обычная клиент-серверная архитектура. На сервере создаете сервис с методами и на клиенте генерируете готовый модуль с классами и такой же сигнатурой. За вас фреймворк все сделает и передаст данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2019, 14:34 |
|
||
|
Ликбез про сокеты, stThreadBlocking, stNonBlocking
|
|||
|---|---|---|---|
|
#18+
X-CiteЧто то не то вы читаете. Он читает про использование, а не концепцию. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2019, 14:41 |
|
||
|
Ликбез про сокеты, stThreadBlocking, stNonBlocking
|
|||
|---|---|---|---|
|
#18+
X-CiteBasketbolПрочитал. DataSnap это про СУБД, данные, трехзвенную архитектуру... Не про мою задачу. Ничего подобного. Что то не то вы читаете. Обычная клиент-серверная архитектура. На сервере создаете сервис с методами и на клиенте генерируете готовый модуль с классами и такой же сигнатурой. За вас фреймворк все сделает и передаст данные. В смысле - не обязательно делать источники данных? Т.е. это будет архитектура, в которой будет отсутствовать СУБД? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2019, 14:51 |
|
||
|
Ликбез про сокеты, stThreadBlocking, stNonBlocking
|
|||
|---|---|---|---|
|
#18+
Имхо, освоить предметную область это хорошо, но не стоит изобретать велосипед. Есть REST, JSON/XML API, всяческие ProtoBuffer, ZeroMQ и прочее. По сабжу - сервера, рассчитанные на более сотни клиентов, на тредах не делаются. Либо non blocking, либо event-driven (ICS, например). Второе требует перестройки сознания, зато легко держит тысячи коннектов в одном треде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2019, 15:00 |
|
||
|
Ликбез про сокеты, stThreadBlocking, stNonBlocking
|
|||
|---|---|---|---|
|
#18+
Василий 2сервера, рассчитанные на более сотни клиентов, на тредах не делаются Зато делаются клиенты. Ибо это проще. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2019, 15:05 |
|
||
|
Ликбез про сокеты, stThreadBlocking, stNonBlocking
|
|||
|---|---|---|---|
|
#18+
Да. Не ту статью прочитал. Вот эту прочитал http://www.interface.ru/home.asp?artId=26210 Прояснилось про dataSnap. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2019, 15:08 |
|
||
|
Ликбез про сокеты, stThreadBlocking, stNonBlocking
|
|||
|---|---|---|---|
|
#18+
Basketbol, обычный http-сервер делает тоже самое HEAD и GET а авторизацию подцепить любой админ может ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2019, 15:55 |
|
||
|
Ликбез про сокеты, stThreadBlocking, stNonBlocking
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovВасилий 2сервера, рассчитанные на более сотни клиентов, на тредах не делаются Зато делаются клиенты. Ибо это проще. Так ТС-у и то и другое надо сделать, а клиент без сервера не имеет смысла )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2019, 17:33 |
|
||
|
Ликбез про сокеты, stThreadBlocking, stNonBlocking
|
|||
|---|---|---|---|
|
#18+
Вообщем, решил все таки начать с сокетов)) Для потенциальной задачи одновременной работы с парой сотен клиентов предпочтителен режим stNonBlocking. Если я правильно понял - при подключении 200 клиентов создается 200 сокетов, и где то внутри главного потока крутится бесконечный цикл, который пробегается по этим сокетам, опрашивает их состояние и генерирует соответствующие события: onClientConnect, onClientRead, onClientDisconnect Начинаю с авторизации. Клиент вводит логин и пароль, посылает его в Код: pascal 1. На стороне сервера парсю, проверяю правильность. Если все ок - посылаю Код: pascal 1. Здесь возникают сразу вопросы безопасности: 1. По сценарию, после проверки пароля открывается основное окно программы, и начинает скачиваться файл. КулХацкеры могут изменить биты в exe-шнике т.о. чтобы любой пароль кроме правильного подходил. Как от этого защититься? 2. Считается что посылать пароль в открытом виде нельзя. Получается, нужно генерировать случайную salt , формировать строку md5("login+password+salt") и посылать хеш и отдельно соль. Так что ли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2019, 19:42 |
|
||
|
Ликбез про сокеты, stThreadBlocking, stNonBlocking
|
|||
|---|---|---|---|
|
#18+
Получается, нужно сформированный успешный хеш считать "ключом сессии" и клиент должен этот ключ посылать при каждом новом запросе. Сервер при формировании ответа постоянно должен проверять соответствие ключа сессии... Т.е. клиент присылает запрос: Код: pascal 1. Сервер в событии onRead Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Как то так что ли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2019, 20:00 |
|
||
|
Ликбез про сокеты, stThreadBlocking, stNonBlocking
|
|||
|---|---|---|---|
|
#18+
Начал знакомиться с библиотекой RTC. Пока не знаю чем RTC лучше, чем старые дедовские TServerSocket и TClientSocket. Вот и узнаю) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2019, 10:08 |
|
||
|
Ликбез про сокеты, stThreadBlocking, stNonBlocking
|
|||
|---|---|---|---|
|
#18+
Вот скоро ты дойдешь до того, что не только пароль, но и данные в открытом виде пересылать нельзя, а значит - добро пожаловать в дремучий лес TLS! Есть ли какая-то причина, чтобы не использовать библиотеки? ICS, например, содержит большинство известных методов авторизации, TLS, готовые серверы и клиенты и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2019, 12:48 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39841955&tid=2039183]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
153ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
| others: | 207ms |
| total: | 458ms |

| 0 / 0 |
