tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
6
ZUGRIFFE
1138
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    EisenJC EisenJC ist offline Grünschnabel
    Registriert seit
    Jun 2009
    Beiträge
    3
    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 :
    1
    
    Scanner in = new Scanner( client.getInputStream() );

    und wartet auf eine message mit

    Code :
    1
    
    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
     

  2. #2
    Avatar von vfl_freak
    vfl_freak vfl_freak ist offline Mitglied Diamant
    Registriert seit
    Aug 2007
    Ort
    Niedersachsen
    Beiträge
    2.161
    Moin,

    ich weiß nicht, ob Dir das hilft, aber auf diese Art kommuniziere ich von Java-Client zum C++-Server :
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    
     /**
       * Ü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
     
    Es ist noch kein Meister vom Himmel gefallen - sonst hätte man schon längst seine Leiche gefunden !!

    Falls ich helfen konnte, wäre eine Bewertung oder ein Danke nett ;-)
    -------------------------------------------------------------------------------------------------
    Ich beantworte keine Fragen per PN !!
    Stellt Eure Fragen im Forum - dann haben alle etwas davon !!

  3. #3
    EisenJC EisenJC ist offline Grünschnabel
    Registriert seit
    Jun 2009
    Beiträge
    3
    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?!
     

  4. #4
    Avatar von vfl_freak
    vfl_freak vfl_freak ist offline Mitglied Diamant
    Registriert seit
    Aug 2007
    Ort
    Niedersachsen
    Beiträge
    2.161
    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
     
    Es ist noch kein Meister vom Himmel gefallen - sonst hätte man schon längst seine Leiche gefunden !!

    Falls ich helfen konnte, wäre eine Bewertung oder ein Danke nett ;-)
    -------------------------------------------------------------------------------------------------
    Ich beantworte keine Fragen per PN !!
    Stellt Eure Fragen im Forum - dann haben alle etwas davon !!

  5. #5
    Avatar von takidoso
    takidoso takidoso ist offline Mitglied Brillant
    Registriert seit
    Aug 2004
    Ort
    Kömigstein
    Beiträge
    911
    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
     

  6. #6
    EisenJC EisenJC ist offline Grünschnabel
    Registriert seit
    Jun 2009
    Beiträge
    3
    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.
     

  7. #7
    Avatar von takidoso
    takidoso takidoso ist offline Mitglied Brillant
    Registriert seit
    Aug 2004
    Ort
    Kömigstein
    Beiträge
    911
    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
     

Ähnliche Themen

  1. Java - Html Kommunikation
    Von javaboon im Forum Java Grundlagen
    Antworten: 2
    Letzter Beitrag: 14.07.10, 15:54
  2. RS232 Kommunikation mit Java
    Von nougs im Forum Java
    Antworten: 2
    Letzter Beitrag: 09.07.09, 14:50
  3. Kommunikation zwischen Java-Anwendung und Flash
    Von FunkyMonkey im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 1
    Letzter Beitrag: 04.09.07, 12:13
  4. Java Socket-Kommunikation
    Von KartoffelKiffer im Forum Java
    Antworten: 4
    Letzter Beitrag: 06.08.07, 16:22
  5. Antworten: 7
    Letzter Beitrag: 10.08.04, 11:31