Network envoie réception de données

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
fab
Messages : 24
Inscription : jeu. 07/avr./2011 21:07
Localisation : Limoux, France

Network envoie réception de données

Message par fab »

Bonjour,

Je reviens vous embêter cette fois à propos d'un problème de network :)

Dans mon application j'essaie d'intégrer le coté client de l'application et j'ai fait un petit serveur (pour le moment il essaie juste de communiquer)
Seul soucis arrivé à une étape je ne sais plus comment faire pour récupérer la réponse du serveur.

Voici mon code coté client :

Code : Tout sélectionner

 Port = 6832
    *DataBuffer = AllocateMemory(1000)
    
    Connection = OpenNetworkConnection("127.0.0.1", Port)
    If Connection =0
      MessageRequester("Erreur", "Probleme de connexion au serveur")  
    EndIf
  
    SendNetworkString( Connection, "Test")
    
    
    ;Ici je ne sais pas comment récupérer la réponse du serveur
    
    
    CloseNetworkServer(0)
Coté serveur la connexion s'effectue bien, et la récupération des données à l'air de fonctionner mais coté client je n'arrive pas à trouver malgrès mes tentatives la syntaxe pour récupérer la réponse.

Merci.
Mac Os X snow léopard, PureBasic 4.51
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Network envoie réception de données

Message par blendman »

tu as regardé l'exemple server/client dans le dossier exemple de purebasic ?

il me semble qu'il envoie les données, qu'il les réceptionne et les renvoie au client ;).
Avatar de l’utilisateur
fab
Messages : 24
Inscription : jeu. 07/avr./2011 21:07
Localisation : Limoux, France

Re: Network envoie réception de données

Message par fab »

En fait je me suis basé dessus pour mon serveur et ça fonctionne et je me suis aussi basé dessus pour l'envoie de données comme dans le code ci dessus mais j'espérait recevoir une réponse sans avoir à implémenter un serveur/serveur malheureusement j'ai l'impression que c'est ce que je vais devoir faire si je veux recevoir une réponse dans mon appli de la part du serveur, non?
Mac Os X snow léopard, PureBasic 4.51
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Network envoie réception de données

Message par blendman »

heu, je ne comprends pas bien ce que tu veux dire :P.

Lorsque tu envoie au serveur une donnée, tu dois avoir une procédure sur ton serveur pour :
- réceptionner la donnée reçue, de la part du client, avec son ID
- si besoin, renvoyer une donnée au client (toujours avec son ID)

Et dans ton client il faut une procédure pour :
- réceptionner cette donnée reçue.
- faire les actions souhaitées

Dans le cadre d'un jeu par exemple :
- le client 1 bouge son perso
- il envoie la position au serveur
- le serveur réceptionne cette donnée
- le serveur envoie aux autres clients, la position de A (sauf à A ?)

C'est ça que tu veux faire ?

Dans l'exemple donné, tu as diverses fonctions utiles comme :
NetworkServerEvent()
EventClient() : permet de connaitre quel est le lien qui a émis les données
NetworkClientEvent()
etc..

ainsi que des constantes utiles :
#PB_NetworkEvent_Connect
#PB_NetworkEvent_Data
#PB_NetworkEvent_File
..

Je pense que cette fonction devrait t'intéresser :

Code : Tout sélectionner

ReceiveNetworkData(Connexion, *BufferMemoire, Longueur) 

Reçoit une donnée brute du client spécifié. Cette fonction peut être utilisée par une application Serveur ou Client: 

- côté serveur, 'Connexion' identifie le client qui a envoyé les données ('Connexion' peut être obtenue simplement avec la fonction EventClient()). 

- côté client, 'Connexion' est retournée par la commande OpenNetworkConnection(). Les données sont lus directement dans la zone mémoire '*BufferMemoire'. 

le nombre d'octets effectivement lus par la fonction est renvoyé dans 'Resultat'. Si 'Resultat' est égal à 'Longueur', alors il reste des données en attente à lire. Si une erreur est survenue sur la connexion et que la lecture n'est plus possible, 'Resultat' sera égal à -1. 
A mon avis, il faut regarder de ce coté-là ;).
Avatar de l’utilisateur
fab
Messages : 24
Inscription : jeu. 07/avr./2011 21:07
Localisation : Limoux, France

Re: Network envoie réception de données

Message par fab »

Oui, mais je n'arrive pas à obtenir un retour de la part du serveur :

Application -> serveur : reception des données ok
serveur->Application : pas de données ressues ni d'évènement network

voici le code ou il en est actuellement :

coté client :

Code : Tout sélectionner

    
    Port = 6832
*Buffer = AllocateMemory(1000)




If CreateNetworkServer(0, Port)
  
  MessageRequester("PureBasic - Server", "Server created (Port "+Str(Port)+").", 0)
  
    Connection = OpenNetworkConnection("adresse.info", Port)
    
    SendNetworkString( Connection, "Test")

  Repeat
 
    
 
    SEvent = NetworkServerEvent()
  
    If SEvent
    MessageRequester("evenement", "evenement")
      ClientID = EventClient()
  
      Select SEvent
  
        Case #PB_NetworkEvent_Data
          MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has send a packet !", 0)
          ReceiveNetworkData(Connection, *Buffer, 1000)
          MessageRequester("Info", "String: "+PeekS(*Buffer), 0)
         
        Case #PB_NetworkEvent_Disconnect
          MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has closed the connection...", 0)
          quit= 1
    
      EndSelect
    EndIf 
    
  Until quit = 1
  
  MessageRequester("PureBasic - Server", "Click to quit the server. "+PeekS(*Buffer), 0)
  
  CloseNetworkServer(0)
