2009-04-23 3 views
1

Ich habe eine Socket-Programmierung für die Server-Client-Kommunikation erstellt. Ich lese Daten unter Verwendung read(byte[]) von DataInputStream, auch Schreiben von Daten mit write(byte[]) von DataOutputStream.lesen und schreiben Methode für große Daten in Socket-Kommunikation funktioniert nicht zuverlässig

Wenn ich eine kleine Menge von Daten sende, funktioniert mein Programm gut. Aber wenn ich eine Daten von 20000 Zeichen sende und es 10 mal sende, dann bin ich in der Lage, die Daten 8 mal perfekt zu empfangen, aber nicht 2 mal.

Kann ich also zuverlässig Daten senden und empfangen, indem ich die Socket-Programmierung lese und schreibe?

Antwort

7

Meine Vermutung ist, dass Sie einen einzigen Anruf an read() absetzen und davon ausgehen, dass es alle angeforderten Daten zurückgeben wird. Streams funktionieren im Allgemeinen nicht so. Es wird blockiert, bis einige Daten verfügbar sind, aber es wird nicht warten, bis es genug Daten hat, um das Array zu füllen.

Im Allgemeinen bedeutet dies, dass die Schleife durchlaufen wird. Zum Beispiel:

byte[] data = new byte[expectedSize]; 
int totalRead = 0; 
while (totalRead < expectedSize) 
{ 
    int read = stream.read(data, totalRead, expectedSize-totalRead); 
    if (read == -1) 
    { 
     throw new IOException("Not enough data in stream"); 
    } 
    totalRead += read; 
} 

Wenn Sie nicht wissen, wie viele Bytes Sie in erster Linie erwarten, aktualisieren können Sie auch noch Schleife rund, aber diesmal bis read() -1 zurück. Verwenden Sie einen Puffer (z. B. 8K) zum Einlesen und Schreiben in eine ByteArrayOutputStream. Wenn Sie mit dem Lesen fertig sind, können Sie die Daten aus dem ByteArrayOutputStream als Byte-Array abrufen.

1

Absolut - TCP Sockets ist ein zuverlässiges Netzwerkprotokoll, vorausgesetzt die API wird ordnungsgemäß verwendet.

Sie müssen wirklich die Anzahl der Bytes überprüfen, die Sie bei jedem Aufruf von read() erhalten.

Sockets werden arbiterisch entscheiden, Sie haben genug Daten und übergeben sie zurück auf den gelesenen Anruf - die Menge kann von vielen Faktoren abhängen (Puffergröße, Speicherverfügbarkeit, Netzwerkzeit usw.), von denen die meisten nicht vorhersehbar sind. Bei kleineren Puffern erhalten Sie normalerweise so viele Bytes, wie Sie möchten, aber bei größeren Puffergrößen liefert read() oft weniger Daten als gewünscht - Sie müssen die Anzahl der gelesenen Bytes überprüfen und den Leseaufruf für die verbleibende Bytes.

Es ist auch möglich, dass etwas in Ihrer Netzwerkinfrastruktur (Router, Firewall usw.) falsch konfiguriert ist und große Pakete truiert.

0

Ihr Problem ist, dass in der Server-Thread, Sie rufen outputstream.flush müssen(), um anzugeben, dass die gepufferten Daten sollten

+0

I flush() verwendet haben, um das andere Ende der Mitteilung gesendet. Aber es hat nicht gut funktioniert, aber wenn ich mal dalay mache, dann funktioniert es. – Deepak

+0

Also wie kann ich eine große Datei über tcp Java senden – Deepak

Verwandte Themen