我正在尝试使用Go实现一个简单的Web服务器。我希望客户端浏览器上的“Hello World”显示在URL“http://127.0.0.1.12000/”。
我尝试了以下代码,但最终出现了错误。
package main
import "net"
import "fmt"
import "bufio"
// import "strings"
// only needed below for sample processing
func main() {
fmt.Println("Launching server...")
// listen on all interfaces
ln, err := net.Listen("tcp", ":12000")
if err != nil {
fmt.Println("Launching error1...")
return
}
// run loop forever (or until ctrl-c)
for {
// accept connection on port
conn, err := ln.Accept()
if err != nil {
fmt.Println("Launching error2...")
return
}
// will listen for message to process ending in newline (\n)
message, err := bufio.NewReader(conn).ReadString('\n')
if err != nil {
fmt.Println("Launching error3...")
newmessage := "Hello World!"
conn.Write([]byte(newmessage + "\n"))
return
}
// output message received
fmt.Print("Message Received:", string(message))
// sample process for string received
newmessage := "Hello World!"
conn.Write([]byte(newmessage + "\n"))
}
}
当我尝试执行代码时,命令行显示以下内容,但浏览器上没有输出..
Launching server...
Message Received:GET / HTTP/1.1
Message Received:GET / HTTP/1.1
我错过了什么吗?我犯了什么错误吗?
答案 0 :(得分:1)
只是在这里添加一些信息..那不是一个你正在编写的简单服务器。您正在尝试编写没有net/http
包的HTTP服务器。这非常重要。也许你想要一个echo服务器?
您的浏览器需要格式正确的HTTP响应。这意味着您不能只为连接写一个随机字符串,并希望它知道如何处理它。这是HTTP协议描述的wikipedia(我不打算在SO回答中描述整个协议)。
如果您只想要一个应该有效的简单答案:
HTTP/1.1 200 OK
Content-Type: text/plain; charset=UTF-8;
Content-Length: LENGTH OF BODY HERE
BODY
请注意,标题由\r\n
分隔,最后一个标题后跟两个:\r\n\r\n
。
所以这个:
conn.Write([]byte("HTTP/1.1 200 OK\r\n"))
conn.Write([]byte("Content-Type: text/plain; charset=UTF-8\r\n"))
newmessage := "Hello World!"
conn.Write([]byte("Content-Length: " + strconv.Itoa(len(newmessage)) + "\r\n\r\n"))
conn.Write([]byte(newmessage + "\n"))
另外,我想因为这是一个协议问题,我也可以告诉你,典型的HTTP端口是80,替代/测试的是8080.我想,只是为你的知识增加了一些约定。