2017-08-01 2 views
0

Ich habe einen C++ Socket Server, der eine JSON-Zeichenfolge an einen Java-Client sendet. Für die Java Teil verwende ich den folgenden Code:Java Socket Read gibt seltsame Zeichen beim zweiten Lesen zurück

BufferedReader in = new BufferedReader(new InputStreamReader(soc.getInputStream()));  
while((inString = in.readLine()) != null) { 
      Log.i("JSON", inString); 

C++ Code:

WSADATA wsa; 
SOCKET s, new_socket; 
struct sockaddr_in server, client; 
int c; 

if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) { return false; } 

if ((s = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { return false; } 

server.sin_family = AF_INET; 
server.sin_addr.s_addr = INADDR_ANY; 
server.sin_port = htons(13377); 

if (bind(s, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR) { return false; } 

listen(s, 3); 

c = sizeof(struct sockaddr_in); 
new_socket = accept(s, (struct sockaddr *)&client, &c); 
if (new_socket == INVALID_SOCKET) { return false; } 

while (listenSocket) { 
    if(...){ 
     char sendData[] = "hallo"; 
     send(new_socket, sendData, sizeof(sendData), NULL); 
    } 

Wenn das erste Mal alles empfangen wird wie geplant erhalten. Beim zweiten Mal werden jedoch nur Fragezeichen in Quadrate " " ausgedruckt. Ist das so, weil ich ein Char-Array von 2048 Zeichen sende, das möglicherweise nur einen geringeren Betrag als das enthält oder was könnte das Problem sein?

+0

Bitte geben Sie auch Ihren C++ Code an. https://stackoverflow.com/help/mcve – Tezirg

Antwort

0

Ich denke, Sie sollten nicht unnötige Daten in beide Richtungen senden, so in Ihrem Fall nur die Zeichenfolge mit folgenden \0 oder besser und in der Regel die Standardweise die Länge der Bytes und danach die Daten ohne \0 und nur eine einzige zu lesen Zeichne keine vollständige Zeile.

Beachten Sie auch die Byte-Reihenfolge (Little oder Big Endian) beim Lesen einer Ganzzahl als die Datengröße zum Beispiel.

Ich bin sicher, es gibt mehr Dokumentation darüber, wie Java erwartet, dass Zeichenketten für eine Socket-Verbindung codiert werden, oder Sie müssen die rohen Bytes lesen und selbst in eine Java-Zeichenkette konvertieren.

0

Sie lesen gerade Linien, das heißt Zeichen von \n beendet Daten, \r oder \r\n, wie für BufferedReader.readLine() angegeben, aber was Sie senden ist nicht Linien, es nullterminierten C-Strings ist. Sie werden also überhaupt nichts erhalten, bis der Absender die Verbindung schließt, und dann erhalten Sie eine Zeichenfolge, die angibt, wer weiß, wo sich die Nullen befinden.

Das Ergebnis von send() wird ebenfalls nicht überprüft.

Verwandte Themen