22. maj 2002 - 23:37Der 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);
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.
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)".
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?
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.