/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Socket og BufferedReader mister data
Fra : Allan Weber


Dato : 25-03-04 13:27

Hej

Jeg har socket forbindelse mellem to computere (vha. Socket klassen), og
bruger en BufferedReader til at læse de modtagne data med. Hvis maskinen der
sender data sender 10 "Strings" hurtigt efter hinanden, får den modtagne
maskine kun to af de sendte "Strings". Hvis man der imod debugger sig
igennem koden, og holder en kort pause inden man sender data, så bliver alle
10 "Strings" modtaget korrekt.
Nogen der ved hvad det kan skyldes?

Mvh
Allan Weber



 
 
Filip Larsen (25-03-2004)
Kommentar
Fra : Filip Larsen


Dato : 25-03-04 16:04

Allan Weber skre

> Jeg har socket forbindelse mellem to computere (vha. Socket klassen),
og
> bruger en BufferedReader til at læse de modtagne data med. Hvis
maskinen der
> sender data sender 10 "Strings" hurtigt efter hinanden, får den
modtagne
> maskine kun to af de sendte "Strings". Hvis man der imod debugger sig
> igennem koden, og holder en kort pause inden man sender data, så
bliver alle
> 10 "Strings" modtaget korrekt.

Uden den konkrete kode er det noget svært at svare på, men de nævnte
symptomerne kan skyldes, at din læse-løkke ikke korrekt håndterer det
forhold, at data sendt som een blok ikke nødvendigvis læses som een
blok. I princippet kan du risikere, at data kommer klattende et tegn ad
gangen, eller omvendt, at data sendt som enkelte tegn ankommer i store
blokke. Du skal sikre, at der er en måde hvorpå læseren kan skelne en
streng fra den næste, fx. ved først at sende længden på strengen eller
ved at benytte en protokol såsom java serialisering der korrekt
håndterer dette. Hvis dine strenge er linie-orienteret kan du også bruge
termineringstegn til at dele op med, men dette passer dårliger med den
måde data læses med java.io API'et og kan derfor kun anbefales hvis
protokollen ligger fast og i forvejen benytter terminering.


Mvh,
--
Filip Larsen



Allan Weber (26-03-2004)
Kommentar
Fra : Allan Weber


Dato : 26-03-04 09:08

Her er den kode som bliver brugt til at læse med:

