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.
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. –
Sie sollten ein vollständiges Beispiel schreiben ([mcve]); Der Fehler scheint nicht in dem Code angezeigt zu werden. – Carpetsmoker
@ CeriseLimón Ich werde das versuchen. –