为了账号安全,请及时绑定邮箱和手机立即绑定

简单的 Web 服务器实现:GoLang

简单的 Web 服务器实现:GoLang

Go
慕容森 2021-11-15 20:49:00
我正在尝试使用 Go 实现一个简单的 Web 服务器。我希望“Hello World”显示在客户端浏览器的 URL“ http://127.0.0.1.12000/ ”上。我尝试了以下代码,但最终出现错误。package mainimport "net"import "fmt"import "bufio"// import "strings"// only needed below for sample processingfunc 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.1Message Received:GET / HTTP/1.1我错过了什么吗?我犯了什么错误吗?
查看完整描述

1 回答

?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

只是在这里添加一些信息.. 那不是您正在编写的简单服务器。您正在尝试编写一个没有net/http包的 HTTP 服务器。这是不平凡的。也许你想要一个回声服务器?


您的浏览器需要格式正确的 HTTP 响应。这意味着您不能只是向连接写入一个随机字符串并期望它知道如何处理它。这是HTTP 协议描述的维基百科(我不打算在 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。我猜只是为您的知识添加了一些约定。


查看完整回答
反对 回复 2021-11-15
  • 1 回答
  • 0 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信