Page 1 sur 2

transformer un programme sur serveur

Publié : sam. 25/févr./2017 18:21
par YvesRossignol
Bonjour, là je suis totalement dans le cirage... comment puis-je prendre une application et la transformer pour qu'elle puisse tourné sur un serveur...

Est-ce faisable ? si oui qu'elles sont les étapes.

Merci!

Finalement j'ai plus de demandes des bureaux d'études pour des versions réseaux.

Yves :lol:

Re: transformer un programme sur serveur

Publié : sam. 25/févr./2017 18:25
par falsam
Finalement j'ai plus de demandes des bureaux d'études pour des versions réseaux.
Réseau local d'entreprise ? c'est à dire qui ne passe pas par le web ?

Re: transformer un programme sur serveur

Publié : sam. 25/févr./2017 18:59
par YvesRossignol
Sur les réseaux locaux de leur entreprise. Ils vont sur internet chercher la version voulue mais elle est executer en local sur leur serveur.

Yves

Re: transformer un programme sur serveur

Publié : sam. 25/févr./2017 22:43
par falsam
YvesRossignol a écrit :Sur les réseaux locaux de leur entreprise. Ils vont sur internet chercher la version voulue mais elle est executer en local sur leur serveur.Yves
C'est donc une application tout à fait classique que chacun installe sur son poste de travail.

Par contre si les données sont partageables, alors dans ce cas il faut installer sur un serveur une base de données gérant des accès concurrents comme PostgreSQLl. Ce type de bases de données SQL est gérée en natif avec PureBasic.

Une base de données PostgreSQL se gère de la même manière qu'une base de données SQLite. La seule différence c'est qu'une base de données PostgreSQL peut être mise à jour par X utilisateurs.

Un tout petit exemple d'une base de données test que j'ai nommé falsam_bd01 que j'ai crée chez alwaysdata contenant une table jeux ne contenant pas grand chose.

Pour se connecter il faut des identifiants :
- Utilisateur Base de données falsam_01
- Password purebasicdemo

Un code pour mettre ça en oeuvre dont l'objectif est d'afficher la liste des jeux et l'années de création:

Code : Tout sélectionner

UsePostgreSQLDatabase()

Enumeration
  #Database
EndEnumeration

Global ReqSql.s, Buffer.s

