# Zeilenumbruch in einem String



## Gast (15. Jan 2008)

Hallo,

ich programmiere grad einen relativ simplen Chat mit GUI und hab grad das "kleine" Problem,
dass ein String, bei dem ein Zeilenumbruch enthalten ist (also durch Enter), nicht komplett
an den Zielclient geschickt wird. "Normale" Zeilenumbrüche, also wenn man einfach über die
Zeile hinausschreibt, funktionieren problemlos.

Hier ein kurzer Auszug, wie ich den Test einlese:

inputField ist eine JTextArea.

```
String text=inputField.getText();
   String msg="msg"+targetnumber+" "+c.number+","+text;
```
Der String "msg" wird dann an den Server gesendet.

Gesendet wird so:

```
s=new Socket(ip, port);
   out=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));


//irgendwo weiter unten
   try{
	out.write(msg);
	out.newLine();
	out.flush();
   }catch(IOException io){io.printStackTrace();}
```

Und beim Server so ausgewertet und weiterversendet:

```
String text=msg.substring(msg.indexOf(',')+1,msg.length());
   server.send(targetname,"msg"+sourcename+" "+text);
```

Beim Zielclient wird dann der Text nach dem Leerzeichen eingelesen und ausgegeben.

Wenn ich aber nun was senden will wie z.B.


```
Zeilentest
.
.
.
Noch ne Zeile
.
.
.
etc
```

kommt beim Zielclient nur "Zeilentest" an.
Ich nehme mal an, dass es ein Problem beim einlesen durch den Writer bzw. Stream gibt, allerdings
kenn ich mich mit den verschiedenen Writern/Readern/Streams noch nicht so 100% aus.
Drum hoff ich mal, einer von euch hat ne Idee, wie ich das lösen könnte, dass auch die "Enter"-Eingabe
erkannt und mitversendet wird.

Danke schonmal im voraus


----------



## SlaterB (15. Jan 2008)

du hast nichts dazu geschrieben, wie der Server an msg rankommt,
oder wenn du gar noch einen dritten Zielclient hast, dann ist doch erstmal interessant, ob schon beim Server nichts ankommt oder erst bei der zweiten Übertragung,
auf solche Details achten!

> String text=inputField.getText(); 
> String msg="msg"+targetnumber+" "+c.number+","+text;

ist auch ziemlich schrecklich,
fange mit festen Daten an,
z.B

String msg = "test1\ntest2";
und dann schaue dir an, was der Server davon empfängt, erstmal Anzahl der Zeichen usw.


----------



## Gast (15. Jan 2008)

Oh, stimmt.

Also, der Server empfängt so:

```
in=new BufferedReader(new InputStreamReader(cs.getInputStream()));
   .
   .
   msg=in.readLine();
```
cs ist der Socket den man von ServerSocket.accept() bekommt.

Und beim Server kommt auch nur die erste Zeile an.
Einen dritten Zielclient gibts nicht, ist momentan nur ein 1:1 Chat.


----------



## Guest (15. Jan 2008)

Grad noch "test1\ntest2" von Client an Server gesendet, erkennt er als 2 verschiedene msg's


----------



## SlaterB (15. Jan 2008)

was ist nun die Frage? was funktioniert genau nicht?


----------



## Wildcard (15. Jan 2008)

readLine liest einen Stream bis zum nächsten Zeilenumbruch.
Insofern sollte das Verhalten doch nachvollziehbar sein, oder?


----------



## Körby (15. Jan 2008)

readLine() liest nur eine Zeile, also bis zum nächsten Zeilenumbruch.
Am besten readLine() mehrmals in einer Schleife durchlaufen lassen.


----------



## Gast (15. Jan 2008)

Also, ich als Chatter1 mach die Eingabe in der JTextArea:


```
test1 //Enter
test2 //Enter
test3
```

Beim Server kommen nun 3 Strings

"msgtest1"   (vereinfacht dargestellt, genauen String siehe oben)
"test2"
"test3"

an, wobei nur der erste beachtet wird, da ich eingehende Strings auf das "msg" im String
prüfe und somit erkenne, dass ein User eine Nachricht schreiben will.
Zeile 2 und 3 verpuffen somit.

Ich müsste nun also wissen, wie ich es am besten hinkriege, dass die Enter-Eingabe in der
JTextArea richtig über den Server an den Zieluser verschickt wird.

Ist irgendwie ein wenig doof zu beschreiben, hoffe es kommt trotzdem rüber.

Grad beim Schreiben ist mir die Idee gekommen, die Enter-Eingabe mit einem eindeutigen
String auszutauschen (also nicht \n, denn das hat ja auch nicht funktioniert), der dann, sobald
der String beim Zieluser, wieder umgewandelt wird.
Da müsste ich dann wissen, wie ich eine Enter-Eingabe erkennen kann, wenn ich eine JTextArea
auslese.


