2017-06-07 3 views
-1

Ich versuche, einen Mikro-Benchmark für TCP-Socket-Kommunikation durch eine Schleife eines Sendens und Empfangen von Nachrichten zu implementieren. Allerdings habe ich eine hohe Latenz im Vergleich zur Standardlatenz des TCP-Sockets in einigen Diagrammen. Wie kann ich meinen Code verbessern?Wie verbessert man diese tcp-Socket-Kommunikation?

Server Side

DataOutputStream output = new DataOutputStream(this.clientSocket.getOutputStream()); 
    DataInputStream input = new DataInputStream(this.clientSocket.getInputStream()); 
    int j = 0; 
    while (j < loop) { 
     output.write(bytes); 
     input.read(new byte[input.readInt()]);    
     j++; 
    } 

Client Side

DataOutputStream output = new DataOutputStream(socket.getOutputStream()); 
    DataInputStream input = new DataInputStream(socket.getInputStream()); 
    final long startTime = System.nanoTime(); 
    int j = 0; 
    while (j < loop) { 
     input.read(new byte[input.readInt()]); 
     output.write(bytes); 
    j++;  
    } 

    final long endTime = System.nanoTime(); 
    final double difference = (endTime - startTime)/1e6; 
    LOGGER.info("Latency:"+ difference/loop); 
+0

Beachten dass die Genauigkeit von System.nanoTime() und System.currentTimeMillis() systemabhängig ist und m Sie sind nicht genau genug für Ihren Anwendungsfall. –

+0

Standardlatenz? Die Latenzzeit hängt von der Netzwerküberlastung ab, die Sie im Internet nicht kontrollieren können. Sollten Sie die readFully-Methode nicht verwenden? read() kann und wird weniger Bytes zurückgeben als angefordert werden. Was ist "Bytes"? Wie definieren Sie Latenz? –

Antwort

1

Ihr Code ist nicht einmal richtig, so bisher die Ergebnisse sind bedeutungslos. Möglicherweise stecken Ihre Absender fest, weil das Anwendungsprotokoll nicht korrekt implementiert ist.

  • Nirgends schreiben Sie eigentlich eine int, doch beide Seiten:

    1. lesen ein int und
    2. annehmen, dass es eine Länge Wort für die folgende Meldung, die sie dann
    3. können nicht vollständig lesen, weil sie das Ergebnis von read() ignorieren.

    Eine korrekte Version der gleichen Sache muss mit jemandem beginnen, scheinbar dem Server, die anfänglichen int zu schreiben.

  • Sie verwenden auch ungepufferte E/A, was in den Fällen readInt() und writeInt() ziemlich teuer ist.

  • Sie schaffen auch Tonnen von Müll an beiden Enden unnötig.

Server:

DataOutputStream output = new DataOutputStream(ne w BufferedOutputStream(this.clientSocket.getOutputStream())); 
DataInputStream input = new DataInputStream(new ByufferedInputStream(this.clientSocket.getInputStream())); 
byte[] message - new byte[8192]; // or whatever 
int msgLen = message.length; 
while (j < loop) 
{ 
    output.writeInt(msgLen); 
    output.write(message); 
    output.flush(); 
    int replyLen = input.readInt(); 
    input.readFully(message, 0, replyLen); // assuming replyLen <= msgLen 
    j++; 
} 

Client (nach den Daten der Konstruktion auf die gleiche Weise Ströme und unter Verwendung derselben message und msgLen Variablen:

while (j < loop) { 
    mgLen = input.readInt(); 
    input.readFully(message, 0, msgLen); // same assumption as above 
    output.writeInt(msgLen); 
    output.write(message, 0, msgLen); 
    output.flush(); 
    j++;  
} 

E & OE

Verwandte Themen