2016-10-14 5 views
0

Hallo lass mich direkt auf das Problem kommen. Ich habe ein großes JSON-Paket, das der Server an diesem Client sendet, sobald der ClientJava tcp Socket wird nicht richtig empfangen

authentifiziert

Aber das Paket kommt in eine seltsame Art und Weise zurück, wie es Split- oder etwas Beispiel ist:

Die JSON sollte sein:

Received: {"UserID":1,"PlayerID":2,"EXP":0,"Lvl":1,"Coins":0,"ItemSlots":30} 

wenn es darum geht, durch:

Received: {"UserID":1,"PlayerID":2,"EXP":0,"Lvl":1,"Coins":0, 
Received: "ItemSlots":30} 

Warum er das Paket oder etwas gespalten, wenn es um den Client kommt und wie kann ich dieses Problem beheben sowieso?

Java Erhalten Code:

private class ClientThread extends Thread { 
     public void run() { 
      try { 
       while (selector.select() > 0) { 
        for (SelectionKey sk : selector.selectedKeys()) { 

         selector.selectedKeys().remove(sk); 
         if (sk.isReadable()) { 

          SocketChannel sc = (SocketChannel)sk.channel(); 
          ByteBuffer buff = ByteBuffer.allocate(1024); 
          String content = ""; 

          while (sc.read(buff) > 0) { 
           sc.read(buff); 
           buff.flip(); 
           content += charset.decode(buff); 
           buff.clear(); 
          } 

          System.out.println("Recieved: " + content); 
          sk.interestOps(SelectionKey.OP_READ); 
         } 
        } 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

Dank einen wundervollen Tag.

+0

Versuchen Sie, die ByteBuffer-Größe auf 2048 zu erhöhen. –

+0

Ich habe versucht, es funktioniert, aber nicht für große Pakete ich denke, eine Art von Code muss für größere Pakete getan werden. – Premt

+0

Versuchen Sie Folgendes: ByteBuffer.allocate (2048); in Ihrem Code –

Antwort

1

Hallo Lemme gerade auf das Problem bekommen, so habe ich ein großes JSON-Paket, das der Server an dieses Client sendet, sobald der Client

authentifizierte

Sie meinen, Sie haben eine große JSON Nachricht. Pakete sind Dinge, die Netzwerkprotokolle zum Austausch von Informationen verwenden.

Aber das Paket kommt zurück in eine seltsame Art und Weise, wie seine Spaltung oder etwas Beispiel:

Es sei denn, Sie auf dem Draht freuen, Sie sind nicht auf Pakete suchen. Sie sehen sich die Bytes an, die Sie von Ihrem Ende der TCP-Verbindung erhalten haben.

Die JSON sollte sein:

Recieved: { "UserID": 1 "PlayerID": 2, "EXP" 0 "Lvl": 1 "Münzen": 0, "ItemSlots ": 30}

Wenn es darum geht, durch:

Recieved: {" UserID ": 1", PlayerID ": 2," EXP "0" Lvl ": 1" Münzen ": 0, Empfangen: "ItemSlots": 30}

Ausgezeichnet. Du hast die gleichen Bytes. Machen Sie nun einen JSON-Parser, der herausfindet, wo die Nachricht endet und analysiert.

Warum tut er das Paket oder etwas gespalten, wenn es um die Kunden kommt

Es teilt die Nachricht in Pakete, weil das ist, wie TCP die Nachricht an der anderen Seite bekommt. TCP ist kein Nachrichtenprotokoll und es weiß nicht, was die Anwendung als eine Nachricht betrachtet - das ist die Aufgabe der Anwendung.

und wie kann ich das trotzdem beheben?

Schreiben Sie einen JSON-Parser, um herauszufinden, wo die Nachrichten enden. Sie haben noch keinen Code implementiert, um JSON über TCP zu empfangen, so dass dies erst möglich ist.

TL; DR: Wenn Sie ein Nachrichtenprotokoll auf Anwendungsebene benötigen, müssen Sie eines implementieren. TCP ist keiner.

1

Das TCP-Protokoll verwaltet keine Nachrichtengrenzen. Es ist nicht garantiert, dass das, was der Server sendet, unverändert vom Client empfangen wird und umgekehrt.

Wenn der Server 1000 Byte Daten sendet, kann die Clientanwendung dieselbe über mehrere recv oder einzelne recv empfangen. TCP garantiert kein Verhalten. "Split" kann passieren, es ist die Aufgabe der Anwendung, die Daten, die in mehreren Blöcken kommen, zu behandeln, um sie zu einer Einheit von Anwendungsdaten für die weitere Verarbeitung zusammenzufassen. Das sieht man besonders bei großen Datenmengen.

1

Es sieht so aus, als ob Sie einen nicht blockierenden Socket-Kanal haben, was bedeutet, dass die while (sc.read(buff) > 0) {-Schleife aufgrund von sc.read(buff) endet und 0 zurückgibt, da nur ein Teil der gesendeten Daten zu diesem Zeitpunkt empfangen wurde.

Warum tut er das Paket oder etwas gespalten, wenn es um die Kunden kommt

Wahrscheinlich die Daten in zwei oder mehr Pakete aufgeteilt werden.

und wie kann ich das trotzdem beheben?

halten Sie Ihre Puffer füllt, bis die Buchse vom Server geschlossen wird (read sollte -1 zurück, statt 0 in diesem Fall). Sie müssen einen separaten Puffer pro Kanal pflegen. Wenn der Server sein Ende nach dem Senden der Daten nicht schließt, müssen Sie auf eine andere Art und Weise definieren; Sie können dem JSON-Blob beispielsweise einen Größenheader voranstellen.