----------



## Gast (15. Jan 2008)

@Wildcard+Körby:
Ok, dann ist das schonmal verständlich.

Wenn man nun meine Idee (letzter Post, letzter Absatz) betrachtet, wird dann schon beim
Auslesen aus der JTextArea eine Enter-Eingabe als \n gespeichert?
Sprich, könnte ich mit .replace() das \n umändern?


----------



## Guest (15. Jan 2008)

probier mal was in der Art :

while ( (msg=in.readline)!=null ){

... (hier evtl. die einzelnen zeilen aneinanderhängen (addieren)

}


----------



## Körby (15. Jan 2008)

Wenn du auf msg abprüfst und das mit dem Zeilenumbruch nicht funktioniert probier mal was in diese Richtung:


```
String txt="";

while((msg = in.readLine()) != null) //msg bekommt in.readLine() zugewiesen und es wird auf Inhalt überprüft
{
    txt = txt + msg; //msg in txt speichern
}
```

Wenn du dies anstelle des msg = in.readLine() einfügst sollte es meiner Meinung nach funktionieren.
So sollte ein String trotz Zeilenumbrüchen vollständig eingelesn werden(gesammter übertragener String in txt).


----------



## Guest (15. Jan 2008)

@Gast+Körby:

Ok, das ist auch ne Idee.

Wobei ich natürlich

txt = txt + "\n" + msg;

schreiben muss (später beim Zielclient dann auch), ansonsten kommt ja
beim Zielclient

"test1test2test3"

und nicht

"test1
test2
test3"

an.

Aber rein zum Verständnis noch:
Ginge es theoretisch, dass ich nach dem Einlesen von der JTextArea

msg.replace("\n","irgendeinstring");

mache?


----------



## Wildcard (15. Jan 2008)

Anonymous hat gesagt.:
			
		

> Aber rein zum Verständnis noch:
> Ginge es theoretisch, dass ich nach dem Einlesen von der JTextArea


Genau das wirst du tun müssen um zwischen neuer Nachricht und manuellem Umbruch unterscheiden zu können.


----------



## Gast (15. Jan 2008)

Alles klar. Testen kann ich es momentan nicht, aber wird dann schon funktionieren.
Zur Not meld ich mich nochmal 

Danke an alle Beteiligten!


----------



## Guest (15. Jan 2008)

Was anderes 

      InputStream  in  = server.getInputStream("");

 getInputStream() in java.net.Socket cannot be applied to (java.lang.String)

Kann man mit der nicht einfach Strings üebrgeben. Musss man immer ein Buff. Reader machen ?


----------



## Gast (15. Jan 2008)

Also,

text.replace("\n","ZEILENUMBRUCH");

funktioniert irgendwie nicht. Es wird beim Server weiterhin nur die erste Zeile ausgewertet.

Auch der Versuch

txt = txt + "\n" + msg;

in einer while-Schleife ist gescheitert, da wurde dann plötzlich garnichts mehr übertragen.

Am liebsten wär mir, wenn die Lösung mit replace funktionieren würde, aber was mach ich da falsch?


----------



## Guest (15. Jan 2008)

Gast hat gesagt.:
			
		

> Auch der Versuch
> 
> txt = txt + "\n" + msg;
> 
> ...



hast du denn in diesem Fall auch "txt" weitergegeben (und nicht msg!) ??


----------



## Gast (15. Jan 2008)

Ja, bzw. hab ich es so gemacht:


```
String txt=msg;
while((msg=in.readLine())!=null){
   txt=txt+"\n"+msg;
}
msg=txt;
```


----------



## Guest (15. Jan 2008)

Ganz vergessen, in dem Beispiel wurde schon vorher mal msg=in.readLine() ausgeführt, deswegen
weise ich es am Anfang gleich mal txt zu.


----------



## Guest (15. Jan 2008)

Nächster Versuch, Eingabe im Chat selbst: test1\ntest2

Diese Eingabe wird in beiden Chatfenstern genau so angezeigt, sprich das "\n" wird
korrekt zum Server und Zielclient geschickt, allerdings dort auch so ausgegeben.

Langsam bin ich verwirrt. Arbeite momentan mit der replace-Methode.

Kann man einen Zeilenumbruch noch irgendwie anders abfragen/darstellen ausser \n?


----------



## Gast (4. Feb 2008)

Hi, ich habe exakt das gleiche problem, arbeite auch gerade an der replace methode, ich versuche den Zeileumbruch mit einem "
" zu ersetzen, da ich am ende ein JEditorPane hab, der auch mit HTML umgehen kann, nur funzt das nicht so ganz :S


----------



## Gast (4. Feb 2008)

Ok, problem gelöst nach ungefähr 3 Stunden: 

die String.replaceAll() methode anstatt der String.replace methode hats gebracht =)


----------