Else
  MessageRequester("Error", "Can't create the server (port in use ?).", 0)
EndIf
voici maintenant le coté serveur :

Code : Tout sélectionner

*Buffer = AllocateMemory(1000)
    SEvent = NetworkServerEvent()
  
    If SEvent
    
      ClientID = EventClient()
     
      Select SEvent
      
        Case #PB_NetworkEvent_Connect
          SetGadgetText(#Tracer_0, "Utilisateur"+Str(ClientID)+" vient de se connecter"+Chr(13)+GetGadgetText(#Tracer_0))
  
        Case #PB_NetworkEvent_Data
          SetGadgetText(#Tracer_0, "Utilisateur"+Str(ClientID)+" s'identifie"+Chr(13)+GetGadgetText(#Tracer_0))
          ReceiveNetworkData(ClientID, *Buffer, 1000)
          
          If SendNetworkString(ClientID, "Test retour") ;Cette valeur que j'essais de récupérer

            SetGadgetText(#Tracer_0, "Envoie de la répone"+Chr(13)+GetGadgetText(#Tracer_0))
          Else
            SetGadgetText(#Tracer_0, "Probleme envoie reponse"+Chr(13)+GetGadgetText(#Tracer_0))
          EndIf
          
          UsePostgreSQLDatabase()
          If OpenDatabase(#Database_0, "host=localhost port=5432 dbname=pureTest", "postgres", "password", #PB_Database_PostgreSQL)
            SetGadgetText(#Tracer_0, PeekS(*Buffer)+Chr(13)+GetGadgetText(#Tracer_0))
          pseudo.s = ""
          password.s = ""
          
          If DatabaseQuery(#Database_0, "SELECT * FROM users WHERE pseudo = '"+pseudo+"' AND password = '"+password+"'")
            SetGadgetText(#Tracer_0, DatabaseError()+Chr(13)+GetGadgetText(#Tracer_0))
          Else
            SetGadgetText(#Tracer_0, "ERREUR SQL 2"+Chr(13)+GetGadgetText(#Tracer_0))  
            SetGadgetText(#Tracer_0, DatabaseError()+Chr(13)+GetGadgetText(#Tracer_0))
          EndIf
          
        Else
          SetGadgetText(#Tracer_0, "ERREUR SQL"+Chr(13)+GetGadgetText(#Tracer_0))
        EndIf
        
        Case #PB_NetworkEvent_File
          ReceiveNetworkFile(ClientID, "C:\TEST_Network.ftp3")
  
        Case #PB_NetworkEvent_Disconnect
          Quit = 1
          
        Default 
          ProcedureReturn 0
          
      EndSelect
    EndIf 
Mac Os X snow léopard, PureBasic 4.51
Avatar de l’utilisateur
fab
Messages : 24
Inscription : jeu. 07/avr./2011 21:07
Localisation : Limoux, France

Re: Network envoie réception de données

Message par fab »

Voila à force de faire et refaire mon code j'ai enfin réussi à intercepter la réponse.
Probleme résolu.

Merci.
Mac Os X snow léopard, PureBasic 4.51
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Network envoie réception de données

Message par blendman »

fab a écrit :Voila à force de faire et refaire mon code j'ai enfin réussi à intercepter la réponse.
Probleme résolu.
Merci.
ah super :)

C'est pour un jeu, c'est ça ? un jeu 2D ou 3D ?

Tu peux poster la solution si tu veux, ça peut toujours servir ;)
Avatar de l’utilisateur
fab
Messages : 24
Inscription : jeu. 07/avr./2011 21:07
Localisation : Limoux, France

Re: Network envoie réception de données

Message par fab »

Oui c'est pour un jeu 2D pour la 3D faut que je m'achète du talent avant :D

alors la solution c'est que j'ai fait une boucle qui tourne en attendant l'évènement (pas sur que ce soit la meilleure méthode mais c'est la seule parmis des dizaines qui à fonctionnée) :

Code : Tout sélectionner

 Port = 6832
      *Buffer = AllocateMemory(1000)
      
      ConnectionID = OpenNetworkConnection("adresse.info", Port)
      
      If ConnectionID = 0
        MessageRequester("Erreur", "Probleme de connexion")
      EndIf
      
      SendNetworkString(ConnectionID, GetGadgetText(#Pseudo_User_0)+GetGadgetText(#Pseudo_Password_0)) ;ça ça va changer certainement :)
      
      While NetworkClientEvent(ConnectionID) <> 2
        
        ;Debug NetworkClientEvent(ConnectionID)
        ;Ici je mettrais un système pour faire patienter
        
      Wend
      
      ReceiveNetworkData(ConnectionID, *Buffer, 1000)
      
      ;je traite la réponse
      
      ;puis je ferme la connexion
      CloseNetworkConnection(ConnectionID)
Mac Os X snow léopard, PureBasic 4.51
Répondre