Avatar billede backupmand Nybegynder
22. maj 2002 - 23:37 Der er 4 kommentarer og
1 løsning

Klienten "hænger" under datagram overførsel

Jeg har 2 klasser - en server og en klient,
serveren overfører en fil til klienten via udp (jeg bruger
datagrammer).

Når jeg kontakter serveren fra klienten går det fint -
serveren afkoder beskeden og foretager sig noget ud fra
den besked den har fået - er det den ene besked sendes
den ene fil, er det den anden besked sendes den anden fil.

Det ser således ud:

byte[] operationbuffer=new byte[20];               
                System.out.println("Waiting for client requests on port = "+server_Socket.getLocalPort());
        inPacket=new DatagramPacket(operationbuffer, operationbuffer.length);
            server_Socket.receive(inPacket);//modtag pakke
            addr=inPacket.getAddress();//modtag svar adresse       
            operationbuffer=inPacket.getData();//modtag pakke i bytearray
            String resp=new String(operationbuffer,0,inPacket.getLength());
            System.out.println("received command : "+resp);
            if (resp.equals("t.gif")||resp.equals("sw22.jpg"))
                {
                this.sendFile(resp);               

Her er ingen problemer....

Når klienten modtager filen (Det er sendfile metoden der sørger for det),
modtages filen fint nok, men klienten hænger og jeg er nødt til manuelt at
lukke dos vinduet før jeg kan fortsætte. Det jeg gerne vil, er at når
filen er overført skal jeg kunne blive ved - også at overføre den samme
fil. Jeg går ud fra at det har noget at gøre med den måde jeg checker for
end of file!

Det er et eller andet sted her det går galt : se nedenfor:

          fos=new FileOutputStream("downloaded/"+local);
          int d=-1;
          int count=0;         
         
          inPacket=new DatagramPacket(receivebuffer, receivebuffer.length);       
          String str=new String(receivebuffer,0,inPacket.getLength());         
          do                                 
              {                         
             
            if (str.equals("no"))
                {message.setText("File not found");
                break;
                }
          else {message.setText("transfering file");}                       
            clientsocket.receive(inPacket);   
           
            System.out.println("writing "+count+" k from buffer to file");               
                                   
                  d=inPacket.getLength();       
                     
                      for (int i=0;i<receivebuffer.length;i++)
                          {fos.write(receivebuffer[i]);
                          fos.flush();}                                 
                  count++;                 
              } while (receivebuffer.length>1);

men hvad kan det være??
Avatar billede erikjacobsen Ekspert
22. maj 2002 - 23:42 #1
Jeg har ikke læst din kode, men det lyder som om du ikke får sendt
en indikation af hvornår filen er slut. Din server sender filen i klumper,
og når sidste klump er sendt, sender den ikke mere. Men klienten lytter.
Og hænger med hovedet,

Du skal derfor i dine pakker fortælle: "her er en klump fil" og "nu er
filen slut". Udp pakker kan heller ikke garanteres at ankomme (det gør
de nok på et LAN), så du bør også sætte et nummer på pakkerne med
klumper.

Men så er du i gang med at opfinde TCP-protokollen, som jeg synes er
den eneste rigtige at bruge til filoverførsel.
Avatar billede nielsbrinch Nybegynder
23. maj 2002 - 18:32 #2
Du kan lade klientens hentFil() køre i en anden tråd og vise en lille animation imens den henter :-) Så hænger den ikke jo, vel? Eller gør den?
Avatar billede mpetersen Nybegynder
23. maj 2002 - 18:37 #3
Du har en buffer på 20 bytes.Hvis nu den sidste pakke er på 10 bytes, så vil din do-while løkke fortsætte (buffer.lenght er jo 10).

Næste gang den når til "clientsocket.recieve(inPacket)", så stopper programmer og venter på en pakke. Men da serveren er færdig med at sende vil der aldrig komme nogen pakke, og dermed er dit klient gået i stå.

Det vil sandsynligvis hjælpe at rette while linie til "while (receivebuffer.length==20)".
Avatar billede backupmand Nybegynder
23. maj 2002 - 20:14 #4
Den nederste del af koden er inden i en metode der hedder sendfile().
Heri er erklæret en buffer (byte array) af størrelsen 10. Det er den jeg siger while (receivebuffer.length>1) til.

nielsbrinch->Jeg tror ikke jeg behøver at programmere en tråd for at få det til at virke (??)

Den ene buffer er altså på 20 bytes og den anden er på 10. Den på 20 bytes er 20 bytes fordi den skal kunen indeholde et filnavn.ekstension. Den på 10 bytes skal bare være pakker der bliver modtaget - pakker med data.

Hvad vil der ske hvis jeg erklærer følgende INDEN i do while løkken?

inPacket=new DatagramPacket(receivebuffer, receivebuffer.length);       
          String str=new String(receivebuffer,0,inPacket.getLength());
Avatar billede nielsbrinch Nybegynder
27. maj 2002 - 16:53 #5
prøv da tråden! det koster 5 minutter
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