Seg Nätverksöverföring med byte för byte läsning i java

Trädvy Permalänk
Medlem
Registrerad
Jun 2006

Seg Nätverksöverföring med byte för byte läsning i java

Jag har försökt bygga ett lite nätverksprogram i Java. Där man ska kunna skicka filer (stora som små). Jag använder mig av en serverSocket för att fånga in klienter sedan och få en socket. Sedan använder jag DataOutputStream och läser filen byte för byte med en FileInputStream.

FileInputStream filenIn = new FileInputStream(filen); DataOutputStream utStream = new DataOutputStream(socketen.getOutputStream()); ...Skickar Filnamn och Storlek med writeChars/writeLong... while((readbyte = filenIn.read())!=-1){ utStream.write(readbyte); }

Och servern(med server-socketen) tar emot med en "raw" inputStream som man får med kommandot socketen.getInputStream();

inStream=Socketen.getInputStream(); DataInputStream dataIn = new DataInputStream(inStream); while((readByte = inStream.read()) != -1){ FilSkrivare.write(readByte); bytesReceived++; }

Detta funkar men är alldeles för slött. Det tar runt 85 sek att skicka över en 5,8 MB stor fil. Vilket med mina beräkningar blir (5 800 000 / 85) / 1024 = 66,6 KB/S.
Finns det något annat bra sätt att skicka filer. Har sett någon om att java har nått ftp arkiv inbyggt? Eller ska man kanske läsa en array av tex 1024-bytes i taget? Någon som kan sånt här?

Life is too short to listen to slow music!
GA-P35-DS4 l Q6600 @ 3,6ghz l Ultra 120 l 3x2048mb PC6400 CL4 900mhz
| Sp. HD4870 512MB

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jan 2007

Är du säker på att 66,6 kB/s verkligen är dåligt på den linan du testar på?

I alla fall, testa att sända i block om 1024 eller något, kanske gzippa strömmen för att få den mindre, etc. – det finns en massa saker man kan göra.

Trädvy Permalänk
Medlem
Registrerad
Jun 2006
Citat:

Ursprungligen inskrivet av You
Är du säker på att 66,6 kB/s verkligen är dåligt på den linan du testar på?

I alla fall, testa att sända i block om 1024 eller något, kanske gzippa strömmen för att få den mindre, etc. – det finns en massa saker man kan göra.

Just nu kör jag via Lan. Klient(wlan) till Server(sladd). Så det är därför jag tycker det är låg hastighet. Men jag ska testa att zip:a.

Life is too short to listen to slow music!
GA-P35-DS4 l Q6600 @ 3,6ghz l Ultra 120 l 3x2048mb PC6400 CL4 900mhz
| Sp. HD4870 512MB

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Mar 2005

Självklart blir det långsamt om man läser byte för byte, måste man knappast vara ett genie för att förstå, speciellt när man använder Java som är ett supersegt språk. Läs ett större block istället som typ 64kb.

Intel Core i7-3770K | NVIDIA Geforce GTX 980 | 16 GB DDR3 | DELL P2415Q | DELL U2711 | DELL U2410

Trädvy Permalänk
Medlem
Registrerad
Jun 2006
Citat:

Ursprungligen inskrivet av MagnusL
Självklart blir det långsamt om man läser byte för byte, måste man knappast vara ett genie för att förstå, speciellt när man använder Java som är ett supersegt språk. Läs ett större block istället som typ 64kb.

Jo jag har nästan märkt de nu efter en tids använding. Men detta var vad vår skola erbjöd i form av Programmering A/B. Jag ska testa detta med att läsa block, problem är bara hur jag ska kunna fixa så att programmet förstår att det är "end-of-file", med det får jag la klura ut själv. Thx!

Life is too short to listen to slow music!
GA-P35-DS4 l Q6600 @ 3,6ghz l Ultra 120 l 3x2048mb PC6400 CL4 900mhz
| Sp. HD4870 512MB

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jan 2007
Citat:

Ursprungligen inskrivet av MagnusL
Självklart blir det långsamt om man läser byte för byte, måste man knappast vara ett genie för att förstå, speciellt när man använder Java som är ett supersegt språk. Läs ett större block istället som typ 64kb.

Skulle java vara segt nu också? Skitsnack. Nog för att Java är ett hemskt språk (eller snarare, Java-APIt är hemskt) men påståendet att det skulle vara segt saknar ju grund. Se till exempel här och här för trevliga motbevis till denna gamla 90tals-myt.

Citat:

