Avatar billede netsrac Praktikant
04. januar 2002 - 16:27 Der er 7 kommentarer og
1 løsning

DataInpuStream fra Socket skal kickstartes og bruger 100% cpu, løsning ?

Jeg er ved at lave en FTP server i java, men er stødt på et problem når clienten sender filer til serveren, mærkeligt nok returnerer .available() ikke noget medmindre man først læser fra strømmen og derefter spørger på den, hvad kan det være ? Som koden er nu overfører den filerne som den skal, men den bruger også 100% cpu og det er jo ikke så godt, hvordan forhindrer jeg det ?

Koden som bruges når klienten sender filer:



                        else if (userCommand.equals(\"STOR\"))
                        {
                            if (anonymousLogIn)
                            {
                                if (!(userDir.substring(userDir.length()-1, userDir.length())).equals(\"/\"))
                                {
                                    userDir += \"/\";
                                }
                                   
                                out.println(\"125 \");
                                dataOutSocket = dataSocket.accept();
                                dataInData = new DataInputStream(dataOutSocket.getInputStream());
                                fileWriter = new FileOutputStream(new File(data.getAnonymousDir() + userDir + tmp.substring(5)));                                                                   
                               
                               
                                byte[] tmpByte = new byte[1000];
                                int count = 0;
                                tmpByte[count++] = dataInData.readByte();
                                                                                               
                                while (dataInData.available() > 0)
                                {
                                    tmpByte[count++] = dataInData.readByte();
                                    if (count == 1000)
                                    {
                                        fileWriter.write(tmpByte);   
                                        fileWriter.flush();                                       
                                        count = 0;
                                    }
                                }
                               
                                fileWriter.write(tmpByte, 0, count);
                                fileWriter.flush();

                           
                                dataOutSocket.close();
                                fileWriter.close();
                               
                                out.println(\"226 \");
                            }
                            else
                            {
                                /********************
                                IKKE ANONYM BRUGER
                                ********************/                               
                            }                           
                                                   
                        }
Avatar billede netsrac Praktikant
04. januar 2002 - 16:29 #1
Jeg har også prøvet at kun læse en byte af gangen også skrive den til filen, det var faktisk den bedste løsning, men så kan hastigheden højst kommer op på 200 kb pr. sec lokalt og det burde da være mere når det er lokalt ?
Avatar billede netsrac Praktikant
04. januar 2002 - 16:32 #2
og gør man det så bruger den også 100% cpu...
Avatar billede pststrata Nybegynder
08. januar 2002 - 09:25 #3
1) Det er ikke sikkert at .available() returnerer noget, da den ikke blokerer. Den checker bare om der er en byte i strømen. Den venter ikke (som en læsoperation gør) til at der kommer data in.
2 ) Overvej at bruge BufferedInputStream og BufferedOutputStream for dine læse/skrive funktioner.
Avatar billede pststrata Nybegynder
08. januar 2002 - 09:40 #4
Det kan du gøre ved :
BufferedInputStream is = new BufferedInputStream( dataOutSocket.getInputStream() );

BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(new File(<dit fil navn>)));
Avatar billede netsrac Praktikant
08. januar 2002 - 11:50 #5
Selvom jeg bruger BufferedInputStream hvordan skal jeg så vide hvor længe den skal blive ved med at læse ? Jeg ved jo ikke hvor stor den fil som clienten sender er ?
Avatar billede pststrata Nybegynder
08. januar 2002 - 14:24 #6
Jamen, der er ikke noget andet der skal laves om end definitionen af de 2 streams. Du kan stadigvæk bruge .available() på BufferedInputStream.

Personligt foretrækker jeg :
while( is.read( tmpBuffer, 0, buffer_length) != -1 ){
//du læser indtill EOF
Avatar billede netsrac Praktikant
21. januar 2002 - 21:34 #7
Jamen available returnerer jo stadig ikke det rigtige når jeg bruger BufferedInputStream og den skal stadig kickstartes...
Avatar billede netsrac Praktikant
27. februar 2002 - 20:46 #8
Nå projektet er lagt på hylden for lang tid siden, virker stadig ikke, men det ser ikke ud til at der sker mere her. jeg lukker og slukker, tak for hjælpen.
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