Java Socket kommunikation mit C++

EisenJC

Grünschnabel
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
Code:
Scanner in = new Scanner( client.getInputStream() );

und wartet auf eine message mit

Code:
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
 
Moin,

ich weiß nicht, ob Dir das hilft, aber auf diese Art kommuniziere ich von Java-Client zum C++-Server :
Java:
 /**
   * Ü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
 
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?!
 
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
 
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
 
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.
 
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
 

Neue Beiträge

Zurück