Avatar billede Simon Praktikant
20. juli 2005 - 12:25 Der er 16 kommentarer og
1 løsning

read() kaldes for hurtigt på en socket.

Jeg benytter Socket til at tage imod en lang datastreng som kan være delt over flere pakker.

Hvis ikke linien "while(!hostIn.ready()){};" er der kaldes "byteValue = hostIn.read();" for hurtigt... altså før data er klar, og der kommer en exception.

Mit probelm er nu blot at når der kommer en ny data-pakke er data ikke lige klar, og derfor kommer der en exception, hvordan håndteres dette?

------------------------
Socket mySocket = null;
BufferedReader hostIn = null;
try
{
    mySocket = new Socket("192.168.54.145",80);
    mySocket.setSoTimeout(1000);

    hostIn = new BufferedReader(new      InputStreamReader(mySocket.getInputStream(),"UTF-8"));

    boolean eof = false;

    int byteValue;
    while(!hostIn.ready()){};
    while (!eof)
    {
        byteValue = hostIn.read();

        if (byteValue  == -1)
        {
            eof = true;
        }
        else
        {
            response += Character.toString((char)byteValue);
        }
    }
    hostIn.close();
    mySocket.close();
}
catch (IOException e)
{
    e.printStackTrace();
}
finally
{
    return response;
}
Avatar billede arne_v Ekspert
20. juli 2005 - 12:37 #1
hvilken exception ?
Avatar billede arne_v Ekspert
20. juli 2005 - 12:37 #2
hvorfor har du iøvrigt wrappet i en BufferedReader når du ikke bruger readLine ?
Avatar billede Simon Praktikant
20. juli 2005 - 12:46 #3
Der kommer en IOException
Avatar billede Simon Praktikant
20. juli 2005 - 12:48 #4
grunden til at jeg ikke bruger readline, er at jeg er interesseret i alle karakterer, og new-line, osv.
Hvis jeg bruger readLine() bliver nogle af disse da ikke sorteret fra????
..og ville det løse mit problem??
Avatar billede arne_v Ekspert
20. juli 2005 - 12:52 #5
en IOException med hvilken tekst ?
Avatar billede arne_v Ekspert
20. juli 2005 - 12:54 #6
readLine vil returnere alle tegn

(undtagen  \r\n som jo er implicitte i linie begrebet)

hvis du ikke bruger readLine kunne du jo lige så godt undlade at wrappe
i en BufferedReader (read er også i InputStream)

jeg tvivler dog på at det har noget med dit problem at gøre
Avatar billede Simon Praktikant
20. juli 2005 - 12:55 #7
datailMessage = "Read timed out"
Avatar billede Simon Praktikant
20. juli 2005 - 13:00 #8
der gav du mig en ledetråd, nu har jeg ændret    mySocket.setSoTimeout(1000); til    mySocket.setSoTimeout(10000); og det virker nu. Jeg vil lige prøve at undlade at bruge en wrapper som du skriver.
Avatar billede Simon Praktikant
20. juli 2005 - 13:04 #9
Nu har jeg fået det til at virke uden brug af BufferedReader. Til information for andre er min kode nu ændret til:

      Socket mySocket = null;
            BufferedWriter hostOut = null;
//          BufferedReader hostIn = null;
            InputStreamReader hostIn = null;
        try
        {
            mySocket = new Socket("192.168.54.145",80);
            mySocket.setSoTimeout(10000);

            hostOut = new BufferedWriter(new OutputStreamWriter(mySocket.getOutputStream(),"UTF-8"));
          // hostIn = new BufferedReader(new InputStreamReader(mySocket.getInputStream(),"UTF-8"));
            hostIn = new InputStreamReader(mySocket.getInputStream(),"UTF-8");
Avatar billede Simon Praktikant
20. juli 2005 - 13:05 #10
... se lige bort fra hostOut... det bliver brugt til noget andet, og skulle have været fjernet.
Avatar billede arne_v Ekspert
20. juli 2005 - 13:06 #11
du burd efaktisk kunne bruge

InputStream hostIn = null;

og

hostIn = mySocket.getInputStream();
Avatar billede arne_v Ekspert
20. juli 2005 - 13:07 #12
og husk at read af et tegn af gangen ikke er den hurtigste måde at læse på
Avatar billede Simon Praktikant
20. juli 2005 - 13:10 #13
ok, tak for tippet, og tak for hjælpen arne_v
...smider du lige et svar?!?!
Avatar billede arne_v Ekspert
20. juli 2005 - 13:12 #14
kommer her
Avatar billede arne_v Ekspert
20. juli 2005 - 13:14 #15
jeg er nemlig lige igang med 1 versus 10000 byte af gangen her: http://www.eksperten.dk/spm/633741
Avatar billede Simon Praktikant
20. juli 2005 - 13:29 #16
ok, jeg vil så nok bruge en readLine() i stedet for. Hvad mener du lige præcist med "(undtagen  \r\n som jo er implicitte i linie begrebet)"? kan jeg blot hver gang jeg har modtaget en linie indsætte \r\n bagefter? giver et det samme?
Avatar billede arne_v Ekspert
20. juli 2005 - 13:32 #17
ja
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