Page 1 sur 1

Client - Serveur

Publié : mar. 06/juin/2017 19:21
par falsam
J'ai un souci de serveur PureBasic qui ne reçoit l'intégralité des données envoyées par les clients sauf si je met un delay() entre chaque envoi ce qui ne m'arrange pas.

J'ai crée un code minimum du serveur afin d'observer son comportement. Ce serveur est actuellement en fonctionnement. Pour ce test, le serveur va renvoyer ce que le client envoie.

Vous pouvez le tester avec le code client qui se charge d'envoyer 20 lignes de données. Commenter le Delay(50) pour voir la différence.

Code : Tout sélectionner

Define.s ServerIP   = "109.13.115.206"
Define.i ServerPort = 6832

Define.s Buffer
Define.i *Buffer, BufferSize = 1000

If InitNetwork() = 0
  Debug "Impossible d'initialiser les ressources réseaux"
  End
EndIf

;Connection avec le serveur
ConnectionID = OpenNetworkConnection(ServerIP, ServerPort, #PB_Network_TCP, 2000)
If ConnectionID
  
  ;Envoie des données test au serveur
  For i = 1 To 20
    *Buffer = AllocateMemory(BufferSize)
    
    Buffer = "Données " + Str(i)
    PokeS(*Buffer, Buffer, -1, #PB_UTF8)
    
    SendNetworkData(ConnectionID, *Buffer, BufferSize)
    
    ;Ajout d'un délai 
    Delay(50)
  Next
  
  FreeMemory(*Buffer)
  
  ;Initialisation du buffer recevant les données 
  *Buffer = AllocateMemory(BufferSize)
  
  Repeat
    SEvent = NetworkClientEvent(ConnectionID)
    
    If SEvent      
      Select SEvent          
        Case #PB_NetworkEvent_Data    ;Le serveur envoie des données
          ReceiveNetworkData(ConnectionID, *Buffer, BufferSize)
          Debug "Reception de données : " + PeekS(*Buffer, -1, #PB_UTF8) 
          
        Case #PB_NetworkEvent_Disconnect ;Déconnecté du serveur
          Debug "Deconnecté du serveur" 
          End
      EndSelect
    EndIf 
  ForEver
  
  CloseNetworkServer(0)
Else
  Debug "Ooops !! Impossible de se connecter au server"
EndIf

Re: Client - Serveur

Publié : mar. 06/juin/2017 19:23
par falsam
Le code du serveur de test

Code : Tout sélectionner

Define.i Port = 6832, *Buffer, BufferSize = 1000, CountUsers, ClientID
Define.s ServerWanIP, ServerLanIP, ClientIP

;Initialisation de l'environnement réseau
If InitNetwork() = 0
  Debug "Impossible d'initialiser les ressources réseaux"
  End
EndIf

;Création du serveur 
If CreateNetworkServer(0, Port)
  
  ;Recherche de l'adresse local du serveur
  ExamineIPAddresses()
  ServerLanIP = IPString(NextIPAddress())
  
  ;Recherche adresse ip du routeur 
  *Buffer = ReceiveHTTPMemory("https://api.ipify.org?format=json")
  If *Buffer    
    ParseJSON(0, PeekS(*Buffer, MemorySize(*Buffer), #PB_UTF8))
    FreeMemory(*Buffer)
    ServerWanIP = GetJSONString(GetJSONMember(JSONValue(0), "ip"))
  EndIf
  
  ;Affichage des caractéristique du serveur
  Debug "Création du serveur"  
  Debug "Adresse IP Public " + ServerWanIP
  Debug "Adresse IP Local " + ServerLanIP
  Debug "Port " + Str(Port)
  
  ;Initialisation du buffer recevant les données 
  *Buffer = AllocateMemory(BufferSize)
  
  Repeat
    SEvent = NetworkServerEvent()
    
    If SEvent
      ClientID = EventClient()
      ClientIP = IPString(GetClientIP(ClientID))
      
      Select SEvent
          
        Case #PB_NetworkEvent_Connect ;Un client se connecte
          CountUsers + 1
          Debug "Le client à l'adresse IP : " + ClientIP + " se connecte"
          Debug "Nombre d'utilisateurs connectés " + CountUsers
          
        Case #PB_NetworkEvent_Data    ;Un client envoie des données           
          Result = ReceiveNetworkData(ClientID, *Buffer, BufferSize)
          Debug "Reception des donnée du client " + ClientIP + " : " + PeekS(*Buffer, BufferSize, #PB_UTF8)
          
          ;Renvoi des données au client
          SendNetworkData(ClientID, *Buffer, BufferSize) 
          
        Case #PB_NetworkEvent_Disconnect ;Un client se déconnecte
          Debug "Le client à l'adresse IP " + ClientIP + " se déconnecte "
          CountUsers - 1
          Debug "Nombre d'utilisateurs connectés " + CountUsers
          
      EndSelect
    Else
      Delay(10)  ; Ne pas saturer le CPU  
    EndIf
  ForEver
  
  CloseNetworkServer(0)
Else
  Debug "Oops !! Impossible de créer le serveur" 
EndIf
D'avance merci pour votre aide.

Re: Client - Serveur

Publié : mar. 06/juin/2017 20:53
par djes
A voir comme ça, la commande sendnetworkdata() est non bloquante, ce qui fait que ton buffer reçoit peut-être de nouvelles données avant qu'elle ait finie d'en envoyer.

Re: Client - Serveur

Publié : mar. 06/juin/2017 23:28
par falsam
djes a écrit :peut-être de nouvelles données avant qu'elle ait finie d'en envoyer.
Non ce n'est pas le cas.

J'ai neutralisé au préalable l'envoi des données depuis le serveur et le résultat est le même. La réception des données est incomplète sur le serveur sans le delay(50) cotés client.

PS: Serveur et client sur le même pc il n'y a pas de souci.

Re: Client - Serveur

Publié : mer. 07/juin/2017 0:24
par JohnJohnsonSHERMAN
A mon avis le probléme est dans le serveur, qui reçoit si vite les données qu'il n'a pas le temps de lire les premiéres données que déja les suivantes arrivent et écrasent les précédentes. Si des données sont encore présentes dans le buffer de réception de sorte qu'il soit plein lors de la réception de nouvelles données, il y aura forcément une perte (soit on ignore ce qui arrive en trop, soit on écrase les précédentes données (non lues) ).
Il faut donc empêcher la collision des données dans le buffer de réception, pour cela tu peux essayer
-soit d'augmenter sa taille
-soit de récupérer plus vite les données (réduire le Delay du serveur)

Re: Client - Serveur

Publié : mer. 07/juin/2017 0:52
par case
chez moi avec un test local sur le mème pc cela fonctionne parfaitement même en enlevant les delais sur le serveur et le client
j'ai bien evoi des données de 0 a 20 d'affiche sur la fenetre serveur et client

Re: Client - Serveur

Publié : mer. 07/juin/2017 1:01
par falsam
Oui en local ça fonctionne correctement. C'est ce que j'ai précisé dans un message précédent.

Re: Client - Serveur

Publié : mer. 07/juin/2017 1:03
par case
je viens de réduire le buffer a 100 et je recois des données des 20 envois mais pas a la suite , melangés donc.
je soupconne un probleme de vitesse d'upload/ de traitement

je précise sur ton serveur distant

Code : Tout sélectionner

Reception de données : Données 1
Reception de données : Données 2
Reception de données : Données 3
Reception de données : Données 4
Reception de données : Données 5
Reception de données : Données 6
Reception de données : Données 7
Reception de données : Données 8
Reception de données : Données 9
Reception de données : Données 10
Reception de données : Données 11
Reception de données : Données 12
Reception de données : Données 13
Reception de données : Données 14
Reception de données : Données 15
Reception de données : Données 16
Reception de données : Données 7
Reception de données : Données 8
Reception de données : Données 9
Reception de données : Données 10
Reception de données : Données 17
Reception de données : Données 18
Reception de données : Données 19
Reception de données : Données 20
Reception de données : Données 15
Reception de données : Données 16
Reception de données : Données 7
Reception de données : Données 8
Reception de données : Données 9
Reception de données : Données 10


Re: Client - Serveur

Publié : mer. 07/juin/2017 1:24
par falsam
2:30 du matin je coupe le serveur et je monte le son.

Re: Client - Serveur

Publié : mer. 07/juin/2017 1:40
par JohnJohnsonSHERMAN
On reprend tout ca demain soir...

2:37 : Sherman> Poweroff completed with success 0x1.