|
| 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 |
| | |
|
|