ServerSocket et ClientSocket sur le même programme
Bonjour
Voila En TP dans mon BTS IRIS on a fait un programme Client/Serveur
1 application pour le client et 1 pour le serveur
Moi j'ai envie de faire les deux Serveur et Client sur le même mais je n'arrive pas
j'ai essayer de deux manière mais je n'ai pas réussi
Voila j'aimerais savoir comment on peut faire et si c'est possible je vous expose mon code ou il ne marche pas car l'autre il marche mais sa me mais n'importe koi
car quand on veut prendre des informations ou en envoyer je faisait
Socket->Address mais la il y a les deux donc j'ai mis a la place les composant important mais bon sa ne fonctionne pas
Voila mon codage
Ihm.h
Code:
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
|
// Fichier "UntPrinc.h" Version 3.0 Créé le 11/03/08 par Vandomme
// Classe associée à UntPrinc
//
//---------------------------------------------------------------------------
#ifndef UntPrincH
#define UntPrincH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
#include <ScktComp.hpp>
//---------------------------------------------------------------------------
class TFPrinc : public TForm
{
__published: // Composants gérés par l'EDI
TEdit *EdtMessageRecu;
TServerSocket *ServerSocket;
TButton *BtnLancerServeur;
TButton *BtnFermerServeur;
TStatusBar *StatusBarServeur;
TGroupBox *GpBoxClients;
TEdit *EdtIP;
TEdit *EdtPort;
TEdit *EdtNomMachine;
TEdit *EdtNbClients;
TLabel *LblNbClients;
TLabel *LblMessageRecu;
TLabel *LblIP;
TLabel *LblPort;
TLabel *LblNom;
TLabel *LblMessageAEnvoyer;
TEdit *EdtMessageAEnvoyer;
TButton *BtnEcrire;
TButton *BtnQuitter;
TLabel *LbllPortDuServeur;
TEdit *EdtPortDuServeur;
TClientSocket *ClientSocket;
void __fastcall BtnLancerServeurClick(TObject *Sender);
void __fastcall BtnFermerServeurClick(TObject *Sender);
void __fastcall ServerSocketClientConnect(TObject *Sender,
TCustomWinSocket *Socket);
void __fastcall ServerSocketClientDisconnect(TObject *Sender,
TCustomWinSocket *Socket);
void __fastcall ServerSocketClientRead(TObject *Sender,
TCustomWinSocket *Socket);
void __fastcall EdtMessageAEnvoyerClick(TObject *Sender);
void __fastcall BtnQuitterClick(TObject *Sender);
void __fastcall BtnEcrireClick(TObject *Sender);
private: // Déclarations de l'utilisateur
int nbClients ; //Nombres de clients connecté au serveur
public: // Déclarations de l'utilisateur
__fastcall TFPrinc(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TFPrinc *FPrinc;
//---------------------------------------------------------------------------
#endif
// -------------------- Fin du fichier UntPrinc.h --------------------------- |
Ihm.cpp
Code:
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 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
|
/*******************************************************************************
* NOM : UntPrinc.cpp
* TYPE : DEPENDANCE de l'application "PrjServeur.cpp"
* DESCRIPTION : Serveur socket
*
* AUTEURS : Vandomme
* VERSION : 3.0
* CREATION : 12/03/08 DER. MODIF. : 12/03/08
*
* DOSSIER TRAV. : U:\ClientServeur\BuilderDeux\ServeurDeux
*
* CONTRAINTES : EDI BORLAND C++ Builder 6.Langage C++
* Cibles PC sous WINDOWS XP Pro
* Matériel : PC Pentium 4
*
*******************************************************************************
*/
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "UntPrinc.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFPrinc *FPrinc;
//---------------------------------------------------------------------------
__fastcall TFPrinc::TFPrinc(TComponent* Owner)
: TForm(Owner)
{
nbClients = 0 ; //Par defaut, le nombre de client est à 0
}
//---------------------------------------------------------------------------
void __fastcall TFPrinc::BtnLancerServeurClick(TObject *Sender)
{
//Cette fonction permet de démarrer le serveur.
int port ;
if(EdtPortDuServeur->Text == "") {
ShowMessage("Entrez un port") ;
EdtPortDuServeur->SetFocus() ;
}else{
port = EdtPortDuServeur->Text.ToInt() ;
EdtMessageRecu->Clear() ;
ServerSocket->Port = port ;
ServerSocket->Open() ; //On ouvre une socket, ensuite on ecoute
if(Active == true) {
//Si le serveur est demarré, on modifie l'IHM.
BtnFermerServeur->Enabled = true ;
BtnLancerServeur->Enabled = false ;
StatusBarServeur->SimpleText = "Aucun Client connecté, serveur en attente" ;
EdtNbClients->Text = "Aucun Client connecté" ;
BtnEcrire->Enabled = true ;
}else {
//Sinon, modification de la barre de statut
StatusBarServeur->SimpleText = "Echec Connexion" ;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TFPrinc::BtnFermerServeurClick(TObject *Sender)
{
EdtMessageRecu->Clear() ;
if(ServerSocket->Active == true) {
//Si la serveur est démarré, on ferme la connexion et on modifie l'IHM.
ServerSocket->Close() ;
BtnFermerServeur->Enabled = false ;
BtnLancerServeur->Enabled = true ;
BtnEcrire->Enabled = false ;
StatusBarServeur->SimpleText = "Fermeture du serveur" ;
StatusBarServeur->SimpleText = "Serveur non démarré" ;
EdtIP->Clear() ;
EdtPort->Clear() ;
EdtNomMachine->Clear() ;
EdtNbClients->Clear() ;
}
}
//---------------------------------------------------------------------------
void __fastcall TFPrinc::ServerSocketClientConnect(TObject *Sender,
TCustomWinSocket *Socket)
{
/*Cette fonction est appelée lorsqu'un client se connecte au serveur
On modifie l'IHM en conséquence.*/
nbClients ++ ;
if(nbClients == 1) {
StatusBarServeur->SimpleText = (AnsiString)nbClients + " Client connecté" ;
EdtNbClients->Text = (AnsiString)nbClients + " Client connecté" ;
BtnFermerServeur->Enabled = false ;
ServerSocket->Socket->SendText("Bienvenue sur le serveur") ;
//Informations du serveur
GpBoxClients->Visible = true ;
EdtIP->Text = ServerSocket->Socket->RemoteAddress ; //Adresse IP du client
EdtPort->Text = ServerSocket->Socket->RemotePort ; //Port utilisé par le client
EdtNomMachine->Text = ServerSocket->Socket->RemoteHost ; //Nom de la machine du client
//Connection avec le client
ClientSocket->Address = ServerSocket->Socket->RemoteAddress ;
ClientSocket->Port = ServerSocket->Socket->RemotePort ;
ClientSocket->Open() ;
LblMessageAEnvoyer->Visible = true ;
EdtMessageAEnvoyer->Visible = true ;
BtnEcrire->Visible = true ;
}
}
//---------------------------------------------------------------------------
void __fastcall TFPrinc::ServerSocketClientDisconnect(TObject *Sender,
TCustomWinSocket *Socket)
{
//La fonction est appelée quand le client se deconnecte du serveur.
nbClients -- ;
StatusBarServeur->SimpleText = "Fermeture d'une connexion cliente" ;
if(nbClients == 0) {
//Si il n'y a plus de clients connectés
StatusBarServeur->SimpleText = "Aucun Client connecté, serveur en attente" ;
EdtNbClients->Text = "Aucun Client connecté" ;
BtnFermerServeur->Enabled = true ;
EdtIP->Clear() ;
EdtPort->Clear() ;
EdtNomMachine->Clear() ;
EdtMessageAEnvoyer->Clear() ;
EdtMessageRecu->Clear() ;
GpBoxClients->Visible = false ;
}else{
//On affiche le nombre de clients connecté grâce au compteur
StatusBarServeur->SimpleText = (AnsiString)nbClients + " Client connecté" ;
EdtNbClients->Text = (AnsiString)nbClients + " Client connecté" ;
EdtIP->Text = ServerSocket->Socket->RemoteAddress ; //Adresse IP du client
EdtPort->Text = ServerSocket->Socket->RemotePort ; //Port utilisé par le client
EdtNomMachine->Text = ServerSocket->Socket->RemoteHost ; //Nom de la machine du client
}
}
//---------------------------------------------------------------------------
void __fastcall TFPrinc::ServerSocketClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
/*Cette fonction est applée lorsqu'un client envoi un message au serveur, donc
le serveur le reçoi et l'affiche puis envoie au client un accusé de réception
*/
// AnsiString message ;
EdtMessageRecu->Text = ServerSocket->Socket->ReceiveText() ; //Réception du message du client
ServerSocket->Socket->SendText("Message bien reçu") ;
StatusBarServeur->SimpleText = "Réception du message client" ;
EdtIP->Text = ServerSocket->Socket->RemoteAddress ; //Adresse IP du client
EdtPort->Text = ServerSocket->Socket->RemotePort ; //Port utilisé par le client
EdtNomMachine->Text = ServerSocket->Socket->RemoteHost ; //Nom de la machine du client
/*Envoi de l'accusé de réception*/
StatusBarServeur->SimpleText = "Envoi de l'accusé de réception" ;
}
//---------------------------------------------------------------------------
void __fastcall TFPrinc::EdtMessageAEnvoyerClick(TObject *Sender)
{
EdtMessageAEnvoyer->Clear() ;
}
//---------------------------------------------------------------------------
void __fastcall TFPrinc::BtnQuitterClick(TObject *Sender)
{
if(nbClients == 0) {
Close() ;
}else{
ServerSocket->Close() ;
Close() ;
}
}
//---------------------------------------------------------------------------
void __fastcall TFPrinc::BtnEcrireClick(TObject *Sender)
{
/*Cette fonction permet d'envoi un message au serveur si il est connecté et si
le socket du client est connecté*/
/* if(ServerSocket->Active == true) {
//Si connexion active
ServerSocket->SendText(EdtMessageAEnvoyer->Text) ; //Envoi du message
// ServerSocket->
StatusBarServeur->SimpleText = "Message Envoyé" ;
} */
}
//--------------------------------------------------------------------------- |
Donc voila
Je vous remercie de votre aidez en avance
Cordialement Arnaud