使用fmt.Fprintf()发送text / plain

时间:2017-05-01 01:19:56

标签: html sockets http go

我遇到了fmt.Printf(字符串)

的一个相当奇怪(希望很容易修复)的问题

我有一个GO应用程序,它使用net.Listener()来侦听端口8080上的连接。

使用网络浏览器,我连接到服务器。当服务器收到连接时,它接受并响应以下代码(我已经删除了错误处理)

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))

我的终端打印出来(标题+正文)并按照我想要的方式显示内容。首先是标题,然后是\ r \ n,然后是HTML内容。但是,我的网络浏览器只显示:

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

我的终端显示全部5行(浏览器显示4),第4行缺少最后一个字符。我需要设置某种形式的缓冲区吗?

最后,这是一项学校作业,我们被告知不要使用图书馆来做到这一点(例如HTTP GO图书馆)。

感谢您的帮助。

编辑:整个功能现已发布。请注意,最后两行打印相同的内容。控制台完全按照我的意图显示文本。对客户端的打印会打破一定量的字节。即使我做了一个大线,它仍然会在某个时刻停止打印。

编辑2:我添加了一行读取文件。我的浏览器很好地读取了该文件,但我遇到了同样的问题。内容被切断了。

2 个答案:

答案 0 :(得分:0)

尝试在发送其他回复之前将其发送到浏览器:

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

答案 1 :(得分:0)

我很尴尬。

答案是我宣布内容长度为70 。将长度增加到 300 会立即给出我需要的结果。

我将在这里留下这篇文章,以帮助其他任何可能在同一条船上的新人。