S
Damit kannst du die Dateien schicken.
Server:
Du brauchst:OpenDialog1 (TOpenDialog), Server (TServerSocket), Memo1 (TMemo) und zwei Buttons.
Zu erst stellen wir den Serverkomponent in Object Inspector ein:
Port = 1001 ;
Active = false ;
//---------------------------------------------------------------------------
TForm1 *Form1;
TMemoryStream *MS = new TMemoryStream ;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerAccept(TObject *Sender,
TCustomWinSocket *Socket)
{
Memo1->Lines->Add("Connected");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerClientError(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
ErrorCode = 0 ;
ShowMessage("Server Error");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Server->Active = true ;
Server->Open() ;
Memo1->Lines->Add("Server is created");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
Server->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
void *P;
int Size ;
if(OpenDialog1->Execute())
{
MS->LoadFromFile(OpenDialog1->FileName);
Memo1->Lines->Add("File was loaded...");
}
Server->Socket->Connections[0]->SendText("file#"+OpenDialog1->FileName+"#"+IntToStr(MS->Size)+'#');
Memo1->Lines->Add("Information about the file was sent");
MS->Position = 0 ;
P = MS->Memory ;
Size = Server->Socket->Connections[0]->SendBuf(P,MS->Size);
Memo1->Lines->Add("Was sent: " + IntToStr(Size)+" from "+ IntToStr(MS->Size));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
if(Server->Socket->Connections[0]->ReceiveText()=="end")
{
Memo1->Lines->Add("Client has received the file");
MS->Clear() ;
}
}
Client:
in .h (Header):
private:
AnsiString Name;
in cpp:
Du brauchst: Client (TClientSocket) , Memo1 (TMemo), SaveDialog1 (TSaveDialog) und Button1 (TButton)
Client Optionen:
Port = 1001 ;
Active = false ;
Address = 127.0.0.1 ; //Zum Testen benutzen wir locale IP Adresse
Host = 127.0.01 ;
TForm1 *Form1;
TMemoryStream *MS = new TMemoryStream ;
void Write(AnsiString Text);
int Size ;
bool Receive ;
AnsiString FileName ;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void Write(AnsiString Text)
{
if(MS->Size < Size)
{
MS->Write(Text.c_str(),Text.Length());
Form1->Memo1->Lines->Add("Receiving data");
}
if(MS->Size == Size)
{
Receive = false ;
MS->Position = 0 ;
Form1->Client->Socket->SendText("end");
CreateDir("Downloads");
MS->SaveToFile("Downloads\\"+FileName);
MS->Clear() ;
Size = 0 ;
Form1->Memo1->Lines->Add("Die Datei ist da!!!");
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ClientConnect(TObject *Sender,
TCustomWinSocket *Socket)
{
Memo1->Lines->Add("Is connected ");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ClientError(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
ErrorCode = 0;
ShowMessage("Client Error");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Client->Open() ;
Memo1->Lines->Add("Trying to connect");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
AnsiString Rtext ;
Rtext = Client->Socket->ReceiveText() ;
if(Receive == true)
{
Write(Rtext);
}
else
{
Memo1->Lines->Add("Received text" + Rtext);
if(Rtext.SubString(0,Rtext.Pos("#")-1) == "file")
{
Rtext.Delete(1,Rtext.Pos("#")) ;
Name = Rtext.SubString(0,Rtext.Pos("#")-1);
FileName = Name.SubString(Name.LastDelimiter("\\")+1,Name.Length()); ;
Rtext.Delete(1,Rtext.Pos("#")) ;
Size = StrToInt(Rtext.SubString(0,Rtext.Pos("#")-1)) ;
Rtext.Delete(1, Rtext.Pos("#"));
Memo1->Lines->Add("Die Datei ist "+IntToStr(Size)+" groß");
Memo1->Lines->Add("Die Datei heißt: "+Name);
Receive = true;
}
}
}
//---------------------------------------------------------------------------
Wenn es etwas nicht klar ist, werde ich die detalierte Beschreibung machen.
Aber ich denke, dass die Sourcen lesbar sind.
Grüß,
Sergey.