2017-05-01 2 views
-1

ich in ein etwas seltsames (hoffentlich leicht reparierbar) Problem mit fmt.Printf (string)Send text/plain mit fmt.Fprintf()

Ich habe eine GO Anwendung leite die net.Listener() verwendet, um lausche auf Verbindungen an Port 8080.

Mit einem Webbrowser verbinde ich mich mit dem Server. Wenn der Server eine Verbindung empfängt, akzeptiert sie und antwortet mit dem folgenden Code (ich die Fehlerbehandlung entfernt)

func main() { 
    socket, _ := net.Listen("tcp", ":8080") 

    for { 
    connection, _ := socket.Accept() 
    go handleClient(connection) 
    } 
}  


// Function called as a go routine by main after accepting a connection 
func handleClient(c net.Conn) { 
    defer c.Close() 

    r := bufio.NewReader(c) 
    for { 
     // Read each header line individually 
     req, err := r.ReadString('\n') 
     if err != nil && err != io.EOF { 
     // Call function that prints the error to the console 
     checkError(err) 
     } 

     // Show request headers in terminal 
     fmt.Print(req) 

     // Stop reading request headers 
     if len(req) <= 2 { 
     break 
     } 
    } 

    // Create generic response headers - for testing only 
    var headers = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nContent-Length: 70\r\nConnection: keep-alive\r\n\r\n" 

    // Get current dir path 
    pwd, _ := os.Getwd() 

    // Read a file (content says "This is a test, five times" 
    body, err := ioutil.ReadFile(pwd + "/test.txt") 
    if err != nil { 
     checkError(err) 
    } 

    // Print to terminal 
    fmt.Println(headers + string(body)) 

    // Send to client 
    fmt.Fprintf(c, headers + string(body)) 

Mein Terminal druckt (Header + Körper) und zeigt den Inhalt genau so, wie ich es will. Die Header zuerst, gefolgt von \ r \ n und dann der HTML-Inhalt. Allerdings nur mein Web-Browser zeigt:

1) This is a test 
2) This is a test 
3) This is a test 
4) This is a tes 

Mein Terminal zeigt alle 5 Zeilen (Browser zeigt 4) und die vierte Zeile fehlt sein letztes Zeichen. Gibt es eine Art von Puffer, den ich einstellen muss?

Schließlich ist dies eine Schulaufgabe, und es wird uns gesagt, dass wir keine Bibliotheken verwenden sollten, die das leichter machen (zB HTTP GO Libraries).

Danke für jede Hilfe.

EDIT: Die gesamte Funktion wurde jetzt gepostet. Beachten Sie, dass die letzten beiden Zeilen dasselbe ausgeben. Die Konsole zeigt den Text genau so, wie ich es vorhabe. Der Druck zum Client bricht eine bestimmte Anzahl von Bytes. Selbst wenn ich eine große Linie mache, hört es irgendwann auf zu drucken.

EDIT 2: Ich habe eine Zeile hinzugefügt, die eine Datei liest. Die Datei wird von meinem Browser gelesen, aber ich habe das gleiche Problem. Der Inhalt ist abgeschnitten.

+4

Zeigen Sie den Wert von 'headers' an. Außerdem verwenden Sie die Header + Körper als Formatzeichenfolge. Geben Sie einen Format-String wie folgt ein: 'fmt.Fprintf (c,"% s ", Header + String (Körper))' oder rufen Sie c.Write direkt auf. –

+4

Sie sollten ein vollständiges Beispiel schreiben ([mcve]); Der Fehler scheint nicht in dem Code angezeigt zu werden. – Carpetsmoker

+0

@ CeriseLimón Ich werde das versuchen. –

Antwort

0

Versuchen Sie, diese an den Browser zu senden, bevor Sie die andere Antwort senden:

fmt.Fprintf(c, "HTTP/1.0 200 OK\r\n") 
fmt.Fprintf(c, "Content-Type: text/plain\r\n") 
fmt.Fprintf(c, "\r\n") 
+0

md2perpe, ich glaube meine Header werden korrekt als eine Zeile gesendet. Der Browser zeigt den HTML- oder reinen Textinhalt an, nur nicht alles. Als ob die Verbindung vor dem Beenden von Fprintf() geschlossen wird. –

0

Ich bin so peinlich.

Die Antwort ist, dass ich die Inhaltslänge zu 70 erklärt habe. Erhöhung der Länge auf gab mir sofort das Ergebnis, das ich brauchte.

Ich werde diesen Beitrag hier verlassen, um anderen Newcomern zu helfen, die im selben Boot sein können.