Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ликбез про сокеты, stThreadBlocking, stNonBlocking / 17 сообщений из 17, страница 1 из 1
26.07.2019, 13:33
    #39841880
Basketbol
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ликбез про сокеты, stThreadBlocking, stNonBlocking
Добрый день!
Направьте на путь истинный в сетевом программировании.
Моя задача: клиент коннектится к серверу, вводит логин и пароль,
происходит авторизация, далее сервер должен закачать 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 потока как это реализовать?

Сюда я пришел после прочтения многого количества статей и просмотра примеров. Но все равно каша в голове)
...
Рейтинг: 0 / 0
26.07.2019, 13:46
    #39841886
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ликбез про сокеты, stThreadBlocking, stNonBlocking
Каша в голове потому что ты пытался изучать слишком высокие уровни. Забудь о дельфийских
компонентах, они только затуманивают картину. Читай о простых BSD Socket.

И таки да, в литературе ничего нет о сессиях и авторизации, потому что ничего этого на
уровне сокетов не существует. Тебе приходит просто поток байт (причём на обеих концах
сокета). Как эти байты интерпретировать - ты решаешь сам.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
26.07.2019, 13:49
    #39841889
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ликбез про сокеты, stThreadBlocking, stNonBlocking
Datasnap из коробки и аутентификацию предлагает и TStream умеет передавать. Ставите сервису жизненный цикл invokation и не паритесь на счет параллельности
...
Рейтинг: 0 / 0
26.07.2019, 13:54
    #39841893
Basketbol
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ликбез про сокеты, stThreadBlocking, stNonBlocking
X-CiteDatasnap из коробки и аутентификацию предлагает и TStream умеет передавать. Ставите сервису жизненный цикл invokation и не паритесь на счет параллельности

Спасибо, пошел датаснап читать)
...
Рейтинг: 0 / 0
26.07.2019, 14:16
    #39841910
Basketbol
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ликбез про сокеты, stThreadBlocking, stNonBlocking
Прочитал.
DataSnap это про СУБД, данные, трехзвенную архитектуру...
Не про мою задачу.
...
Рейтинг: 0 / 0
26.07.2019, 14:34
    #39841931
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ликбез про сокеты, stThreadBlocking, stNonBlocking
BasketbolПрочитал.
DataSnap это про СУБД, данные, трехзвенную архитектуру...
Не про мою задачу.

Ничего подобного. Что то не то вы читаете. Обычная клиент-серверная архитектура. На сервере создаете сервис с методами и на клиенте генерируете готовый модуль с классами и такой же сигнатурой. За вас фреймворк все сделает и передаст данные.
...
Рейтинг: 0 / 0
26.07.2019, 14:41
    #39841938
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ликбез про сокеты, stThreadBlocking, stNonBlocking
X-CiteЧто то не то вы читаете.

Он читает про использование, а не концепцию.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
26.07.2019, 14:51
    #39841944
Basketbol
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ликбез про сокеты, stThreadBlocking, stNonBlocking
X-CiteBasketbolПрочитал.
DataSnap это про СУБД, данные, трехзвенную архитектуру...
Не про мою задачу.

Ничего подобного. Что то не то вы читаете. Обычная клиент-серверная архитектура. На сервере создаете сервис с методами и на клиенте генерируете готовый модуль с классами и такой же сигнатурой. За вас фреймворк все сделает и передаст данные.

В смысле - не обязательно делать источники данных?
Т.е. это будет архитектура, в которой будет отсутствовать СУБД?
...
Рейтинг: 0 / 0
26.07.2019, 15:00
    #39841955
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ликбез про сокеты, stThreadBlocking, stNonBlocking
Имхо, освоить предметную область это хорошо, но не стоит изобретать велосипед. Есть REST, JSON/XML API, всяческие ProtoBuffer, ZeroMQ и прочее.
По сабжу - сервера, рассчитанные на более сотни клиентов, на тредах не делаются. Либо non blocking, либо event-driven (ICS, например). Второе требует перестройки сознания, зато легко держит тысячи коннектов в одном треде.
...
Рейтинг: 0 / 0
26.07.2019, 15:05
    #39841960
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ликбез про сокеты, stThreadBlocking, stNonBlocking
Василий 2сервера, рассчитанные на более сотни клиентов, на тредах не делаются

Зато делаются клиенты. Ибо это проще.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
26.07.2019, 15:08
    #39841962
