我遇到了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:我添加了一行读取文件。我的浏览器很好地读取了该文件,但我遇到了同样的问题。内容被切断了。
答案 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 会立即给出我需要的结果。
我将在这里留下这篇文章,以帮助其他任何可能在同一条船上的新人。