Avatar billede casualty Nybegynder
22. august 2003 - 10:51 Der er 14 kommentarer og
1 løsning

Java låser min pc

Jeg har lavet en netværksapplikation hvor en klient kan kontakte en server som derefter leverer en liste over sine filer. Klienten ken herefter hente filer ved at sende et filnavn og derefter returnerer serveren filen. Det virker fint 1. Gang derefter låser klienten... Jeg kører hvert fildownload som en tråd så jeg kan ikke helt fatte hvorfor...
Nedenstående metode er den som låser programmet

public void sendFilRequest(String fil)
  {
    try
    {
      objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
      objectOutputStream.writeObject(fil);
      File f = new File("C:\\"+fil);
      InputStream instr = socket.getInputStream();
      OutputStream outstr = new FileOutputStream(f);
      int n;
      byte[] b = new byte[1000];
      while((n = instr.read(b)) >= 0)//******Det sker et sted herunder
      {
        System.out.println("skriver");
        outstr.write(b, 0, n);
      }
    }
    catch(Exception e)
    {
      System.out.println(e);
    }
  }

Jeg kan bare ikke forstå hvordan det kan ske når jeg kører den som en tråd...

Mvh Casualty
Avatar billede casualty Nybegynder
22. august 2003 - 10:53 #1
Den modtager fint den første fil...til trodt for at den aldrig laver SystemOutPrintLine på "skriver"????
Avatar billede casualty Nybegynder
22. august 2003 - 11:33 #2
Ok der Input og Oputputstreams som jeg skal have lukket...Så langt er jeg kommet
Avatar billede casualty Nybegynder
22. august 2003 - 11:58 #3
Jeg vender tilbage når jeg har reorganiseret min applikation så meget så jeg bedre kan overskue den
Avatar billede arne_v Ekspert
22. august 2003 - 11:59 #4
instr.read fejler først når det i den anden ende lukker socket.

Umiddelbart tror jeg at du skal have omstruktureret din logik.

Alternativ 1:

connection less
client connecter
sender 1 kommando
modtager 1 svar
server lukker når svar er sendt

Alternativ 2

connection state
protokol
client sender 1 kommando
server sender antal bytes der kommer
sender sender bytes
client modtager bytes og ved når den har fået det hele
Avatar billede casualty Nybegynder
22. august 2003 - 13:49 #5
arne: Ligger problemet i at clienten ikke ved hvornår den har modtaget alle bytes?
Avatar billede arne_v Ekspert
22. august 2003 - 13:55 #6
Ja det tror jeg.
Avatar billede casualty Nybegynder
22. august 2003 - 14:09 #7
Her bliver den ved med at hente indtil der ikke er flere bytes at hente

byte[] b = new byte[1000];   
while((n = instr.read(b)) >= 0)
{
System.out.println("skriver");
outstr.write(b, 0, n);
}
Hvordan ville du skrive det hvis du kendte antallet af bytes i forvejen

Jeg skal nok oprette et sprgsml så du kan få points for det her...
Avatar billede arne_v Ekspert
22. august 2003 - 14:14 #8
Noget a la:

byte[] b = new byte[1000]; 
int total = 0;
while((total < expected) && ((n = instr.read(b)) > 0))
{
  total += n;
  System.out.println("skriver");
  outstr.write(b, 0, n);
}
Avatar billede arne_v Ekspert
22. august 2003 - 14:14 #9
Tæl lige parenteserne der kan være smuttet en.
Avatar billede casualty Nybegynder
22. august 2003 - 14:26 #10
arne >> http://www.eksperten.dk/spm/391077

Er 50 points ok? eller??
Avatar billede arne_v Ekspert
22. august 2003 - 14:28 #11
Meget OK.
Avatar billede casualty Nybegynder
22. august 2003 - 14:42 #12
Jeg har valgt at gøre det på følgende måde:

klient kontakter server.
server returnerer en liste over filer.
klient sender request om at hente en fil.
klient åbner en ny serversocket og venter
server kontakter klienten på den nye socket og leverer filen
osv.

på den måde er der altid en forbindelse åben imellem server og klient hvor der udveksles fillister og requests om filer.
hvergang en fil skal sendes, åbnes der en anden connection imellem serveren og clienten og lukkes igen efter endt overførsel...

er det meget grimt at gøre det på den måde??
Avatar billede arne_v Ekspert
22. august 2003 - 14:46 #13
Det er faktisk den måde FTP gør det på !

:-)
Avatar billede casualty Nybegynder
22. august 2003 - 14:58 #14
Ok fedt ;)
Avatar billede arne_v Ekspert
22. august 2003 - 15:02 #15
I FTP taler man om en "control connection" og en "data connection".
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