Basketbol
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ликбез про сокеты, stThreadBlocking, stNonBlocking
Да. Не ту статью прочитал.
Вот эту прочитал
http://www.interface.ru/home.asp?artId=26210

Прояснилось про dataSnap.
...
Рейтинг: 0 / 0
26.07.2019, 15:55
    #39841990
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ликбез про сокеты, stThreadBlocking, stNonBlocking
Basketbol,

обычный http-сервер делает тоже самое

HEAD и GET

а авторизацию подцепить любой админ может
...
Рейтинг: 0 / 0
26.07.2019, 17:33
    #39842027
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ликбез про сокеты, stThreadBlocking, stNonBlocking
Dimitry SibiryakovВасилий 2сервера, рассчитанные на более сотни клиентов, на тредах не делаются

Зато делаются клиенты. Ибо это проще.

Так ТС-у и то и другое надо сделать, а клиент без сервера не имеет смысла ))
...
Рейтинг: 0 / 0
26.07.2019, 19:42
    #39842079
Basketbol
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ликбез про сокеты, stThreadBlocking, stNonBlocking
Вообщем, решил все таки начать с сокетов))

Для потенциальной задачи одновременной работы
с парой сотен клиентов предпочтителен режим stNonBlocking.
Если я правильно понял - при подключении 200 клиентов создается 200 сокетов,
и где то внутри главного потока крутится бесконечный цикл,
который пробегается по этим сокетам, опрашивает их состояние и генерирует соответствующие события:
onClientConnect, onClientRead, onClientDisconnect

Начинаю с авторизации.
Клиент вводит логин и пароль, посылает его в
Код: pascal
1.
ClientSocket.Socket.SendText('<AUTH><LOGIN>mylogin</LOGIN><PASSWORD>mypassword</PASSWORD></AUTH>');


На стороне сервера парсю, проверяю правильность.
Если все ок - посылаю
Код: pascal
1.
ServerSocket.Socket.SendText("<RESULTAUTH>OK</RESULTAUTH>")



Здесь возникают сразу вопросы безопасности:
1. По сценарию, после проверки пароля открывается основное окно программы, и начинает скачиваться файл.
КулХацкеры могут изменить биты в exe-шнике т.о. чтобы любой пароль кроме правильного подходил.
Как от этого защититься?
2. Считается что посылать пароль в открытом виде нельзя.
Получается, нужно генерировать случайную salt , формировать строку md5("login+password+salt") и посылать хеш и отдельно соль.
Так что ли?
...
Рейтинг: 0 / 0
26.07.2019, 20:00
    #39842083
Basketbol
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ликбез про сокеты, stThreadBlocking, stNonBlocking
Получается, нужно сформированный успешный хеш считать "ключом сессии" и клиент должен этот ключ посылать при каждом новом запросе. Сервер при формировании ответа постоянно должен проверять соответствие ключа сессии...
Т.е. клиент присылает запрос:
Код: pascal
1.
ClientSocket.Socket.SendText('<GIVEMEFILE></GIVEMEFILE><MYSESSIONKEY>aefweqweqwevewwe</MYSESSIONKEY>');



Сервер в событии onRead
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
procedure TMainForm.ServerSocketClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  clientQuery: TClientQuery;
  stateClient: TStateClient;
begin
  clientQuery := ParseClientQuery(clientSocket.ReceiveText);
  if clientQuery.type = cqGiveMeFile then
  begin
     stateClient := getStateClient(Socket.data);
     if (stateClient.sessionKey = clientQuery.sessionKey) then
        sendMyFile(socket, myFile); //тут посылаем файл
  end;
  
end;



Как то так что ли?
...
Рейтинг: 0 / 0
27.07.2019, 10:08
    #39842169
Basketbol
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ликбез про сокеты, stThreadBlocking, stNonBlocking
Начал знакомиться с библиотекой RTC.
Пока не знаю чем RTC лучше, чем старые дедовские TServerSocket и TClientSocket.
Вот и узнаю)
...
Рейтинг: 0 / 0
05.08.2019, 12:48
    #39845351
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ликбез про сокеты, stThreadBlocking, stNonBlocking
Вот скоро ты дойдешь до того, что не только пароль, но и данные в открытом виде пересылать нельзя, а значит - добро пожаловать в дремучий лес TLS! Есть ли какая-то причина, чтобы не использовать библиотеки? ICS, например, содержит большинство известных методов авторизации, TLS, готовые серверы и клиенты и т.д.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ликбез про сокеты, stThreadBlocking, stNonBlocking / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]