Przesyłanie plików binarnych przez INDY [BCB]

0

Witam wszystkich,
Dotychczas pisząc aplikacje sieciowe mysyłałem tylko sam tekst, ale kiedys musiała przyjśc chwila, kiedy tzreba będzie przesłać JPG'a. Wykorzystałem do tego komponenty INDY (często piszą, że są lepsze od zwykłych TSerwerSocket).

korzystając głównie ze strony http://delphi.ktop.com.tw/topic.asp?TOPIC_ID=64898 stworzyłem coś takiego:

Serwer (mający wysłać plik)

void __fastcall TForm1::IdTCPServer1Execute(TIdPeerThread *AThread)
{
int i = AThread->Connection->ComponentIndex-1;
if (sendfile)
        {
         TFileStream* fs = new TFileStream(sendfiledir, fmOpenRead);
         int a = fs->Size;
         AThread->Connection[i].WriteLn(">>"+IntToStr(a));
         AThread->Connection->WriteStream(fs,true,true) ;
         sendfile = false;
        }
}
void __fastcall TForm1::Button6Click(TObject *Sender)
{
if (OpenDialog1->Execute())
        {
        sendfiledir = OpenDialog1->FileName;
        sendfile = true;
        }
}

//Klient (odbierający dane)
void __fastcall TForm1::Button5Click(TObject *Sender)
{
TMemoryStream* fs = new TMemoryStream();
IdTCPClient1->ReadStream(fs ,-1,false);
 delete fs;
}

Cały problem polega na tym, że po naciśnięciu Przycisku 5 cały program się zawiesza. Kiedy zamiast TMemoryStream użyje TFileStream plik ma poprawną wielkość, ale nic nie zawiera.

Z początku robiłem równiez coś takiego:

AnsiString ln = ListBox2->Items->Strings[ListBox2->Items->Count - 1];
 ln = ln.SubString(3,ln.Length()-2);
int size = StrToInt(ln);
IdTCPClient1->ReadStream(fs ,ln,false);

ale z tym też różnie bywało. Jedno jest wspólne: aplikacja zawsze sie zawiesza a plik nie jest do końca poprawny. Co z tym mozna zrobić? Wielkie dzięki za wszelka pomoc!!

Pozdrawiam.

0

Może przynajmniej jak umożliwić korzystanie kilku klientom z jednego serwera?
kiedy pisze

AThread->Connection->WriteLn(">>"+Edit1->Text);

to wiadomość otrzymuje tylko ten, który sie pierwszy podłączył.

Próbowałem też tak:

int i = AThread->ThreadID ;
AThread[i].Connection->WriteLn(">>"+Edit1->Text);

i tak

int i = AThread->ThreadID ;
AThread->Connection[i].WriteLn(">>"+Edit1->Text);

Potem też ta :

int i = IdTCPServer1->Bindings->Items->ID

ale nic z tego nie wychodzi połączenie ma tylko ten pierwszy.
Chciałem zobaczyć jak to działa na projektach ściągniętych ze strony INDY i tam korzystają ze stworzonej przez siebie klasy klienta, czy udało sie to komuś ominąć?

1 użytkowników online, w tym zalogowanych: 0, gości: 1