16. april 2002 - 22:52Der er
8 kommentarer og 1 løsning
Egen netværksprotokol - kommandoer og filer på samme socket
Jeg er ved at implementere min egen letvægts netværksprotokol, ikke noget fancy - bare em simpel en der ligner POP3 meget. Jeg kan sende kommandoer og svar uden problemer, men nu vil jeg gerne sende en kommando efterfulgt af en fil (binære data). Hvordan gør jeg nu det?
Mine kommandoer og svar sender jeg som tekst, men filen har jeg jo som en FileInputStream, skal jeg læse den manuelt, og så skrive bytes til min socket, eller er der en smartere måde?
Du læser fra din inputstream og skriver til din outputstream. Altså finder du 2 typer streams med samme læse/skrive metoder. F.eks. kan du konstruere en BufferedInputStream med din FileInputStream og læse/skrive i stil med: int z = 0; while((z = bufferedInputStream.read()) != -1) bufferedOutputStream.write(z);
Der er desværre ikke en helt simpel måde at sende en hel fil på. Fra kommunikationens synspunkt vil det være lettest at sende et objekt så skal der også kun modtages et objekt. Jeg vil derfor foreslå at du får læst din fil ind i en byte[] hvilket er ligetil idet du kan få filstørrelsen. Dernæst sender du blot dette ene objekt gennem din socket. Modtageren kan så direkte smide denne array ud i en fil. Det er en yderst simpel men let implementerbar løsning. Vil du have eksempel kode til det?
Øhm... det er jo netop dette der sker i henholdsvis bufferedinputstream og bufferedoutputstream, bytes gemmes i et buffer-array. Eller du ville måske læse hele filen ind i ét byte-array inden man begynder at sende data? Det lyder ikke specielt optimerende. Du allokerer et object der ikke er nødvendigt (i det tilfælde filen er større en buffer hvilket vel er det sædvanlige).
jword: Hvis du læser det jeg har skrevet vil du se at jeg siger du skal få fat i filstørrelsen således at du kan allokere en byte[] der har præcis den korrekte størrelse intet spild overhovedet. Dernæst siger jeg at man skal sende et enkelt objekt hvilket også er meget simpelt. Her er det naturligt at benytte en ObjectOutputStream således at der er en skrive og en læse operation færdig arbejde. Det er unægtelig en simpel måde at løse problemet på.
Det er da spild at allokere et byte array på 20 Mb hvis din filstørrelse er 20 Mb. I forbindelse med peer2peer programmer vil det da kræve en hulens masse ram.
Fuldstændig enig, hvis det er så store datamængder så skal det løses med en sædvanlig simpel overførsel. Det må være neigaard der ved hvad der er påkrævet. Op til et par Mb ville jeg ikke have betænkeligheder.
Hvordan virker det hersend svar tingeltangel egentlig, jeg havde kun mulighed for at acceptere/afvise svar fra carstenknudsen, men ikke jword??? Hvad nu?
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.