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
|
#include "PcServeur.h"
using namespace std;
using namespace Outils;
using namespace cimg_library;
ReceiveImages::ReceiveImages(std::string p_nom, IProtocole *p_p,
unsigned long intsize, unsigned int p_width, unsigned int p_height,
ITache *p_tacheSendMessages){
nom=p_nom;
assert(p_p!= NULL && p_tacheSendMessages!= NULL);
p=p_p;
width=p_width;
height=p_height;
tacheSendMessages=p_tacheSendMessages;
this->intsize=intsize;
reception = new JOCTET[CENT_KILO];
if (reception == NULL)
throw COutOfMemory("L'allocation du buffer de reception des images a échouée.");
}
ReceiveImages::~ReceiveImages(){
delete[] reception;
}
void ReceiveImages::toDo(){
const unsigned char red[] = { 255,0,0 };
const unsigned char blue[] = { 0,155,255 };
int i=0;
size_t sz=0;
int jpegfilesize=0, datesize=0;
char date[50];
unsigned int dimX = width, dimY = height;
CImg<unsigned char> imageCourante, affichage(dimX, dimY, 1, 3, 255);
CImgDisplay disp(affichage,"Live view : ");
disp.close();
while(1){
//On attend des données pendant une 300 milliseconde. Si on a pas de
//données, on ferme la fenêtre d'affichage
if ( ! p->waitData(0,300) ) disp.close();
//et on attend infiniment des données :
if (p->waitData(-1) ){
disp.show();
//reception de la taille du fichier jpeg :
jpegfilesize=0;
p->receiveInteger( intsize, &jpegfilesize, &sz);
}
//reception du fichier :
if ( p->waitData(1) ){
p->receive(jpegfilesize, reception , &sz);
cout << "Image n°"<< i++ <<" Taille reçue : "<< sz <<
" Taille attendue : "<< jpegfilesize << endl;
//chargement de l'image jpeg recu, grace au plugin jpeg_buffer :
imageCourante.load_jpeg_buffer( reception, jpegfilesize);
}
//on passe l'image en 3 channels (RGB) pour avoir les couleurs..... :
affichage = imageCourante;
affichage.resize(dimX,dimY,1,3);
//affichage du nb de frames par secondes :
affichage.draw_text(5,5,"%u frames/s",red,0,1,18,
(unsigned int)disp.frames_per_second());
disp << affichage;
}
}
SendMessages::SendMessages(std::string p_nom, IProtocole *p_p, unsigned long intsize){
nom=p_nom;
assert(p_p != NULL );
p=p_p;
this->intsize=intsize;
}
void SendMessages::toDo(){
string mess;
do{
//tache d'envois des messages au client
cin >> mess;
p->sendInteger( mess.size(), intsize);
p->send( (const char *) mess.c_str(), mess.size() );
}
while(mess != "exit");
}
int main(int argc, char* argv[]) {
if (argc!=2) {
printf("Usage : %s <port>",argv[0]);
exit(EXIT_FAILURE);
}
ILogger *logger = new CLoggerConsole();
ILogger::SetLogger(logger);
//Etablissement du serveur
IProtocole *p = new ProtocoleTCP();
p->connect(std::string("tagada"), atoi(argv[1]) ,false);
p->printInfo();
//Attente de données pendant 30 secondes
p->waitData(30);
int width=0, height=0;
unsigned long intsize=0;
size_t recu=0;
//Reception de la taille d'un int, en octet
p->receive( sizeof(char), (unsigned char*) &intsize, &recu);
std::cout << "Taille d'un int en octets : " << intsize << std::endl;
recu=0;
//Reception de largeur des images:
p->waitData(1);
p->receiveInteger( intsize, &width, &recu);
std::cout << "Largeur des images à recevoir : " << width<< std::endl;
recu=0;
//Reception de hauteur des images :
p->waitData(1) ;
p->receiveInteger( intsize, &height, &recu);
std::cout << "Hauteur des images à recevoir : " << height<< std::endl;
recu=0;
/*-------------------------------------------------------------------------
* Création et lancement des deux taches :
*-------------------------------------------------------------------------*/
ITache *tacheStdin = new SendMessages("Tâche d'envois des messages",
p, intsize);
ITache *tacheReception = new ReceiveImages("Tâche de réception des images.",
p, intsize, width, height, tacheStdin);
tacheStdin->start();
tacheReception->start();
do {
MSLEEP(300);
}
while( tacheStdin->isRunning() );
tacheReception->stop();
delete tacheReception;
delete tacheStdin;
//laisse le tps au client de se déconnecter
sleep(2);
//fermer le serveur
p->disconnect();
delete p;
delete logger;
return EXIT_SUCCESS;
} |