protected String receiveSocket(){
BufferedReader input = null;
String inputString = null;
try{
input = new BufferedReader(new
InputStreamReader(socket.getInputStream()));
inputString = input.readLine();
}catch(IOException e){
System.out.println(e.toString());
}catch(NullPointerException np){
System.out.println("Connection closed while reading from socket - this
could be allright");
}
System.out.println("On port " + port + " Socket has just received: " +
inputString);
return inputString;
}

Denne funktion er mere eller mindre omgivet at hvad der svarer til
while(true), så den altid står og lytter efter data. Giver det en idé om,
hvad problemer kan skylder?

Mvh
Allan

"Filip Larsen" <filip.larsen@nospam.dk> wrote in message
news:c3usee$trn$1@news.cybercity.dk...
> Allan Weber skre
>
> > Jeg har socket forbindelse mellem to computere (vha. Socket klassen),
> og
> > bruger en BufferedReader til at læse de modtagne data med. Hvis
> maskinen der
> > sender data sender 10 "Strings" hurtigt efter hinanden, får den
> modtagne
> > maskine kun to af de sendte "Strings". Hvis man der imod debugger sig
> > igennem koden, og holder en kort pause inden man sender data, så
> bliver alle
> > 10 "Strings" modtaget korrekt.
>
> Uden den konkrete kode er det noget svært at svare på, men de nævnte
> symptomerne kan skyldes, at din læse-løkke ikke korrekt håndterer det
> forhold, at data sendt som een blok ikke nødvendigvis læses som een
> blok. I princippet kan du risikere, at data kommer klattende et tegn ad
> gangen, eller omvendt, at data sendt som enkelte tegn ankommer i store
> blokke. Du skal sikre, at der er en måde hvorpå læseren kan skelne en
> streng fra den næste, fx. ved først at sende længden på strengen eller
> ved at benytte en protokol såsom java serialisering der korrekt
> håndterer dette. Hvis dine strenge er linie-orienteret kan du også bruge
> termineringstegn til at dele op med, men dette passer dårliger med den
> måde data læses med java.io API'et og kan derfor kun anbefales hvis
> protokollen ligger fast og i forvejen benytter terminering.
>
>
> Mvh,
> --
> Filip Larsen
>
>



Søren Hjelholt (26-03-2004)
Kommentar
Fra : Søren Hjelholt


Dato : 26-03-04 10:47

"Allan Weber" <awmi00@control.auc.dk> wrote in news:c40od4$cae$1@sunsite.dk
in dk.edb.programmering.java:

> Her er den kode som bliver brugt til at læse med:
>
> protected String receiveSocket(){
> BufferedReader input = null;
> String inputString = null;
> try{
> input = new BufferedReader(new
> InputStreamReader(socket.getInputStream()));
> inputString = input.readLine();
> }catch(IOException e){
> System.out.println(e.toString());
> }catch(NullPointerException np){
> System.out.println("Connection closed while reading from socket - this
> could be allright");
> }
> System.out.println("On port " + port + " Socket has just received: " +
> inputString);
> return inputString;
> }
>
> Denne funktion er mere eller mindre omgivet at hvad der svarer til
> while(true), så den altid står og lytter efter data. Giver det en idé om,
> hvad problemer kan skylder?

Inputdelen ser umiddelbart ok ud, det interessante er jo så outputtet, hvor
det, som en anden har nævnt, er vigtigt at flushe når man afsender. altså
"navnet på din outputstream".flush(). Derved sørger du for at alt bliver
sendt.
Jeg husker at have haft samme problem engang. Jeg endte med at bruge "navn
på outputstream".writeUTF("text"). Det virkede af en eller anden grund
bedre. Men jeg havde også kun brug for at sende enkelte ord, som kommandoer
til en server.

/Søren Hjelholt

Allan Weber (26-03-2004)
Kommentar
Fra : Allan Weber


Dato : 26-03-04 11:51

Koden som bruges til at sende:

public int sendSocket(String data){
PrintWriter out = null;
try{
out = new PrintWriter(socket.getOutputStream(), true);
out.println(data);
out.flush();
}catch(IOException e){
System.out.println(e.toString());
return 0;
}
return 1;
}

flush() afhjalp ikke problemet. writeUTF("text") som du nævner kan jeg ikke
lige umiddelbart i dokumentationen til hverken PrintWriter eller
OutputStream.

Mvh
Allan

"Søren Hjelholt" <hjelholt@_nospam_mail.dk> wrote in message
news:Xns94B86DC6C949Chjelholtmaildk@62.243.74.162...
> "Allan Weber" <awmi00@control.auc.dk> wrote in
news:c40od4$cae$1@sunsite.dk
> in dk.edb.programmering.java:
>
> > Her er den kode som bliver brugt til at læse med:
> >
> > protected String receiveSocket(){
> > BufferedReader input = null;
> > String inputString = null;
> > try{
> > input = new BufferedReader(new
> > InputStreamReader(socket.getInputStream()));
> > inputString = input.readLine();
> > }catch(IOException e){
> > System.out.println(e.toString());
> > }catch(NullPointerException np){
> > System.out.println("Connection closed while reading from socket -
this
> > could be allright");
> > }
> > System.out.println("On port " + port + " Socket has just received: " +
> > inputString);
> > return inputString;
> > }
> >
> > Denne funktion er mere eller mindre omgivet at hvad der svarer til
> > while(true), så den altid står og lytter efter data. Giver det en idé
om,
> > hvad problemer kan skylder?
>
> Inputdelen ser umiddelbart ok ud, det interessante er jo så outputtet,
hvor
> det, som en anden har nævnt, er vigtigt at flushe når man afsender. altså
> "navnet på din outputstream".flush(). Derved sørger du for at alt bliver
> sendt.
> Jeg husker at have haft samme problem engang. Jeg endte med at bruge "navn
> på outputstream".writeUTF("text"). Det virkede af en eller anden grund
> bedre. Men jeg havde også kun brug for at sende enkelte ord, som
kommandoer
> til en server.
>
> /Søren Hjelholt



Filip Larsen (26-03-2004)
Kommentar
Fra : Filip Larsen


Dato : 26-03-04 16:04

Allan Weber skrev

> Her er den kode som bliver brugt til at læse med:
>
> protected String receiveSocket(){
> BufferedReader input = null;
> String inputString = null;
> try{
> input = new BufferedReader(new
> InputStreamReader(socket.getInputStream()));
> inputString = input.readLine();
> }catch(IOException e){
> System.out.println(e.toString());
> }catch(NullPointerException np){
> System.out.println("Connection closed while reading from socket -
this
> could be allright");
> }
> System.out.println("On port " + port + " Socket has just received: "
+
> inputString);
> return inputString;
> }
>
> Denne funktion er mere eller mindre omgivet at hvad der svarer til
> while(true), så den altid står og lytter efter data. Giver det en idé
om,
> hvad problemer kan skylder?

Du skal ikke lave en ny BufferedReader for hvert gennemløb, men bruge
den samme hele tiden. Grunden er, at BufferedReader læser i forvejen, så
når den returnerer fra readLine() er der sandsynligvis læst mere en den
ene linie fra den underliggende input stream.


Mvh,
--
Filip Larsen



Allan Weber (29-03-2004)
Kommentar
Fra : Allan Weber


Dato : 29-03-04 08:47

Tak for hjælpen, det var lige det der skulle til, så nu virker det.

/Weber

>
> Du skal ikke lave en ny BufferedReader for hvert gennemløb, men bruge
> den samme hele tiden. Grunden er, at BufferedReader læser i forvejen, så
> når den returnerer fra readLine() er der sandsynligvis læst mere en den
> ene linie fra den underliggende input stream.
>



Michael Banzon (24-03-2004)
Kommentar
Fra : Michael Banzon


Dato : 24-03-04 03:49

"Allan Weber" <awmi00@control.auc.dk> skrev:
> Nogen der ved hvad det kan skyldes?

Husker du at flush()'e??


--
Michael Banzon
http://southbound.dk/
http://southbound.dk/blog/



Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409081
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste