IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PureBasic Discussion :

Commandes Network Serveur/client


Sujet :

PureBasic

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 45
    Points : 19
    Points
    19
    Par défaut Commandes Network Serveur/client
    Bonjour,
    J'aimerais savoir quels sont les commandes permettant d'envoyer des chaines de caractère ou nombre (SendNetworkString) vers un serveur , puis d'enregister les donnée tapées et envoyée sur le serveur dans un fichier texte, puis de les comparées avec un autre fichier texte contenant d'autre données..
    En gros comment faire un login sur un client vers un serveur qui renvoient les données (si elle sont bonne ou pas)...
    Merci

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 45
    Points : 19
    Points
    19
    Par défaut N3xt-d (moteur PureBasic)
    Ah oui,
    Et j'aimerais de même savoir comment faire pour que mon ninja sois visible s'il vous plait, qu'il soit dans le chateau quoi ...
    Merci


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
     
                                            ;/////////////////////////////
                                            ;/ DREAM OF WORLD - Essais 2 /
                                            ;/////////////////////////////
     
    ;////////////////////////////////////////////////////////// Fichiers à inclure obligatoirement 
    IncludePath "includes"   :   IncludeFile "n3xtD_PB.pbi"
     
    ;//////////////////////////////////////// Globales
    Global	anglex.f, angley.f, flagXDown.w
    ;///////////////////////////////////
    Global	mox.f, omx.f, moy.l, omy.l
    ;///////////////////////////////////
    Global	pitch.f, yaw.f
    ;///////////////////////
    Global *app.l, Quit.l
    ;///////////////////////
    Global width.l = 1024
    ;///////////////////////
    Global height.l = 768
     
    ;Ouvre une fenêtre N3xt-D
    *app = iCreateGraphics3D(1024,768)
    ; << OR >>
    ;*app = iCreateGraphics3D(800,600, 32, #False, #False, #EDT_DIRECT3D9)
    If *app= #Null
      End
    EndIf
     
     
    Global screenW.l = GetSystemMetrics_(#SM_CXSCREEN)
    Global screenH.l = GetSystemMetrics_(#SM_CYSCREEN) 
     
    SetCurrentDirectory("media/") 
    ;////////////////////////////// Ajoute en mémoire un fichier compressé
    iAddZipFileArchive( "map-20kdm2.pk3" )
    ;////////////////////////////////////// Chargement d'un objet
    Global *obj.IObject = iLoad3DObject("20kdm2.bsp")
    ;////////////////////////////////////////// Creation d'un mesh avec l'objet chargé
    Global *mesh.IMesh = iCreateMesh(*obj)
    iScaleNode(*mesh, 1.5, 1.5, 1.5)
    ;/////////////////////////////////////// Creation et position de la camera
    Global *cam.ICamera = iCreateCamera()
    iPositionNode(*cam, 826, 550, 400)
    ;iRotateNode(*cam, 20,45, 0)
    ;///////////////////////////// Chargement du fond d'écran
    iLoadFont("courriernew.png")
    Global *font.IGUIFont = iGetFont()
    ;/////////////////////////////////// 
    SetCurrentDirectory("animations/")
    ;//////////////////////////////////////// Chargement du ninja
    Global *obj1.IObject = iLoad3DObject("ninja.b3d")
     
    ;////////////////////////// Position de la souris au milieu de la fenêtre
    iPositionCursor(0.5, 0.5)
    iVisibleCursorControl(#False) ;Souris invisible
    ;//////////////////////////////////////////////// Position des entitées
    iPositionNode(*cam, 820, 545, 395)
    ;iRotateNode(*cam, 20, 45, 0)
     
    ;/////////////////////////////////////////////// Animation du ninja
    *ninja.IAnimatedMesh = iCreateAnimation(*obj1)
    iSpeedAnimation(*ninja, 10) ;On change le nombre pour changer la vitesse des animations
    iRotateNode(*ninja, 20, 45, 0)
    iPositionNode(*ninja, -10, 0, 10)
     
    ;/////////////////////////////// Collision du ninja avec le monde
    *ninjaanim.IAnimatorCollisionResponse = iCreateCollisionResponseAnimator(*mesh, *ninja, 30, 50, 30, 0, 50, 0)
    iAddCollisionResponse(*ninja, *ninjaanim)
    ;///////////////////////////////////////// Creation de la collision de la camera
    *anim.IAnimatorCollisionResponse = iCreateCollisionResponseAnimator(*mesh, *cam, 30, 50, 30, 0, 50, 0)
    iAddCollisionResponse(*cam, *anim)
     
    ;////////////////////////////////////////
    ;           Boucle principale           /
    ;////////////////////////////////////////
     
    Repeat
     
     	;On bouge la camera avec les touches définis
      If iGetKeyDown(#KEY_ARROW_UP)
        iMoveNode(*cam, 0, 0, 5)
      EndIf
      ;//////
      If iGetKeyDown(#KEY_ARROW_DOWN)
        iMoveNode(*cam, 0, 0, -5)
      EndIf
      ;//////
      If iGetKeyDown(#KEY_ARROW_LEFT)
        iMoveNode(*cam, -5, 0, 0)
      EndIf
      ;//////
      If iGetKeyDown(#KEY_ARROW_RIGHT)
        iMoveNode(*cam, 5, 0, 0)
      EndIf
      ;//////
      If iGetKeyDown(#KEY_SPACE)
          iJumpCollisionResponse(*anim, 1.1)
      EndIf
     
      omx=iGetMouseX()-width/2
      omy=iGetMouseY()-height/2
      iPositionCursorControl(width/2,height/2)
      pitch=pitch+omy/10
      yaw=yaw-omx/10
      iRotateNode(*cam,pitch,-yaw,0)
     
     
      ;Quitte la fenêtre quand on appuit sur la touche Echap  	
      If iGetKeyDown(#KEY_ESCAPE)
        Quit=1
      EndIf
     
      iBeginScene(0, 0, 0)
        iDrawScene()
        iDrawText(*font, "Utilisez les flèches pour bouger et Espace pour sauter",  10,10,0,0)
      iEndScene()
     
     
    Until Quit=1
    ;///////////// Fin
    iFreeEngine()

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 45
    Points : 19
    Points
    19
    Par défaut SendNetworkFile/ReceiveNetworkFile
    Re bonjour,
    J'aimerais de même savoir comment fonctionne exactement les commandes SendNetworkFile et ReceiveNetworkFile car j'arrive a envoyer (côté serveur, il y a bien une notification comme quoi le fichier a été recus), mais il n'apparait pas dans le dossier specifié dans ReceiveNetworkFile(ClientID, "C:\System")
    Quelqun pourrait me donner un exemple de client/serveur ou un ptit fichier text et envoyable et recevable des 2 côté s'il vous plait merci

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 45
    Points : 19
    Points
    19
    Par défaut Network
    Oui, excusez-moi, je me suis tromper pour le message du ninja dans le chateau >< (que j'étais censé mettre dans la discussion de N3xt-d..)
    Donc, concernant les envois de fichiers, j'ai trouver la solution, comme quoi dans le SendNetworkFile, il faut juste préciser le fichiers à envoyer (on peut pas envoyer de dossier?), et dans le ReceivedNetworkFile, il faut juste preciser le dossier dans lequel il faut mettre les fichiers recus...

    Mon problème c'est que j'aimerais toujours savoir comment comparer les données recues par exemple, a une base de données local (donc en gros comment trier automatiquement par mon serveur les données recues des clients, et par la suite je saurais comment comparer les fichiers a ceux de la base de données)...

  5. #5
    Responsable Purebasic

    Avatar de comtois
    Inscrit en
    Avril 2003
    Messages
    1 262
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 1 262
    Points : 9 924
    Points
    9 924
    Billets dans le blog
    8
    Par défaut
    Mon problème c'est que j'aimerais toujours savoir comment comparer les données recues par exemple, a une base de données local (donc en gros comment trier automatiquement par mon serveur les données recues des clients, et par la suite je saurais comment comparer les fichiers a ceux de la base de données)...
    Les fonctions pour trier des données

    ReadData() pour lire les données d'un fichier

    CompareMemory()
    pour comparer les données lues avec ReadData()
    Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP.

  6. #6
    Responsable Purebasic

    Avatar de comtois
    Inscrit en
    Avril 2003
    Messages
    1 262
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 1 262
    Points : 9 924
    Points
    9 924
    Billets dans le blog
    8
    Par défaut
    une autre méthode pour comparer deux fichiers avec MD5FileFingerprint()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    ;#########################
    ;#     Compare The Files #
    ;# (p) 2010 quadWorks.de #
    ;#########################
     
    OpenWindow  (0,0,0,360,110,"Compare The Files", #PB_Window_WindowCentered | #PB_Window_ScreenCentered | #PB_Window_BorderLess)
    ButtonGadget(0, 10, 10,340, 24, ".. please chose a file ..")
    ButtonGadget(1, 10, 44,340, 24, ".. please chose a file ..")
    ButtonGadget(2, 82, 78, 70, 24, "Compare")
    TextGadget  (3,160, 84,300, 20, "Most likely different")
    ButtonGadget(4, 10, 78, 20, 24, "?", #PB_Text_Center)
    ButtonGadget(5, 36, 78, 40, 24, "Quit", #PB_Text_Center)
    LoadFont    (0, "Arial", 11)
    For i = 0 To 5 : SetGadgetFont(i,FontID(0)) : Next i
    AddKeyboardShortcut(0, #PB_Shortcut_Command | #PB_Shortcut_Q, #PB_Event_CloseWindow)
     
    Repeat
    Event = WaitWindowEvent(100)
    Select Event
      Case #PB_Event_Gadget
       Gadget = EventGadget()
      Select Gadget
       Case 0, 1
        temp$ = OpenFileRequester("Chose file", "", "", 0)
        If temp$ <> ""
         SetGadgetText(Gadget, "1. " + GetFilePart(temp$) + " - " + StrF(FileSize(temp$) / 1024, 3) + "kb - " + FormatDate("%yyyy-%mm-%dd %hh:%ii:%ss", GetFileDate(Temp$, #PB_Date_Modified)))
         If Gadget = 0
          MD5a$ = MD5FileFingerprint(temp$)
          fileA$ = temp$
         Else
          MD5b$ = MD5FileFingerprint(temp$)
          fileB$ = temp$               
         EndIf
         GadgetToolTip(Gadget, Temp$)
        EndIf
      Case 2
       If MD5a$ = "" Or MD5b$ = ""
        MessageRequester("Information", "Please select two files to compare.")
       Else
        If MD5a$ = MD5b$
         SetGadgetText(3, "Most likely identical")
        Else
         SetGadgetText(3, "Most likely different")
        EndIf
       EndIf
       Case 4 : MessageRequester("Information", "TinyCompare compares the MD5-fingerprints of two files. If the fingerprints are identical, the chance is high, that the two files are identical.")
      EndSelect
    EndSelect
    Until Event = #PB_Event_CloseWindow Or Event = #PB_Event_Menu Or Gadget = 5
    Source de l'information
    Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 45
    Points : 19
    Points
    19
    Par défaut Resolus
    Merci pour tes réponses (tu es bien le seul sur qui ce forum peut compter de par le manque de membres )

    Mon serveur est enfin complet
    A bientot

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 45
    Points : 19
    Points
    19
    Par défaut Le retour!
    Me revoila pour de nouvelles aven....
    Bref... de par les réponse que j'ai recues, j'ai pu avancer dans mes connaissances mais je bloque sur quelques commandes
    Comment faire pour comparer un fichier avec une chaine de caractère entrée par l'utilisateur (sachant que j'ai voulus comparer avec la methode de la memoire mais dans la plupart des cas je ne peux pas comparer a cause de l'erreur d'impossibilitée de comparaison de caractères avec des variables numeriques)
    Vous n'auriez pas quelques exemples sur cela?
    Merci d'avance

  9. #9
    Responsable Purebasic

    Avatar de comtois
    Inscrit en
    Avril 2003
    Messages
    1 262
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 1 262
    Points : 9 924
    Points
    9 924
    Billets dans le blog
    8
    Par défaut
    Ce qui serait bien, c'est que tu fasses une nouvelle discussion par problème ou thème différent avec un titre explicite.
    ça facilite les recherches pour ceux qui ont des problèmes similaires, ça fait moins fouilli, etc.
    Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 45
    Points : 19
    Points
    19
    Par défaut Commandes
    C'est vrai, c'est vrai ...

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 45
    Points : 19
    Points
    19
    Par défaut Identification client serveur (ConnectionID)
    Ce que je ne comprends pas, c'est comment faire pour differencier un client d'un autre, du serveur etc...
    Je sais que nous pouvons demander un pseudo mais je parle plutot du niveau ConnectionID (lors de l'initialisation de la connection)..
    Comment par exemple mp (=envoyer un message privé) à quelqun du tchat lorsque nous sommes connécté à un serveur??
    Je pense que tout est dans le ConnectionID mais j'aimerais faire cela pour plein de client utilisant le même logiciel téléchargé de tchat client..
    Enfin je ne suis pas sur que cela est au niveau du ConnectionID...
    Peut-être devrais je demander un nom d'utilisateur avec mot d'passe (comme un login)...
    Ou par un autre exemple, est-ce possible d'envoyer les données saisies directement vers le serveur?
    C'est flou, vague...

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 45
    Points : 19
    Points
    19
    Par défaut
    Yo!
    Bon, apres quelques semaines de recherches, il semblerais donc que le suel moyen de differencier un client d'un autre serait de l'appeller par son addresse ip unique, lors de sa connection au serveur (juste après le )...
    Sans la reconnaissance de chaque clients, il est impossible de faire tourner un reseau d'au moin 3 personnes
    De plus, il semblerait de même qu'on ne puisse absolument pas differencier les données [data] recues des caracteres [string] puisqu'ils sont recues par la même commande qu'est ReceiveNetworkData()

  13. #13
    Responsable Purebasic

    Avatar de comtois
    Inscrit en
    Avril 2003
    Messages
    1 262
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 1 262
    Points : 9 924
    Points
    9 924
    Billets dans le blog
    8
    Par défaut
    et quel genre de trame tu envoies ?
    Admettons que tu veuilles envoyer un texte et 3 données de type long, et soyons fous, 2 flottants

    Tu empiles tes données dans un buffer côté client , et le serveur devra dépiler. Pour ça il faut convenir des données à échanger. Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    ;Début du code client
    Structure toto
      entier1.l
      entier2.l
      entier3.l
      flottant1.f
      flottant2.f
    EndStructure
     
    Define Chaine.s
    Define Test.toto
    Test\entier1 = 5
    Test\entier2 = -876
    Test\entier3 = 912
    Test\flottant1 = 57.93
    Test\flottant2 = -254.21
     
    Chaine = "ceci est une chaine"
     
    ;Le buffer qui sera envoyé par le client au serveur
    *Buffer = AllocateMemory(500)
    *Ptr = *Buffer
     
    ;et on stocke nos données dans le buffer
    PokeS(*Ptr, Chaine)
    *Ptr + Len(Chaine)+1 ; + 1 pour le caractère de fin de chaine
     
    ;Et maintenant on écrit en bloc le reste des données
    CopyMemory(@Test, *Ptr, SizeOf(toto))
    ;Ici tu envoies ton buffer
     
    ;- fin de la partie client
     
    ;Je n'ai fait qu'une seul code, mais ça va de soi que tu séparera la partie client du serveur qui suit
     
    ;début de la partie serveur
     
    Define chaine2.s
    Define Reception.toto
    *Buffer2 = AllocateMemory(1000)
     
    *Ptr2 = *Buffer2
     
    ;ici tu réceptionnes les données brutes du client dans ton *buffer 
    CopyMemory(*Buffer, *Buffer2, MemorySize(*Buffer)) ; simule la réception des données tu mettras ton ReceiveData ici
     
     
    ;Récupère la chaine
    Chaine2 = PeekS(*Ptr2)
    *ptr2 + Len(chaine2) + 1
    CopyMemory(*Ptr2, @Reception, SizeOf(toto))
     
    ;Et maintenant on vérifie qu'on a bien réceptionné les données
    Debug chaine2
    Debug Reception\entier1
    Debug Reception\entier2
    Debug Reception\entier3
    Debug Reception\flottant1
    Debug Reception\flottant2
    Je ne fais jamais de réseau, c'est sûrement simpliste
    Si des spécialistes veulent intervenir qu'ils ne se gênent pas.
    Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP.

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 45
    Points : 19
    Points
    19
    Par défaut
    Je n'ai pas bien compris
    Immaginons que je veuille simplement envoyer 1 nombre et 2 chaines...

    Ca donnerait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    ;Le client:
    *Buffer=AllocateMemory(*Buffer, 100)
    nombre=10
    chaine$="charactere"
    chaine2$="2eme charactere"
    ;Puis on empile tous ca avec Poke... dans le *Buffer
    ;et on l'envois au serveur avec SendNetworkData()
    ;puis fin partie client.
     
    ;Le serveur:
    ReceiveNetworkData(ClientID, *Buffer, 100)
    ;puis recuperation des chaines et du nombre par Peek...
    ;et fin partie serveur.
    Mais je n'ai pas compris le dépilage...
    Et pour la distinction des clients?

  15. #15
    Responsable Purebasic

    Avatar de comtois
    Inscrit en
    Avril 2003
    Messages
    1 262
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 1 262
    Points : 9 924
    Points
    9 924
    Billets dans le blog
    8
    Par défaut
    Pour la distinction des clients, tu l'as dit toi même, c'est la fonction EventClient()
    Et tu peux créer plusieurs serveurs dans ton programme, dans ce cas il faudra tester EventServer() pour savoir quel serveur a reçu les données.

    Sinon qu'est-ce que tu ne comprends pas ? les pointeurs ? ou autre chose ? Quelle ligne du code te pose problème ?
    Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP.

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 45
    Points : 19
    Points
    19
    Par défaut
    En fait, EventCLient() ne sert que pour un client qui à déclenché un évènement sur le serveur.. ainsi le prochain client prend la place de l'ancien...

    Exemple: 1 serveur - 2 clients
    Le premier se connecte au serveur pour le chat..
    Le 2nd se connecte de même puis remplace ainsi le premier qui ne fait plus partis du chat puisque le serveur ne renvoit les caractères qu'au ClientID qui a était identifié par ClientID=EventClient()

    Donc, comment faire pour connaitre tous les clients du serveur et ainsi les distinguer...
    En creant un serveur a chque connection d'un client, qui echangera des données avec le serveur principals???

    Je ne sais pas

  17. #17
    Responsable Purebasic

    Avatar de comtois
    Inscrit en
    Avril 2003
    Messages
    1 262
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 1 262
    Points : 9 924
    Points
    9 924
    Billets dans le blog
    8
    Par défaut
    Pour tester j'ai modifié légèrement les exemples de la doc et ça fonctionne très bien, j'ai lancé 3 clients sur un serveur. Chaque client envoie une chaine toute les 20 secondes, et le serveur affiche ce qu'il reçoit, on voit bien que les messages proviennent des 3 clients.

    Ici le programme du serveur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    If InitNetwork() = 0
      MessageRequester("Error", "Can't initialize the network !", 0)
      End
    EndIf
     
    Port = 6832
    *Buffer = AllocateMemory(1000)
     
    If CreateNetworkServer(0, Port)
     
      MessageRequester("PureBasic - Server", "Server created (Port "+Str(Port)+").", 0)
     
      Repeat
     
        SEvent = NetworkServerEvent()
     
        If SEvent
     
          ClientID = EventClient()
     
          Select SEvent
     
            Case #PB_NetworkEvent_Connect
              MessageRequester("PureBasic - Server", "A new client has connected !", 0)
     
            Case #PB_NetworkEvent_Data
              MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has send a packet !", 0)
              ReceiveNetworkData(ClientID, *Buffer, 1000)
              MessageRequester("Info", "String: "+PeekS(*Buffer), 0)
     
            Case #PB_NetworkEvent_File
              MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has send a file via the network !", 0)
              ReceiveNetworkFile(ClientID, "C:\TEST_Network.ftp3")
     
            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.", 0)
     
      CloseNetworkServer(0)
    Else
      MessageRequester("Error", "Can't create the server (port in use ?).", 0)
    EndIf
     
     
    End
    Le programme du client 1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    If InitNetwork() = 0
      MessageRequester("Error", "Can't initialize the network !", 0)
      End
    EndIf
     
    Port = 6832
     
    ConnectionID = OpenNetworkConnection("127.0.0.1", Port)
    If ConnectionID
     
      Repeat
        If ElapsedMilliseconds()-time> 20000
          Time = ElapsedMilliseconds()
          c + 1
          SendNetworkString(ConnectionID, " An hello from a client 1 --> " + Str(c))
        EndIf  
      ForEver
     
      CloseNetworkConnection(ConnectionID)
    Else
      MessageRequester("PureBasic - Client", "Can't find the server (Is it launched ?).", 0)
    EndIf
     
    End
    Le programme du client 2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    If InitNetwork() = 0
      MessageRequester("Error", "Can't initialize the network !", 0)
      End
    EndIf
     
    Port = 6832
     
    ConnectionID = OpenNetworkConnection("127.0.0.1", Port)
    If ConnectionID
     
      Repeat
        If ElapsedMilliseconds()-time> 20000
          Time = ElapsedMilliseconds()
          c + 1
          SendNetworkString(ConnectionID, " An hello from a client 2 --> " + Str(c))
        EndIf  
      ForEver
     
      CloseNetworkConnection(ConnectionID)
    Else
      MessageRequester("PureBasic - Client", "Can't find the server (Is it launched ?).", 0)
    EndIf
     
    End
    Le programme du client 3

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    If InitNetwork() = 0
      MessageRequester("Error", "Can't initialize the network !", 0)
      End
    EndIf
     
    Port = 6832
     
    ConnectionID = OpenNetworkConnection("127.0.0.1", Port)
    If ConnectionID
     
      Repeat
        If ElapsedMilliseconds()-time> 20000
          Time = ElapsedMilliseconds()
          c + 1
          SendNetworkString(ConnectionID, " An hello from a client 3 --> " + Str(c))
        EndIf  
      ForEver
     
     CloseNetworkConnection(ConnectionID)
    Else
      MessageRequester("PureBasic - Client", "Can't find the server (Is it launched ?).", 0)
    EndIf
     
    End
    Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP.

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 45
    Points : 19
    Points
    19
    Par défaut
    Et comment le serveur ferait pour envoyer une chaine de charactères aux 3 client?
    Et est-ce possible de faire envoyer une chaine d'un client à un autre?
    Et enfin, est-ce possible de savoir combien de client sont connectés?

  19. #19
    Responsable Purebasic

    Avatar de comtois
    Inscrit en
    Avril 2003
    Messages
    1 262
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 1 262
    Points : 9 924
    Points
    9 924
    Billets dans le blog
    8
    Par défaut
    Et comment le serveur ferait pour envoyer une chaine de charactères aux 3 client?
    j'ai modifié le serveur pour qu'il renvoie au client les données qu'il vient de lui envoyer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    If InitNetwork() = 0
      MessageRequester("Error", "Can't initialize the network !", 0)
      End
    EndIf
     
    Port = 6832
    *Buffer = AllocateMemory(1000)
     
    If CreateNetworkServer(0, Port)
     
      OpenConsole()
      PrintN("PureBasic - Server : Server created ")
      Repeat
     
        SEvent = NetworkServerEvent()
     
        If SEvent
     
          ClientID = EventClient()
     
          Select SEvent
     
            Case #PB_NetworkEvent_Connect
              PrintN("PureBasic - Server : A new client has connected !")
     
            Case #PB_NetworkEvent_Data
              ReceiveNetworkData(ClientID, *Buffer, 1000)
              PrintN("PureBasic - Server  Client " + Str(ClientID)+" a envoye des donnees !")         
              PrintN("PureBasic - Server : donnees recues : "+PeekS(*Buffer))
              SendNetworkString(ClientID, " Le serveur a envoye --> " + PeekS(*Buffer))
     
            Case #PB_NetworkEvent_Disconnect
              PrintN("PureBasic - Server : Client "+Str(ClientID)+" has closed the connection...")
     
          EndSelect
        EndIf
     
      Until Quit = 1 
     
     
      CloseNetworkServer(0)
    Else
      MessageRequester("Error", "Can't create the server (port in use ?).", 0)
    EndIf
     
    CloseConsole()
     
    End
    Et j'ai modifié les clients pour qu'ils affichent les données reçues du serveur

    Client 1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    If InitNetwork() = 0
      MessageRequester("Error", "Can't initialize the network !", 0)
      End
    EndIf
     
    Port = 6832
    *Buffer = AllocateMemory(1000)
     
    ConnectionID = OpenNetworkConnection("127.0.0.1", Port)
    If ConnectionID
      OpenConsole() 
     
      Repeat
        SEvent = NetworkClientEvent(ConnectionID)
     
        If SEvent
     
           Select SEvent
     
            Case #PB_NetworkEvent_Data
              PrintN("Client 1 --> Le serveur a envoye des donnees !")
              ReceiveNetworkData(ConnectionID, *Buffer, 1000) 
              PrintN("Client 1 a recu --> " + PeekS(*Buffer))
     
          EndSelect
        EndIf
     
        If ElapsedMilliseconds()-time> 20000
          Time = ElapsedMilliseconds()
          c + 1
          SendNetworkString(ConnectionID, " An hello from a client 1 --> " + Str(c))
        EndIf  
     
      ForEver
     
      CloseNetworkConnection(ConnectionID)
    Else
      MessageRequester("PureBasic - Client", "Can't find the server (Is it launched ?).", 0)
    EndIf
     
    CloseConsole()
     
    End
    Le code devrait être identique pour les autres clients mais pour bien distinguer un client d'un autre sur mon pc, j'ai adapté les textes pour le client 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    If InitNetwork() = 0
      MessageRequester("Error", "Can't initialize the network !", 0)
      End
    EndIf
     
    Port = 6832
    *Buffer = AllocateMemory(1000)
     
    ConnectionID = OpenNetworkConnection("127.0.0.1", Port)
    If ConnectionID
      OpenConsole() 
     
      Repeat
        SEvent = NetworkClientEvent(ConnectionID)
     
        If SEvent
     
          Select SEvent
     
            Case #PB_NetworkEvent_Data
              PrintN("Client 2 --> Le serveur a envoye des donnees !")
              ReceiveNetworkData(ConnectionID, *Buffer, 1000) 
              PrintN("Client 2 a recu --> " + PeekS(*Buffer))
     
          EndSelect
        EndIf
     
        If ElapsedMilliseconds()-time> 20000
          Time = ElapsedMilliseconds()
          c + 1
          SendNetworkString(ConnectionID, " An hello from a client 2 --> " + Str(c))
        EndIf  
     
      ForEver
     
      CloseNetworkConnection(ConnectionID)
    Else
      MessageRequester("PureBasic - Client", "Can't find the server (Is it launched ?).", 0)
    EndIf
     
    CloseConsole()
     
    End
    Et est-ce possible de faire envoyer une chaine d'un client à un autre?
    Faut que tu regardes du côté du peer to peer ? Aucune idée de la façon dont il faut procéder !
    Et enfin, est-ce possible de savoir combien de client sont connectés?
    Peut-être avec une table de hachage (map) ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      NewMap ListeDesClients.l()
     
      Clef.s = Str(ClientID)
      ListeDesClients(Clef) = ClientID
     
      ;Affiche le nombre de clients
      Debug MapSize(ListeDesClients())
    Tu utilises le numéro du client comme clef de ta table.
    Et quand un client se déconnecte tu le retires de la liste.

    Pour connaitre le nombre de clients, tu as juste à tester MapSize().
    Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 25/07/2013, 16h21
  2. Différence poste serveur/client au niveau hardware et OS
    Par drinkmilk dans le forum Ordinateurs
    Réponses: 5
    Dernier message: 07/04/2005, 16h43
  3. Connection Serveur Client
    Par d.w.d dans le forum C++
    Réponses: 16
    Dernier message: 21/02/2005, 11h17
  4. Serveur/Client sous linux
    Par black is beautiful dans le forum Réseau
    Réponses: 2
    Dernier message: 13/08/2004, 13h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo