简单的 Web 服务器实现:GoLang

我正在尝试使用 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

我错过了什么吗?我犯了什么错误吗?


慕容森
浏览 154回答 1
1回答

牛魔王的故事

只是在这里添加一些信息.. 那不是您正在编写的简单服务器。您正在尝试编写一个没有net/http包的 HTTP 服务器。这是不平凡的。也许你想要一个回声服务器?您的浏览器需要格式正确的 HTTP 响应。这意味着您不能只是向连接写入一个随机字符串并期望它知道如何处理它。这是HTTP 协议描述的维基百科(我不打算在 SO 答案中描述整个协议)。如果你只想要一个应该有效的简单答案:HTTP/1.1 200 OKContent-Type: text/plain; charset=UTF-8;Content-Length: LENGTH OF BODY HEREBODY请注意,标头由 分隔,\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。我猜只是为您的知识添加了一些约定。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go