Avatar billede cautoo Nybegynder
01. juni 2003 - 17:20 Der er 14 kommentarer og
1 løsning

Socket filoverføring

Jeg er ved at lave et program til at overfører filer med, til dette har jeg valgt at bruge TClientSocket og TServerSocket men jeg kan ikke få det til at virke... jeg ved ikke hvad der går galt, scriptet sender 2kb af gangen og fylder scriptet under 2kb virker det men ellers ikke.

Clientprogram:
på formen har jeg indsat:
    Button1: TButton;
    ClientSocket1: TClientSocket;
    OpenDialog1: TOpenDialog;
    ProgressBar1: TProgressBar;
    Label1: TLabel;
kode: http://mad.cautoo.dk/client.txt

Serverprogram:
på formen har jeg indsat:
    ServerSocket1: TServerSocket;
    SaveDialog1: TSaveDialog;
    ProgressBar1: TProgressBar;
    Label1: TLabel;
kode: http://mad.cautoo.dk/server.txt
Avatar billede vic256 Nybegynder
02. juni 2003 - 14:51 #1
Hmm .. HAr ikke nærlæst det, men det er påfaldende at din buffer har samme størrelse som din uønskede begrænsning 2048 lang Char / 2KB / 2048 Bytes...
Avatar billede cautoo Nybegynder
02. juni 2003 - 15:20 #2
ja du har ret, det hænger sammen, jeg sender nemlig 2kb af gangen, men af en eller anden grund så modtager jeg ikke det jeg gerne vil
Avatar billede vic256 Nybegynder
02. juni 2003 - 15:27 #3
Du siger "af gangen", men er du sikker på at løkken der smækker 2KB afsted fra bufferen af gangen, rent faktisk kører mere end 1 gang?
Avatar billede cautoo Nybegynder
02. juni 2003 - 16:18 #4
ja, det gør jeg, grunden til det er at så har jeg mulighed for at se hvor meget der er sendt/modtaget
Avatar billede siz23 Nybegynder
03. juni 2003 - 14:13 #5
første ting jeg lige faldt over (har ikke noget med overstående at gøre).
mangler CloseFile(); + hvorfor reset(), når du bare skal have filstørelsen.


<-----------ud træk fra clienten------------------->
procedure TForm1.Button1Click(Sender: TObject);
var
  FromF: file;
begin
  if opendialog1.Execute then
  begin
    AssignFile(FromF, opendialog1.FileName);
    Reset(FromF, 1);
    ClientSocket1.Socket.SendText(IntToStr(filesize(FromF)));
  end;
end;
<---------------------------------------------------------------->
Avatar billede siz23 Nybegynder
03. juni 2003 - 14:27 #6
til dit endelige problem, så når du reciever. Har du ikke nogle løkke så den henter kun data EN gang. præcis som vic256 sagde.
Avatar billede siz23 Nybegynder
03. juni 2003 - 14:47 #7
err... glem lige overstående besked. ;)
Avatar billede cautoo Nybegynder
03. juni 2003 - 16:08 #8
hmm... jeg ved godt min filkode ting ikke er den bedste, men jeg har ikk brugt det der læs/skriv til fil før, plejer at bruge TtringList. :/

Kan du hjælpe med selve problemet?
Avatar billede siz23 Nybegynder
06. juni 2003 - 14:08 #9
ok der er nogle ting du nok lige burde kigge på.

(i server'en)
1. TCP forbindelser kan smale flere pakker i en, det vil sige at du kunne modtage flere pakker end du måske lige forvendter. (det kan godt værer componentet selv sørger for dette).

2. dit prgram skriver kun ned i en fil når.
  1. efter den har modtager 50 pakker. (i=50).
  2. ved sidste pakke. (if progressbar1.Position >= progressbar1.Max)
  Dette er nok dit første problem.

3. tror ikke du skal bruge WriteLn(), når du skriver ned i din fil, det vil give extra linje skift, som ikke burde værer der.
brug istedet Write().

håber du kunne bruge det.
Avatar billede cautoo Nybegynder
06. juni 2003 - 16:11 #10
hmm... tak for dig svar

1: Ja jeg tror lidt du har ret, men jeg ahr prøvet at lege lidt videre, jeg er kommet frem til det lidt modsatte, for eftre modtagelse af en pakke så fylder stringen som regel allerede fler kb, så jeg tror den samler flere forsendelser i en, ved du hvordan man kan undgå dette?

2: Ja, hvis ovenstående er som jeg har forstået det...

3: Det forklarer måske det ekstra linieskift i starten :)

Alt i alt, søger jeg vel, hvis min teori er rigtig, en måde så jeg modtager det jeg sender i enkelte pakker og den ikke slår det sammen...
Avatar billede siz23 Nybegynder
06. juni 2003 - 23:52 #11
1. sætter en header på dine pakker, som angiver hvor lang pakken er.

2. hvorfor ikke altid skrive ned i din fil, hvorfor vendte til du har modtaget 50 pakker?

3. linjeskiftet burde ligge i slutningen.
Avatar billede siz23 Nybegynder
06. juni 2003 - 23:54 #12
du burde kigge lidt på streams, da det ville gøre det hele meget nemmere.
AStream
TFileStream

for du kan sikkert bruge dem direkte med dit component. (også behøver du ikke selv holde øje med hvor du skal skille pakkerne.
Avatar billede siz23 Nybegynder
06. juni 2003 - 23:55 #13
btw: normalt ville man nok vælge at have en port til a sende komandoer over og en port til "rå" data.
Avatar billede cautoo Nybegynder
07. juni 2003 - 19:02 #14
Grunden til at jeg laver det selv, er fordi jeg har erfaret at andre delphiløsninger ikke fortæller hvor meget man har sendt/modtaget...

Det ikke sådan at jeg kunne få dig til at lave et eks. hvor den endten sender med stream, eller med det der header du snakker om?
Avatar billede cautoo Nybegynder
28. juli 2003 - 15:40 #15
siz23, du har ikk mulighed for at give et eksempel på noget kode som kan sende, og hvor man kan se hvor langt det er nået vel?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester