Problem mit Socket

JavaJoe

Mitglied
Hallo!
Ich arbeite zur Zeit an einer kleinen Server-Client Anwendung. Der Server ist hierbei in der Lage auf verschiedene Kommandos, welche in String firm übermittelt wrden zu reagieren.
Es tritt hierbei jedoch ein Problem auf welches ich absolut nicht nachvollziehen kann.
Im Clienten laufen zwei Threads welche unabhängig voneinander in einer 3ten Klasse die Methode

Code:
public synchronized void Send(String com)
 {

  System.out.println("Sende : "+ com);
  try
  {
   this.out.write(com.getBytes());
   this.out.flush();
  }catch(Exception x)
  {
   System.out.println("Senden fehlgeschlagen!");
  }
  System.out.println("habe gesendet: "+com);

 }
aufrufen.

Wenn nun die 2 Threads diese Methode schnell hintereinander aufrufen empängt der Server die Kommandos nicht einzelnd sondern als einen zusammenhängenden String.
Der Server arbeitet so:

Code:
public synchronized void run()
 {
   String second="";
   String third="";
   String vier = "";

  while(true)
  {

    byte[] input = new byte[1000];
    second="";
    third="";
    vier = "";

    try
    {

     this.in.read(input);

    }
    catch(Exception y)
    {

    }





    String inputs =  this.bearbeitearray(input);
    input=null;
    System.out.println("Input:      "+inputs);
    tok =  new StringTokenizer(inputs);
    String first = tok.nextToken();

    if(tok.hasMoreTokens()){

     second = tok.nextToken();
     System.out.println("Second: "+ second);
    }
    if(tok.hasMoreTokens()){

     third = tok.nextToken();
     System.out.println("third: "+ third);
    }

    if(tok.hasMoreTokens()){

      vier = tok.nextToken();
      System.out.println("Vier: "+ vier);
    }
    tok=null;

Da alle IO Klassen, korigiert mich wenn ich falsch liege, synchronisiert sind kann ich mir diesen Fehler nicht erklären.

Bsp.:
Es wird gesendet: "COMM IMG"
direkt danach: "COMM MOUSEMOVE 52 57"
der Server empfängt: "COMM IMGCOMM MOUSEMOVE 52 57"
worauf er natürlich eine Fehlermeldung bringt.

Vielen Dank im Vorraus.
MFG
 
Scheint n Buffer-Problem zu sein. Aber da du ja .flush benutzt denk ich mal das wird irgendwo beim TCP-Protokoll liegen (Nagle Algorythmus speichert ja kleine Datenmengen zwischen und sendet alles auf einmal, dachte aber immer, dass dies mit stream.flush übergangen wird).

Versuch mal andere Übertragung. Zb. mit einem DataOutput/Input Stream und dann mit writeUTF/readUTF. So wie ich das sehe solltest du keine BufferedStreams verwenden weil das ja so eine art direkte Übertragung sein sollte soweit ich das sehe.

Weiters hab ich grad gesehn es gibt einen Befehl socket.setTcpNoDelay(boolean on), dies könnte den Nagle-Algorythmus aushebeln können, falls dies der Grund war.

setTcpNoDelay(boolean on)
Enable/disable TCP_NODELAY (disable/enable Nagle's algorithm).

hoffe es funktioniert
mfg trauter
 
Zurück