;Connection à la base de données PostgreSQL
If OpenDatabase(#Database, "host=postgresql1.alwaysdata.com port=5432 dbname=falsam_bd01", "falsam_01", "purebasicdemo", #PB_Database_PostgreSQL)
  Debug "Connected to PostgreSQL"
  
  ;Execution d'une requête de sélection
  ReqSql="select * from jeux order by annee asc"
  DatabaseQuery(#Database, ReqSql)
  
  ;Affichage du résultat
  If DatabaseQuery(#Database, ReqSql)
    While NextDatabaseRow(#Database)
      Buffer = GetDatabaseString(#Database, 1)              ; Titre du jeu
      Buffer + " (" + GetDatabaseString(#Database, 2)       ; Editeur
      Buffer + " - " + GetDatabaseLong(#Database, 3) + ")"  ;Année 
      
      Debug Buffer
    Wend
  EndIf  
  
  ;Fermeture de la base de données 
  CloseDatabase(#Database)
  
Else
  Debug "Connection failed: "+DatabaseError()
EndIf
L'identifiant de connexion est en clair pour facilité la lecture du code.

PostgreSQL permet de créer des identifiants de connexions dotés de privilèges tout comme sur des bases de données MySQL. Si je ne suis pas trompé, falsam_01 ne peut que lire les données.

Re: transformer un programme sur serveur

Publié : dim. 26/févr./2017 0:03
par YvesRossignol
En fait tu as raison, mais la seule chose que les gens partages c'est le nombre de licences disponibles. Mais je pense que c'est un fichier que l'on ouvre et ferme si rapidement qu'un partage en temps réel n'est peut-être pas requis.

Admettons qu'une firme ABC a acheté 5 licences. A chaque ouverture le fichier est modifié pour dire 4 de dispo, 3 de dispo, etc... mais le fichier a le nombre maximum également. ça serait faisable?

Yves :)

Re: transformer un programme sur serveur

Publié : dim. 26/févr./2017 0:06
par YvesRossignol
En fait on mettrait ton code plus la gestion du nombre de licence à un endroit précis du serveur. A-t-on besoin d'un serveur de fichier tel que Atomic alors... je ne comprends pas tout.

Merci encore Falsam!

Yves

Re: transformer un programme sur serveur

Publié : dim. 26/févr./2017 0:32
par falsam
Avec un server local comme Simple Server ++ par exemple oui il est possible de gérer un compteur de téléchargement pour ton application et par conséquence tu connais le nombre de licence restant.

La question est qu'est ce qui empêche un utilisateur de downloader une licence et de la recopier autant qu'il le souhaite ?

Peut être que la solution serait que le download soit illimité. Par contre quand un utilisateur lance l'application, alors cette application se connecte au serveur et décrémente un compteur de licence. Quand l'utilisateur se déconnecte, le compteur de licence s'incrémente.

Re: transformer un programme sur serveur

Publié : dim. 26/févr./2017 2:21
par falsam
■ Une idée de serveur de licence installer dans une entreprise.
- Un compteur de licence est initialisée.
- Un utilisateur se connecte et se voit attribuer une autorisation de licence si disponible.
- Un utilisateur se déconnecte, l'autorisation de licence est récupérée.
- Le serveur est arrêté, les applications sous licences en cours d’exécution sont fermées.

Code : Tout sélectionner

EnableExplicit

Global Title.s = "Licence Server"

;Network Setup
Global Port = 6833
Global ClientID
Global BufferSize = 1024, *Buffer = AllocateMemory(BufferSize), Buffer.s

;Licence
Global MaxLicence = 3
Global CountLicence = MaxLicence

;Map des utilisateurs connectés 
;Pour chaque utilisateur, une autorisation d'utilisation est attribuée (#True) ou pas (#False)
Global NewMap Users()

Declare Start()  
Declare ClearLog()
Declare Resize()
Declare Exit()

Start()

Procedure Start()
  Protected ServerEvent, Result
  
  If InitNetwork() = 0
    MessageRequester("Information", "Impossible d'initialiser l'environement réseau", 0)
    Exit()
  EndIf
  
  ;Création du serveur 
  If CreateNetworkServer(0, Port)
    OpenWindow(0, 0, 0, 800, 600, Title, #PB_Window_SystemMenu | #PB_Window_SizeGadget)
    WindowBounds(0, 200, 100, #PB_Ignore, #PB_Ignore) 
    EditorGadget(0, 0, 0, 800, 560, #PB_Editor_ReadOnly)
    AddGadgetItem(0, -1, FormatDate("%hh:%mm", Date()) + " | Server en écoute sur le port " + Port)
    
    CheckBoxGadget(1, 10, 570, 200, 22, "Show Log") 
    SetGadgetState(1, #PB_Checkbox_Checked)
    
    ButtonGadget(2, 700, 570, 80, 22, "Clear Log")
    
    ;Déclencheur / Trigger
    BindGadgetEvent(2, @ClearLog())
    BindEvent(#PB_Event_SizeWindow, @Resize())
    BindEvent(#PB_Event_CloseWindow, @Exit())
    
    Repeat
      Repeat : Until WindowEvent() = 0
      
      ServerEvent = NetworkServerEvent()
      
      If ServerEvent
        ClientID = EventClient()
        
        Select ServerEvent
          Case #PB_NetworkEvent_Connect
            AddGadgetItem(0, -1, FormatDate("%hh:%mm", Date()) + " | Client " + Str(ClientID) + " se connecte") 
            
          Case #PB_NetworkEvent_Data
            AddGadgetItem(0, -1, FormatDate("%hh:%mm", Date()) + " | Réception des données du client " + Str(ClientID) )
            ReceiveNetworkData(ClientID, *Buffer, BufferSize)
            
            Select LCase(PeekS(*Buffer, -1, #PB_UTF8))
              Case "getlicence"
                If CountLicence > 0
                  CountLicence - 1
                  Users(Str(ClientID)) = #True ;Une autorisation d'utilisation est délivrée
                  AddGadgetItem(0, -1, FormatDate("%hh:%mm", Date()) + " | Le client " + Str(ClientID) + " reçoit une licence.")
                  SendNetworkString(ClientID, "ReceiveLicence", #PB_UTF8)
                  AddGadgetItem(0, -1, FormatDate("%hh:%mm", Date()) + " | Nombre de licence disponible " + Str(CountLicence))
                Else
                  Users(Str(ClientID)) = #False ;Pas d'authorisation d'utilisation
                  AddGadgetItem(0, -1, FormatDate("%hh:%mm", Date()) + " | Plus de licence disponible pour le client " + Str(ClientID))
                  SendNetworkString(ClientID, "NoLicence", #PB_UTF8)
                EndIf
            EndSelect
            
          Case #PB_NetworkEvent_Disconnect
            AddGadgetItem(0, -1, FormatDate("%hh:%mm", Date()) + " | Le client " + Str(ClientID) + " se déconnecte")
            If CountLicence < MaxLicence And Users(Str(ClientID)) = #True
              CountLicence + 1
            EndIf 
            
            ;Suppression de l'utilisateur 
            DeleteMapElement(Users(), Str(ClientID))
            AddGadgetItem(0, -1, FormatDate("%hh:%mm", Date()) + " | Nombre de licence disponible " + Str(CountLicence))
        EndSelect
      Else
        Delay(10)  ; Ne pas saturer le CPU
      EndIf
      
    ForEver   
    CloseNetworkServer(0)
  Else
    MessageRequester("Information", "Impossible de créer le serveur de licence" + #CRLF$ +  "le port est peut être utilisé ?", 0)
  EndIf
EndProcedure  

Procedure ClearLog()
  ClearGadgetItems(0)  
EndProcedure

Procedure Resize()
  Protected Width = WindowWidth(0)
  Protected Height = WindowHeight(0)
  
  ResizeGadget(0, #PB_Ignore, #PB_Ignore, Width, Height-40)
  ResizeGadget(1, #PB_Ignore, Height - 30, #PB_Ignore, #PB_Ignore)
  ResizeGadget(2, Width - 100, Height - 30, #PB_Ignore, #PB_Ignore)
EndProcedure

;Sortie  / Exit 
Procedure Exit()
  CloseNetworkServer(0)   
  End
EndProcedure

Re: transformer un programme sur serveur

Publié : dim. 26/févr./2017 2:25
par falsam
■ Maintenant le code d'une application qui va se connecter à un serveur de licence.
- L'application se connecte et se voit attribuer une licence si disponible.
- Si le serveur est arrêté, l'application est fermée.

Code : Tout sélectionner

EnableExplicit

Global Title.s = "Mon Application"
Global IP.s = "109.13.115.206", Port = 6833, TimeOut = 3000, ConnectionID
Global Result
Global BufferSize = 1024

;Plan de l'application
Declare Start()
Declare DataReceived()
Declare Exit()

Start()

Procedure Start()
  ;Initialisation environnement réseau
  If InitNetwork() = 0
    MessageRequester("Information", "Impossible d'initialiser l'environnement réseau", 0)
    Exit()
  EndIf
  
  ;Connection serveur
  ConnectionID = OpenNetworkConnection(IP, Port, #PB_Network_TCP, TimeOut)
  
  If ConnectionID   
    OpenWindow(0, 0, 0, 800, 600, Title, #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
    SetWindowTitle(0, Title +  " Client connected to server...")
 
    ;Triggers
    BindEvent(#PB_Event_CloseWindow, @Exit())
    
    ;Demande de licence
    SetWindowTitle(0,  Title + " Demande de licence en cours...")  
    SendNetworkString(ConnectionID, "GetLicence", #PB_UTF8)
        
    Repeat : WaitWindowEvent(5) 
      If ConnectionID
        Result = NetworkClientEvent(ConnectionID)
        Select Result
          Case #PB_NetworkEvent_Data
            DataReceived()
            
          Case #PB_NetworkEvent_Disconnect
            MessageRequester("Information ", "Oops désolé" + #CRLF$ + "le serveur de licence n'est plus en ligne.")
            Exit()
            
        EndSelect
      EndIf
    ForEver 
  Else
    MessageRequester("Information ", "Le serveur de licences n'est pas disponible" + #CRLF$ + "Est il connecté ?")
  EndIf
EndProcedure

Procedure DataReceived()
  Protected *Buffer = AllocateMemory(BufferSize)
  
  ReceiveNetworkData(ConnectionID, *Buffer, BufferSize)
  Select LCase(PeekS(*Buffer, -1, #PB_UTF8))
    Case "receivelicence"
      SetWindowTitle(0, Title + " (Licence autorisée)")
      
    Case "nolicence"
      MessageRequester("Information", "Pas assez de licence pour utiliser cette application")
      Exit()
  EndSelect    
  FreeMemory(*Buffer)
EndProcedure

Procedure Exit()
  If ConnectionID
    CloseNetworkConnection(ConnectionID)
  EndIf  
  End
EndProcedure
:arrow: Un serveur de licence tourne pour le moment chez moi. Tu peux compiler ce code et le lancer 3 fois. Si tu le lances encore une fois, la licence ne sera pas accordée tant qu'une application lancée précédemment n'est pas fermée.

Re: transformer un programme sur serveur

Publié : dim. 26/févr./2017 9:44
par Marc56
Ce qui arrive souvent avec les programmes a attribution de licence reseau c'est que les premiers utilisateurs arrivés le matin ouvrent le logiciel et le gardent en icone juste pour l'avoir a dispo quand ils enont besoin.
Ceux qui arrivent apres ...
Ce type d'application doit donc avoir un système pour liberer automatiquement la licence si le programme n'effectue aucune action pendant plusieurs minutes.

Il est aussi intéressant d'installer le programme sur le serveur lui meme (dans une ressource partagée) et de ne mettre que le raccourci sur les postes utilisateurs
- l'utilisateur a toujours la derniere version a jour
- le référentiel reste sur le serveur
- les données utilisateurs sont sauvees dans la ressource roaming de l'utilisateur, donc il retrouve meme s'il se connecte sur un poste different.
- on peut utiliser la limite du nombre d'accès concomitant du serveur comme licence sinon on fait des fichiers flags qu'on maintient ouvert le temps de session
- on peut empecher que le programme soit copié en local (faire en sorte que le programme ne fonctionne que s'il peut lire un fichier flag present sur le serveur et accessible que par lui)

:wink:

Re: transformer un programme sur serveur

Publié : dim. 26/févr./2017 12:23
par falsam
Je vois qu'il y a eu des tests sur le serveur d'attribution de licence ce qui m'a permis de déceler une erreur de débutant que je ne dévoilerais pas :mrgreen:

Code serveur mis à jour. Les tests peuvent reprendre.

@Marc: Ton commentaire est juste et facile à mettre en oeuvre. Le code serveur est allégé le plus possible afin de le rendre plus compréhensible. J'aime bien ce petit serveur d'attribution de licence car il permet à chacun de travailler depuis chez soi par exemple.

Re: transformer un programme sur serveur

Publié : dim. 26/févr./2017 16:51
par YvesRossignol
Littéralement fantastique.... j'ai essayé est ça marche sans problème comme tout ce que fait falsam...

Merci je regarde cela avec attention.

Je vais regarder pour mettre cela sur mon hébergeur... combien cela va-t-il-me coûter, je ne sait pas.

Yves

Re: transformer un programme sur serveur

Publié : dim. 26/févr./2017 16:56
par falsam
Je vais regarder pour mettre cela sur mon hébergeur... combien cela va-t-il-me coûter, je ne sait pas.
Pourquoi chez un hébergeur ?

Avec un server de licence tu géres une ou plusieurs entreprises ?

Re: transformer un programme sur serveur

Publié : dim. 26/févr./2017 17:12
par YvesRossignol
Bonjour, je vois qu'en essayant le lien sur le serveur à la quatrième essai il nous refuse accès mais si on redemande accès il nous la donne... même si on a dépassé le nombre de licence maximum

De plus si je veux installer cela sur mon ordinateur et en faire un serveur global... ou est mon adresse i.p. visible de l'extérieur. j'ai essayé ipconfig/all et je ne l'ai pas vu sauf une pour le réseau interne. Est-ce que je devrais utiliser un répétiteur de i.p (ou un service de renvoi automatique si mon hébergeur me charge 50$ de plus pas mois... c'est beaucoup quand rien ne rentre comme argent.

Yves.

Re: transformer un programme sur serveur

Publié : dim. 26/févr./2017 17:44
par falsam
je vois qu'en essayant le lien sur le serveur à la quatrième essai il nous refuse accès mais si on redemande accès il nous la donne... même si on a dépassé le nombre de licence maximum
Ooops ! Encore une erreur de noob.

Code serveur modifié
http://www.purebasic.fr/french/viewtopi ... 57#p190157

Ajout d'une map utilisateurs avec attribution d'utilisation de la licence (#True) ou pas de droit (#False) si nombre de licences insuffisantes.