Avatar billede neigaard Nybegynder
16. april 2002 - 22:52 Der 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?
Avatar billede jword Nybegynder
17. april 2002 - 08:51 #1
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);
Avatar billede carstenknudsen Nybegynder
17. april 2002 - 10:24 #2
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?
Avatar billede jword Nybegynder
17. april 2002 - 11:05 #3
Ø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).
Avatar billede carstenknudsen Nybegynder
17. april 2002 - 11:28 #4
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å.
Avatar billede jword Nybegynder
17. april 2002 - 11:34 #5
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.
Avatar billede carstenknudsen Nybegynder
17. april 2002 - 11:45 #6
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.
Avatar billede neigaard Nybegynder
17. april 2002 - 16:51 #7
Ok - jword's svar var hvad jeg regnede med, men jeg ville lige høre om der var en smartere metode :)

Jeg kan på ingen måde vide hvor stor filerne vil være, så jeg kan ikke læse dem ind i en variabel (der kan også være mange filer igang af gangen).
Avatar billede neigaard Nybegynder
17. april 2002 - 16:53 #8
Hvordan virker det hersend svar tingeltangel egentlig, jeg havde kun mulighed for at acceptere/afvise svar fra carstenknudsen, men ikke jword??? Hvad nu?
Avatar billede jword Nybegynder
20. april 2002 - 11:48 #9
endnu et svar
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