Kommunikation zwischen C++ und Java Programm (Sockets)
-
Hi zusammen. Ich bin mir jetzt nicht ganz sicher gewesen, in welches Forum das gehört, aber ich denk hier ist dieses Problem am besten aufgehoben.
Es geht um eine Socket Verbindung (unter Windows) zwischen einem C++ und enem Java Programm. Der Client ist in C++ geschrieben und der Server in Java.
So... Nun zum Problem. Der Server legt einen serverSocket an:
try { this.waitingSocket = new ServerSocket( this.port ); } catch (IOException e) { System.out.println("Couldn't create server socket. Exiting program!"); System.exit(0); }
Der C++ Client connected sich zum Server
rc = connect( s, ( SOCKADDR * )&addr, sizeof( SOCKADDR_IN ) ); if( rc == SOCKET_ERROR ) { printf( "Critical Error: Connection failed! Error code: %d\n", WSAGetLastError() ); return 0; }
Und der Server nimmt die Verbindung an.
try { s = waitingSocket.accept(); } catch (IOException ex) { System.out.println("Accepting client connection failed!"); }
Jetzt soll der Client dem Server ein paar Daten schicken.
int rc = send( s, buffer, data->GetContentLength(), 0 ); if( rc == SOCKET_ERROR ) { printf( "Critical Error: Sending data failed! Error code: %d\n", WSAGetLastError() ); return 0; }
data->GetContentLength() liefert einfach die Anzahl der zu übertragenden Zeichen zurück.
Das haut soweit auch alles hin. Nur wenn der Server antworten soll, passiert nix.
Das ganze dachte ich mir so:
OutputStream os = this.s.getOutputStream(); PrintWriter pw = new PrintWriter(os, true); pw.print(dataToSend);
Wobei dataToSend ein Java String ist.
Der Client wartet in einem receice Aufruf:
char data[100]; int rc = recv( s, length2, 100, 0 );
Aus diesem Aufruf kehrt er aber nicht mehr zurück und die Daten sind somit nicht angekommen.
Ich hab schon probiert byte[] und char[] vom Server aus zu schicken, aber hat auch alles nicht geklappt.
Hat jemand von euch vielleicht ne Ahnung, woran das liegen könnte? Bin für jede Hilfe dankbar...
Grüsse, Primitive
-
Tja gut, nur das print() wohl den Stream nicht flushed.
Mach malpw.println( dataToSend );
oder
pw.flush();
-
Jepp hab's mal in der Java Doc nachgeschlagen:
" Unlike the PrintStream class, if automatic flushing is enabled it will be done only when one of the println() methods is invoked, rather than whenever a newline character happens to be output. The println() methods use the platform's own notion of line separator rather than the newline character. "
-
Achso... das werd ich mal probieren. Ich hätte gedacht, dass im Konstruktor von dem Printwriter das "true" autoflushing einschaltet und ich das nicht extra machen muss. Danke erstmal
-
Naja, steht ja da auch.
"..if automatic flushing is enabled it will be done only when one of the println() methods is invoked, .."Fällt in die Kategorie: "Klingt komisch. Is aber so." :p
-
Hoppla... Wer lesen kann ist klar im Vorteil