S
SebastianF
Gast
Hallo.
Ich schreibe derzeit einen Server über den unter anderem auch gechattet werden können soll. Für jeden Client wird ein neuer Thread gestartet. Jeder Thread besitzt ein eigenes Socket zu seinem Client.
Empfangen und senden funktioniert eigentlich prächtig, wenn da nicht folgendes Problem wäre:
Egal welchen Writer ich benutze, egal ob gepuffert oder nicht, egal ob PrintWriter mit println(), print() oder BufferedWriter mit write(), ich bekomme ein reproduzierbares Problem, dass mein Server meint, etwas nur einmal gesendet zu haben, der Server empfängt es aber mehrfach und zerstückelt.
Ich weiß nicht, wie das kommen kann, denn wie gesagt: jeder Client bekommt ein eigenes Socket in seinem Thread. Kein anderer Client kann da dazwischenfunken. Es gibt auch nur sequentielle Zugriffe auf das Socket.
Zum Senden verwende ich derzeit folgende Methode:
Ich habe zusätzlich das Problem, dass die Clients kein \r\n oder ähnliches zum terminieren verwenden, sondern die Zeichenfolge "|END|" (deshalb die Stringaddition). println() funktioniert deswegen sowieso nicht und ich kann nicht write(x + "\n") ausführen.
Mein Server meint gesendet zu haben:
Der Client empfängt:
Wieso? Es wird nur ein paar mal hintereinander das out-Kommando aufgerufen. Wobei ab SNICK eine Funktion die Ausgabe von SLIST übernimmt. Lagert Java diese etwa in einen neuen Thread aus?
Vielen Dank schonmal für eure Hilfe.
Ich schreibe derzeit einen Server über den unter anderem auch gechattet werden können soll. Für jeden Client wird ein neuer Thread gestartet. Jeder Thread besitzt ein eigenes Socket zu seinem Client.
Empfangen und senden funktioniert eigentlich prächtig, wenn da nicht folgendes Problem wäre:
Egal welchen Writer ich benutze, egal ob gepuffert oder nicht, egal ob PrintWriter mit println(), print() oder BufferedWriter mit write(), ich bekomme ein reproduzierbares Problem, dass mein Server meint, etwas nur einmal gesendet zu haben, der Server empfängt es aber mehrfach und zerstückelt.
Ich weiß nicht, wie das kommen kann, denn wie gesagt: jeder Client bekommt ein eigenes Socket in seinem Thread. Kein anderer Client kann da dazwischenfunken. Es gibt auch nur sequentielle Zugriffe auf das Socket.
Zum Senden verwende ich derzeit folgende Methode:
Java:
private void out(String s)
{
s = s + end;
try
{
BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(server.getOutputStream()));
wr.write(s);
wr.flush();
} catch(IOException ioe)
{
logError("IOException on socket listen: " + ioe);
}
System.out.println("=> " + server.getInetAddress().getHostAddress() + " : " + s);
}
Ich habe zusätzlich das Problem, dass die Clients kein \r\n oder ähnliches zum terminieren verwenden, sondern die Zeichenfolge "|END|" (deshalb die Stringaddition). println() funktioniert deswegen sowieso nicht und ich kann nicht write(x + "\n") ausführen.
Mein Server meint gesendet zu haben:
<= 127.0.0.1 : SHELL|END|
=> 127.0.0.1 : SHELL|END|
<= 127.0.0.1 : SVERS 1.0.1.0|END|
=> 127.0.0.1 : SVERS 1.2.1.0|END|
<= 127.0.0.1 : SCODE test2@mail.com 1a1dc91c907325c69271ddf0c944bc72|END|
=> 127.0.0.1 : SCODE OK|END|
<= 127.0.0.1 : SNICK ONL|END|
=> 127.0.0.1 : SNICK 72 Dummy 0|END|
=> 127.0.0.1 : SLIST 71 ONL Dummy|END|
Der Client empfängt:
C->S: SHELL|END|
C<-S: SHELL|END|
verarbeite: SHELL
C->S: SVERS 1.0.1.0|END|
C<-S: SVERS 1.2.1.0|END|
verarbeite: SVERS 1.2.1.0
Aktuell verfügbare Version ist: 1.2.1.0
C->S: SCODE test2@mail.com 1a1dc91c907325c69271ddf0c944bc72|END|
C<-S: SCODE OK|END|
verarbeite: SCODE OK
C->S: SNICK ONL|END|
C<-S: SLIST 71 ONL Dummy|EN
C<-S: SLIST 71 ONL Dummy|END|
verarbeite: SLIST 71 ONL Dummy|ENSLIST 71 ONL Dummy
Wieso? Es wird nur ein paar mal hintereinander das out-Kommando aufgerufen. Wobei ab SNICK eine Funktion die Ausgabe von SLIST übernimmt. Lagert Java diese etwa in einen neuen Thread aus?
Vielen Dank schonmal für eure Hilfe.