streaming : TidTCPServer/TidTCPClient
salut à toutes et tous,
a l'aide du composant :
TidTCPClient nomé tcp dans le code sendstr ( code d'envoie)
TidTCPServer nomé tcp dans le code sendstr ( code reception)
je ne parvient pas a s'avoir qu'elle est le poste qui envoie !!!
au depart c'etait juste d'un poste vers un autre, mais je voudrai faire en sorte
que je puisse afficher les images (printscreen) de tout les ecrans du reseau sur mon ecran serveur. (programmation dynamique)
un seul detail me manque c'est la provenance !!
je ne veux pas creer un composant TidTCPServer pour chaque poste client dans mon programme serveur, car je ne connait pas d'avance le nombre de poste client, meme si je sais que c'est un maximum de 255 pc !
avec les composants socket c'est simple mais j'ai pas pu resussir a envoier un stream !
Code:
1 2 3
| //reception socket server et client
void __fastcall TForm1::SocketRead(TObject *Sender,
TCustomWinSocket *Socket) |
en lisant les valeur de Socket on obtient tout les info de l'expediteur
mais avec ca j'ai aucune info !!
Code:
1 2
| //reception TidTCPServer
void __fastcall TForm8::tcpExecute(TIdPeerThread *AThread) |
qui a une idée ?
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
| //*****************************************
// CODE D ENVOIE
//*****************************************
void TForm1::sendstr()
{
TMemoryStream *stream = new TMemoryStream();
TJPEGImage *jpg = new TJPEGImage();
Graphics :: TBitmap *bmp = new Graphics :: TBitmap();
TRect *rect = new TRect();
TPicture *img = new TPicture();
img->Bitmap->Height = Screen->Height;
img->Bitmap->Width = Screen->Width;
int scrw = Screen->Width, scrh = Screen->Height;
HWND hwnd = GetDesktopWindow();
HDC hDC = GetDC(hwnd);
BitBlt(img->Bitmap->Canvas->Handle,0,0,scrw,scrh,hDC,0,0,SRCCOPY);
try
{
jpg->Assign(img->Bitmap);
jpg->CompressionQuality = 15; // qualitie d'image voire propriéte
bmp->Width = jpg->Width -50;
bmp->Height = jpg->Height -50;
rect->Left = 0;
rect->Top = 0;
rect->Right = bmp->Width-1;
rect->Bottom = bmp->Height-1;
bmp->Canvas->StretchDraw(*rect,jpg);
jpg->Assign(bmp);
jpg->SaveToStream(stream);
jpg->Free();
bmp->Free();
}
catch (...){}
try
{
tcp->OpenWriteBuffer();
tcp->WriteStream(stream);
tcp->CloseWriteBuffer();
stream->Free();
tcp->Disconnect();
}
catch(...){}
}
//*****************************************
// CODE RECEPTION
//*****************************************
void __fastcall TForm8::tcpExecute(TIdPeerThread *AThread)
{
TMemoryStream *stream = new TMemoryStream();
TJPEGImage *jpg = new TJPEGImage();
AThread->Connection->ReadStream(stream, -1, true);
stream->Position =0;
jpg->LoadFromStream(stream);
Form5->espion->Picture->Graphic = jpg;
stream->Free();
jpg->Free();
//****************************** |
grace a cette methode j'ai pu modifier mon ancien code qui lisait le fichier en binaire et que j'envoyais trame par trame pour le reconstituer au serveur.
parfois l'image etait floue et c'etait lent pour une parfaite qualité
ancien code quant meme :
il permet d'envoyer n'importe qu'elle un fichier d'un pc a un autre via socket
en lisant le contenu du fichier et l'envoi de cette lecture.
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
| //lecture binaire et envoie a l'aide d'un timer
//**********************************
void __fastcall TForm1::FCTTimer(TObject *Sender)
{
static int temp=0;
// On envoi le fichier tant qu'on est pas a la fin
if(!feof(FichierEnvoi))
{
info_send->Caption = "Envoi en cours....";
memset(buf2, 0, SIZE); // vider le vecteur buf2
fread(buf2, 1, SIZE, FichierEnvoi); lecture du fichier et copie dans buf2
sec = (sec + FCT->Interval);
if(sec==1000) { sec=0; min++; }
if(min==60) { her++; min=0; }
timer->Caption = AnsiString(her) + ":" + AnsiString(min);// + ":" + AnsiString(sec);
Client->Socket->SendBuf(buf2,SIZE);
}
else
{ FCT->Enabled = false;
temp = 0; sec=min=her=0;
fclose(FichierEnvoi);
Client->Socket->SendBuf("End_File",10);
info_send->Caption = "Envoi Terminé";
}
}
//*************************
//*************************
//reception fichier via socket
void __fastcall TForm8::SocketClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
memset(buf, 0, 2048);
Socket->ReceiveBuf(buf,2048); // message envoyé par un pc distant
if( strstr(buf,"Start_File")!=NULL ) // Start_File == code debut d'un envoi
{ DeleteFile(chemin.c_str()); // efface de l'ancier fichier recu
Form5->WAIT->Visible=true; // image indiquant qu'on recoit qqch
char *ptr; ptr = strtok(buf,"-");// selon mon protocol d'envoi
chemin = "c:\\" + AnsiString(ptr);// nom du fichier expediteur
FichierRecu = fopen(chemin.c_str(), "ab");// ecriture binaire
return;
}
if( strcmp(buf,"End_File")!=0 ) // tanqu'on recoi pas le code de fin
{ if(FichierRecu!=NULL)
fwrite(buf, 1, 2048,FichierRecu); // ecriture dans un fichier en bianire
}
else
{ fclose(FichierRecu);
Form5->WAIT->Visible=false; // contenu du ficher envoye termine
}
//************************* |
comment mettre des petit projet sur ce site ? si ca interresse qqn ?
merci d'avance
@+