powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ликбез про сокеты, stThreadBlocking, stNonBlocking
17 сообщений из 17, страница 1 из 1
Ликбез про сокеты, stThreadBlocking, stNonBlocking
    #39841880
Basketbol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Направьте на путь истинный в сетевом программировании.
Моя задача: клиент коннектится к серверу, вводит логин и пароль,
происходит авторизация, далее сервер должен закачать 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
Ликбез про сокеты, stThreadBlocking, stNonBlocking
    #39841886
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Каша в голове потому что ты пытался изучать слишком высокие уровни. Забудь о дельфийских
компонентах, они только затуманивают картину. Читай о простых BSD Socket.

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

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

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

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

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

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

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

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

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

HEAD и GET

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

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

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

Для потенциальной задачи одновременной работы
с парой сотен клиентов предпочтителен режим 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
Ликбез про сокеты, stThreadBlocking, stNonBlocking
    #39842083
Basketbol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Получается, нужно сформированный успешный хеш считать "ключом сессии" и клиент должен этот ключ посылать при каждом новом запросе. Сервер при формировании ответа постоянно должен проверять соответствие ключа сессии...
Т.е. клиент присылает запрос:
Код: 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
Ликбез про сокеты, stThreadBlocking, stNonBlocking
    #39842169
Basketbol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Начал знакомиться с библиотекой RTC.
Пока не знаю чем RTC лучше, чем старые дедовские TServerSocket и TClientSocket.
Вот и узнаю)
...
Рейтинг: 0 / 0
Ликбез про сокеты, stThreadBlocking, stNonBlocking
    #39845351
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот скоро ты дойдешь до того, что не только пароль, но и данные в открытом виде пересылать нельзя, а значит - добро пожаловать в дремучий лес TLS! Есть ли какая-то причина, чтобы не использовать библиотеки? ICS, например, содержит большинство известных методов авторизации, TLS, готовые серверы и клиенты и т.д.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ликбез про сокеты, stThreadBlocking, stNonBlocking
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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