# Java Socket kommunikation mit C++



## EisenJC (17. Juni 2009)

Guten Tag, ich habe ein Probleme mit der Kommunikation zwischen Java und C++

TCP Sockets, Java Server, C++ Client (winsock)

Java empfängt mit einem 

```
Scanner in = new Scanner( client.getInputStream() );
```

und wartet auf eine message mit 


```
String line = in.nextLine();
```

Allerdings blockiert er bei dieser Methode solange bis der client geschlossen wird bzw. das socket. Dann erst wird weiter gemacht und da hat er dann soviele messages an einander gepackt wie er empfangen hat.

was kann ich tun, dass er sofort nach erhalt weiter macht. Muss ich irgendeinen Puffer leeren? Ich habe auch schon BufferReader, DataInputStream usw. ausprobiert, diese emfpangen gar nichts!!

Die Kommunikation zwischen Java Server und Java Client läuft fehlerfrei. Ebenfalls auf der C++ Seite.

Danke im vorraus und beste Grüße
Eisen


----------



## vfl_freak (17. Juni 2009)

Moin,

ich weiß nicht, ob Dir das hilft, aber auf diese Art kommuniziere ich von Java-Client zum C++-Server :

```
/**
   * Übertagung eines Datenpackets an den Server mit Rückgabe des Antwortpaketes
   * @param RQB Das Requestpaket
   * @return Das Responsepacket
   */
  public byte[] CommunicateData( byte[] RQB, String strIP, int nPort ) 
  throws IOException 
  {
      byte[] blwPBuffer = null;
      SocketAddress sockaddr = new InetSocketAddress( strIP, nPort );
      Socket csock = new Socket();
      csock.connect( sockaddr, m_REPSOCKETTIMEOUT );
      csock.setSoTimeout( m_REPSOCKETTIMEOUT );

      // Input- und Outputstrean deklarieren
      OutputStream cout = csock.getOutputStream();
      InputStream cin = csock.getInputStream();

      //Requestbuffer schreiben
      cout.write(RQB);
      byte[] blwPBufferTemp = new byte[MAXBUFFERLEN];
      byte[] blwPBufferHeader = new byte[16];
      int len = 0;

      // hier den Header des Antwortbuffers einlesen, der u. a.
      // die Anzahl der zu lesenden Zeichen enthält !!
      // Die Anzahl der zu lesenden Zeichen wird dann nach "nsize" geschrieben!
      len = cin.read(blwPBufferHeader, 0, 16);

      int nsize = 0;
      if (blwPBufferHeader[0] == BUFFER_START) 
      {
        nsize = ByteHelper.getRSPDataSize(blwPBufferHeader);
        int lenneu = 0;
        blwPBuffer = new byte[BUFFER_OFFSET + 1 + nsize];
        
        for (int n = 0; n < BUFFER_OFFSET; n++) 
        {
            blwPBufferTemp[n] = blwPBufferHeader[n];
        }
        
        while( (nsize + BUFFER_OFFSET) > len ) 
        {
            lenneu = cin.read(blwPBufferTemp, len, (nsize - len + BUFFER_OFFSET));
            len += lenneu;
        }
        
        for (int k = 0; k < len; k++) 
        {
            blwPBuffer[k] = blwPBufferTemp[k];
        }
        
        cin.close();
        cout.close();
        csock.close();
      }
    return blwPBuffer;
  }
```

Gruß
Klaus


----------



## EisenJC (17. Juni 2009)

Ne leider nicht, ich möchte nur am Java Server halt nur einen String empfangen, das Antworten ist auch nicht nötig.
Der empfängt die message ja, aber blockiert trotzdem bei dem scanner.next bis das socket geschlossen wird.

Dabei hat ein Scanner ja gar nichts von einem Puffer oder?!


----------



## vfl_freak (17. Juni 2009)

Moin,

vorweg: die Scanner-Klasse kenne/benutze ich nicht - kann ich also auch nix zu sagen!

Sorry, habe gerade erst bemerkt, dass Du Java-SERVER und C++-CLIENT geschrieben hast - und nicht umgekehrt ;-) Wahrscheinlich 'liest' man das, was man zu lesen glaubt ^^

Kannst Du den String nicht ein Datenpaket packen - sprich: das Datenende eindeutig durch ein "Paketende"-Zeichen signalisieren 

Oder Du wartest eine definierte Zeit, ob noch weitere Bytes kommen und brichst dann ggf. die Übertragung ab ...

Mehr fällt mir so aus dem Stand nicht ein! Aber vielleicht ist es ja auch der Scanner selbst, der Dir Probleme bereitet !

Gruß
Klaus


----------



## takidoso (17. Juni 2009)

Hi,
kann es sein, dass hier das Problem der verschiedenen String-Philosophien der beiden Sprachen (java/C++) auf einandertreffen?
Java beinhaltet AFAIK eine Länge für die Strings, oder?
Tut das C++ nicht anders? In C z.B. sind Strings lediglich Arrays, die hex 00 terminiert sind.
Kann darin der Pfeffer vielleicht im Hasen oder andersherum liegen?

Naja versuche es doch mal mit simplen bytes, vielleicht bring Dich das ein wenig weiter.

viel Glück 

Takidoso


----------



## EisenJC (17. Juni 2009)

Bei den Bytes muss ich doch aber wissen wie lang das ganze wird?! aber das weiß ich vorher nicht. Ich weiß halt nur, dass es strings sind bzw. chars bei C++.

Das mit der Null terminierung ging mir auch durch den Kopf aber da weiß ich einfach nicht wie ich das umgehen kann...! vorallem ist ja komisch dass die nachrichten anscheinend korrekt ankommen aber der Scanner erst aus der next() raus geht wenn der client sich verabschiedet hat

FYI: Es handelt sich bei den nachrichten um simulation results welche vom C++ client an den Java server geschickt werden, das ganze ist zwar nicht in real time aber es sollte trotzdem im intervall von ~10ms möglich sein neue results zu verschicken, diese auf Server seite zu parsen und dann darzustellen.


----------



## takidoso (18. Juni 2009)

Hi EisenJC,
es gibt verschiedene Dinge die Du testen könntest, um Dir ein Bild zu machen:

Man könnte z.B. einen Java-Test-Client bauen, der einen String versendet und schauen wie Dein Server darauf reagiert. Wenn es klappt, wird die Hypothese in meiner vorangegangenen Mail bestätigt.
Man könnte Deinen Java-Server testweise einfach Bytes lesen lassen. Testweise könntest Du der Einfachheit halber auch eine bestimmte Zahl bytes lesen, nur um zu schauen, ob es funktioniert bzw. was da eigetnlich ankommt. Du könntest auch Bytes lesen lassen und eben auf ein _Hex 00 _warten, anstelle auf ein _newline_ so wie es vermutlich die nextLine() vom Scanner-Objekt.
Du könntest den C++-Client auch einen String schicken lassen, der anstelle ein _Hex 00 _eine _"\n"_ als Stringterminierung beinhaltet. Vielleicht funktioniert das ja.

Das sind mal braingestormte Vorschläge für Dein weiteres Tüfteln.

viel Spaß und Erfolg

Takidoso


----------

