1 (edited by sibprogsistem 2018-11-06 17:17:15)

Topic: сервер

решил реализовать клиент - сервер таким образом

1.при авторизации программы клиента проверяем есть ли совпадения с уже подключеными пользователями (тут нужно проверять  логин), если такого пользователя нет то записываем в ( таблицу авторизации) (имя  и его ip)  иначе запрещаем авторизацию
2.серверная часть каждые "n' минут (пингует адрес пользователя) если ответ не получен, то удаляем запись  из (таблици авторизации)...
3.Запрещаем подключение к клиента к базе если серверная часть не запущенна (для проверки можно создать метку).  И вот тут есть проблема, если сервеная часть пингуется но сам сервер не запущен (произошел сбой и сервер просто вылетел) то метка тут не поможет... и обратно то же самое
Может есть у кого мысли как организовать эту проверку?

Re: сервер

а возможно ли на другом пк через сетевое подключение проверить, запущен ли процесс

Re: сервер

Речь идет о MySQL?


Вы можете получить список подключенных процессов с помощью данного SQL запроса

SHOW PROCESSLIST

подробней https://dev.mysql.com/doc/refman/8.0/en … slist.html


Также для каждого пользователя можно задать максимальное количество подключений
пример:

grant usage on *.* to user1234@'%' with max_user_connections 1;

Если сервер не запущен, то вы просто получите сообщение об ошибке.

Dmitry.

Re: сервер

нет про SQLite

Re: сервер

может еще поле в таблицу добавить...
клиент каждые 2-е секунды изменяет значение поля на 1 а сервер на 0, если при обращении к полю значение не поменялось (скажем при обращении 3-раза падряд)... то значит произошел сбой ..
если сбой на стороне сервера - то программа сообщает о сбое и завершает работу...
если сбой на стороне клиента - то сервер просто удаляет запись клиента из таблицы..

тут у меня вопрос:: 
Как это повлияет на работу SQLite?

Re: сервер

1.2.
Приложил два проекта, один проверяет повторную авторизацию, во втором реализован механизм пинга, т.е. проверяет, действительно ли пользователь онлайн.


3. К сожалению тут не пойму о какой серверной части идет речь.


Проще будет использовать MySQL.

Post's attachments

Attachment icon Login and logs and who online with timer.zip 43.79 kb, 283 downloads since 2018-11-08 

Attachment icon Login with check double login.zip 40.38 kb, 274 downloads since 2018-11-08 

Dmitry.

Re: сервер

спасибо за примеры,
да MySQL для этого будет проще, но пользователи не обязательно будут использовать MySQL а с тем учетом, что для некоторых установка и запуск сервера базы данных непосильная задача,  SQLite очень к стате...

Вот я и решил сделать подобие (клиент - сервер) на SQLite..... Все вроди как и получается, но меня зайтересовал вопрос..

Как это отразится на производительности SQLite..

Re: сервер

sibprogsistem wrote:

Как это отразится на производительности SQLite..

Скорей всего никак.

Dmitry.

9 (edited by sibprogsistem 2018-11-10 16:02:13)

Re: сервер

Вот такая у меня получилась авторизация...

 procedure frmLogin_bLoginOk_OnClick (Sender: TObject; var Cancel: boolean);
 var
  s,t,r: string;
  sStatus: string;
 ini:TIniFile;
begin
ini :=TIniFile.Create(ExtractFilePath (ParamStr (0))+'settings.ini');
   t:=ini.ReadString('Options', 'server', '');
    // Запрос SQL для проверки пользователя и пароля
     s := SQLExecute('SELECT count(id) FROM users WHERE (id = ' + IntToStr(frmLogin.cbStatus.dbItemID) + ') AND (password = ''' + frmLogin.ePassword.Text + ''');');
     r:=SQLExecute('SELECT YesNo FROM serverYesNo WHERE id=1');
 // если логин выбран
if (frmLogin.cbStatus.dbItemID)<> -1 then
 begin
   // если поле пароль заполнено
  if (frmLogin.ePassword.Text)<>'' then
    begin
       // если SQL-запрос нашел логин и пароль
        if (s <> '0') and (s<>'') then
          begin
               // если пользователь с таким именем не подключен
                  if SQLExecute('SELECT online FROM users WHERE id = ' + IntToStr(frmLogin.cbStatus.dbItemID))= '0' then
                    begin
                       // проверка сервера
                       try
                         // если программа работает с сервером
                         if (t<>'') then begin
                             //если сервер не запущен
                             if (r='0') then  MessageBox ('Сервер не запущен','Ошибка подключения ',MB_RETRYCANCEL+MB_ICONINFORMATION)
                               else begin
                                try
                               //скрыть форму авторизации
                                frmLogin.Hide;
                              // SQL-запрос прав пользователя
                                sStatus := SQLExecute('SELECT id_userStatus FROM users WHERE id='+frmLogin.cbStatus.sqlValue);
                                 // если права пользователя * то открыть *
                                  if sStatus = '1' then frmAdmin.Show else  //администратор
                                  if sStatus = '2' then frmMasterWork.Show else  //мастер
                                  if sStatus = '3' then frmServiceCen.Show ;  //менеджер
                                  SQLExecute('UPDATE users SET online="1" WHERE id = ' + IntToStr(frmLogin.cbStatus.dbItemID));
                                 except
                                 //когда не ведома причина
                                 MessageBox ('Неизвестная ошибка','Ошибка подключения ',MB_RETRYCANCEL+MB_ICONINFORMATION);
                               end;
                             end ;
                            end;
                           // если программа работает без сервера
                          if (t='') then
                           begin
                            try
                          //скрыть форму авторизации
                           frmLogin.Hide;
                          // SQL-запрос прав пользователя
                           sStatus := SQLExecute('SELECT id_userStatus FROM users WHERE id='+frmLogin.cbStatus.sqlValue);
                          // если права пользователя * то открыть *
                           if sStatus = '1' then frmAdmin.Show else  //администратор
                           if sStatus = '2' then frmMasterWork.Show else  //мастер
                           if sStatus = '3' then frmServiceCen.Show ;  //менеджер
                           SQLExecute('UPDATE users SET online="1" WHERE id = ' + IntToStr(frmLogin.cbStatus.dbItemID));
                             except
                             //когда не ведома причина
                            MessageBox ('Неизвестная ошибка','Ошибка подключения ',MB_RETRYCANCEL+MB_ICONINFORMATION);
                          end;
                         end;
                      Finally
                   end;
                    // если пара логи и пароль верна, но пользователь уже в сети
               end else MessageDlg('Этот пользователь подключен, выбирите другого пользователя ', mtError, mbOk, 0);
               // если пара логин и пароль неверна
         end else MessageDlg('Пароль неверен', mtError, mbOk, 0);
          // если не указан пароль
    end else MessageDlg('Укажите пароль', mtError, mbOk, 0);
     // если логин не выбран
 end else MessageDlg('Выбирите пользователя ', mtError, mbOk, 0);
end;