Ursprungligen inskrivet av lanhacker
Jo jag har nästan märkt de nu efter en tids använding. Men detta var vad vår skola erbjöd i form av Programmering A/B. Jag ska testa detta med att läsa block, problem är bara hur jag ska kunna fixa så att programmet förstår att det är "end-of-file", med det får jag la klura ut själv. Thx!

Du skulle kunna skicka med hela filstorleken i en header i det första blocket, alternativ skick med blockstorleken och kanske en EOF-flagga med varje block.

Trädvy Permalänk
Medlem
Registrerad
Jun 2006

Gjorde som ni sa och skickar nu 64kb block. Kommer upp i hastigheter runt 2MB/s till min bärbara dator via wlan, vilket känns ganska normalt. Jag skippade det där med EOF-flagga och skickar först över den exakta filstorleken och block storleken.

Någon som har tips på vilken blockstorlek man ska använda? Större eller mindre än 64kb?

Life is too short to listen to slow music!
GA-P35-DS4 l Q6600 @ 3,6ghz l Ultra 120 l 3x2048mb PC6400 CL4 900mhz
| Sp. HD4870 512MB

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jan 2007
Citat:

Ursprungligen inskrivet av lanhacker
Gjorde som ni sa och skickar nu 64kb block. Kommer upp i hastigheter runt 2MB/s till min bärbara dator via wlan, vilket känns ganska normalt. Jag skippade det där med EOF-flagga och skickar först över den exakta filstorleken och block storleken.

Någon som har tips på vilken blockstorlek man ska använda? Större eller mindre än 64kb?

IRC använder 512 eller 1024, och det är ett ganska beprövat protokoll.

Trädvy Permalänk
Medlem
Registrerad
Jun 2006
Citat:

Ursprungligen inskrivet av You
IRC använder 512 eller 1024, och det är ett ganska beprövat protokoll.

Jo men jag ska skicka över större filer så känns det skumt att använda IRC's blockstorlek.

Life is too short to listen to slow music!
GA-P35-DS4 l Q6600 @ 3,6ghz l Ultra 120 l 3x2048mb PC6400 CL4 900mhz
| Sp. HD4870 512MB

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jan 2007
Citat:

Ursprungligen inskrivet av lanhacker
Jo men jag ska skicka över större filer så känns det skumt att använda IRC's blockstorlek.

Inte nödvändigtvis. IRC används ofta för att överföra filer på flera GiB.

Trädvy Permalänk
Medlem
Plats
Malmö
Registrerad
Okt 2001

Det viktiga är att du använder en blockstorlek som är större än MTU som ditt nätverk är på.

http://en.wikipedia.org/wiki/Maximum_transmission_unit

Om du åtminstone har 10KB så ska det inte vara något problem.

Trädvy Permalänk
Medlem
Registrerad
Jun 2006

Jag får ta och bygga en benchmark plug-in som kollar vad som går snabbast

Life is too short to listen to slow music!
GA-P35-DS4 l Q6600 @ 3,6ghz l Ultra 120 l 3x2048mb PC6400 CL4 900mhz
| Sp. HD4870 512MB

Trädvy Permalänk
Medlem
Plats
Ankeborg
Registrerad
Feb 2002

Java har ett extremt bra och lättanvändt API. "Standard" är mer eller mindre att köra på 1024 i buffert storlek och om man inte vet så mycket om nätverket.

Typ: (Java Psuedokod)
ByteArrayOutputStream out = null;
InputStream in = null;
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}

Dvs man skriver len bytes till out, vilket resulterar i att man inte behöver känna till storleken på det man läser i förhand.

Lycka till.

Mandriva <3

Trädvy Permalänk
Medlem
Registrerad
Jun 2006
Citat:

Ursprungligen inskrivet av DuckMuck
Java har ett extremt bra och lättanvändt API. "Standard" är mer eller mindre att köra på 1024 i buffert storlek och om man inte vet så mycket om nätverket.

Typ: (Java Psuedokod)
ByteArrayOutputStream out = null;
InputStream in = null;
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}

Dvs man skriver len bytes till out, vilket resulterar i att man inte behöver känna till storleken på det man läser i förhand.

Lycka till.

Jo, jag försökte med det där while ( len = in.read(buf) != -1)
men filerna blev helt corrupta men det jag kör med nu funkar fint. Ska bara testa hur hastigheten förändras i förhållande till blocksizen.

Life is too short to listen to slow music!
GA-P35-DS4 l Q6600 @ 3,6ghz l Ultra 120 l 3x2048mb PC6400 CL4 900mhz
| Sp. HD4870 512MB